Πίνακας περιεχομένων:

Reckless Racer Arduino OLED Game, AdafruitGFX και Bitmaps Basics: 6 βήματα
Reckless Racer Arduino OLED Game, AdafruitGFX και Bitmaps Basics: 6 βήματα

Βίντεο: Reckless Racer Arduino OLED Game, AdafruitGFX και Bitmaps Basics: 6 βήματα

Βίντεο: Reckless Racer Arduino OLED Game, AdafruitGFX και Bitmaps Basics: 6 βήματα
Βίντεο: Arduino Star Wars Game - how to make 2024, Ενδέχεται
Anonim
Reckless Racer Arduino OLED Game, AdafruitGFX και Bitmaps Basics
Reckless Racer Arduino OLED Game, AdafruitGFX και Bitmaps Basics
Reckless Racer Arduino OLED Game, AdafruitGFX και Bitmaps Basics
Reckless Racer Arduino OLED Game, AdafruitGFX και Bitmaps Basics

Σε αυτό το σεμινάριο θα εξετάσουμε τον τρόπο χρήσης bitmaps χρησιμοποιώντας τη βιβλιοθήκη Adafruit_GFX.c ως είδος sprit σε ένα παιχνίδι. Το πιο απλό παιχνίδι που θα μπορούσαμε να σκεφτούμε είναι ένα παιχνίδι αλλαγής αυτοκινήτου με πλάγια κύλιση, στο τέλος ο δοκιμαστής beta και ο βοηθός κωδικοποιητής μας αποφάσισαν ως "Reckless Racer", καθώς είναι αρκετά απερίσκεπτο να οδηγεί λάθος στον αυτοκινητόδρομο !!.

Ο σχεδιασμός του κυκλώματός μας είναι στις εικόνες που περιλαμβάνονται παραπάνω και περιγράφεται λεπτομερώς στο τελευταίο μας έργο/σεμινάριο εδώ Snake Instructables που περιγράφει πώς λειτουργεί το κύκλωμα.

θα απαιτήσουμε

Adafruit_GFX

Paint.net

Arduino IDE windowslinux

και παρακαλώ ρίξτε μια ματιά στο φροντιστήριο φιδιού για τον υπόλοιπο εξοπλισμό.

Προμήθειες

Παιχνίδι με φίδια

Βήμα 1: Εγκατάσταση του Paint.net

Εγκατάσταση του Paint.net
Εγκατάσταση του Paint.net
Εγκατάσταση του Paint.net
Εγκατάσταση του Paint.net
Εγκατάσταση του Paint.net
Εγκατάσταση του Paint.net

Χρησιμοποιούμε το paint.net καθώς το λογισμικό είναι δωρεάν, οπότε εντελώς δωρεάν για χρήση μπορείτε να κατεβάσετε το Paint. Net εδώ.

Για να εγκαταστήσετε το paint.net κάντε διπλό κλικ στο πρόγραμμα που έχετε κατεβάσει και απαντήστε θετικά, στη συνέχεια, ναι, εντάξει, συμφωνώ και οι παραπάνω εικόνες θα σας δώσουν οδηγίες.

Βήμα 2: Σχεδίαση μιας απλής οθόνης εκτόξευσης

Σχεδίαση μιας απλής οθόνης εκτόξευσης
Σχεδίαση μιας απλής οθόνης εκτόξευσης
Σχεδίαση μιας απλής οθόνης εκτόξευσης
Σχεδίαση μιας απλής οθόνης εκτόξευσης
Σχεδίαση μιας απλής οθόνης εκτόξευσης
Σχεδίαση μιας απλής οθόνης εκτόξευσης

Όταν βρίσκεστε στο paint.net, δημιουργήστε μια νέα εικόνα κάνοντας κλικ στο Αρχείο και στη συνέχεια στη νέα, ορίστε το μέγεθος της εικόνας σε 1260x620 (δείτε την πρώτη εικόνα) κάντε κλικ στο κουμπί ΟΚ όταν έχετε τη νέα σας σελίδα σχεδιάστε μια οθόνη εκτόξευσης χρησιμοποιώντας μόνο 2 χρώματα ασπρόμαυρο χρησιμοποιώντας το μολύβι εργαλείο (εικόνα 2), όταν σχεδιάσετε (ή επικολλήσετε) την εικόνα της οθόνης splash, κάντε κλικ στην εικόνα και, στη συνέχεια, αλλάξτε το μέγεθος (εικόνα4), στο αναδυόμενο παράθυρο αλλάξτε το μέγεθος από 1260x620 σε 126x62 (2 pixel μικρότερο από την οθόνη σας) (pic5) Κάντε κλικ στο OK.

επόμενο κλικ στο μενού Αρχείο και στη συνέχεια αποθήκευση ως (pic6).

όταν εμφανιστεί το αναδυόμενο παράθυρο στον τύπο αρχείου, επιλέξτε BMP (bitmap). (εικόνα 7), πληκτρολογήστε ένα όνομα αρχείου και κάντε κλικ στο κουμπί αποθήκευση, όταν εμφανιστεί το αναδυόμενο παράθυρο που έχει ρυθμιστεί ως 0 και ρυθμισμένο σε 8 bit, κάντε κλικ στο κουμπί ok (pic8).

Βήμα 3: Μετατροπή BMP σε αρχείο Bitmap C

Μετατροπή BMP σε αρχείο Bitmap C
Μετατροπή BMP σε αρχείο Bitmap C
Μετατροπή BMP σε αρχείο Bitmap C
Μετατροπή BMP σε αρχείο Bitmap C
Μετατροπή BMP σε αρχείο Bitmap C
Μετατροπή BMP σε αρχείο Bitmap C
Μετατροπή BMP σε αρχείο Bitmap C
Μετατροπή BMP σε αρχείο Bitmap C

Τώρα πρέπει να μετατρέψουμε την εικόνα μας σε μια μορφή που μπορεί να καταλάβει το arduino, υπάρχουν πολλά διαθέσιμα εργαλεία για να το κάνουμε αυτό, αλλά το "go to" τοποθετώ το εργαλείο μετατροπής bitmap ιστότοπων marlin webs…

marlinfw.org/tools/u8glib/converter.html

Ξεκινάμε λοιπόν αυτήν την ενότητα χρησιμοποιώντας τον παραπάνω σύνδεσμο για να ανοίξουμε τον ιστότοπο που φαίνεται στην εικόνα 1

κάντε κλικ στην επιλογή αρχείου και επιλέξτε το bitmap που δημιουργήσατε νωρίτερα (pic2)

Ο μετατροπέας bitmap marlin θα μετατρέψει αυτόματα την εικόνα σας σε κώδικα c αριστερό διπλό κλικ στον κώδικα ο οποίος θα πρέπει να επισημάνει τον κώδικα, στη συνέχεια δεξί κλικ και κλικ αντιγραφή (pic3)

επόμενο Δημιουργούμε δεξί κλικ και δημιουργούμε ένα νέο έγγραφο κειμένου (εικόνα 4)

διπλό κλικ στο νέο έγγραφο, όταν ανοίξει δεξί κλικ και επικόλληση του κώδικα (pic5)

Στη συνέχεια πρέπει να προσθέσουμε τη γραμμή κοντά στην κορυφή του κώδικα #συμπεριλάβετε αυτό μας επιτρέπει να αποθηκεύσουμε τα δεδομένα bitmap στη μνήμη flash στο arduino, στη συνέχεια μετονομάζουμε το #define πλάτος, ύψος και όνομα σε κάτι πιο εύκολο στη χρήση. στην εικόνα 6, τα μετονομάζουμε από τους τυχαίους χαρακτήρες που δημιουργούμε τους μετονομάζουμε στο υπογραμμισμένο παράδειγμα παρακάτω

#define LOGOWIDTH

#define LOGOHEIGHT

const unsigned char LOGOPIC PROGMEM

επόμενο κλικ στο αρχείο και στη συνέχεια αποθήκευση ως, αποθηκεύστε το αρχείο ως logo.c κλείστε το σημειωματάριο, κάντε δεξί κλικ στο logo.c και κάντε κλικ στο αντίγραφο.

Βήμα 4: Εμφάνιση LOGO χρησιμοποιώντας το DrawBitmap

Εμφάνιση LOGO χρησιμοποιώντας το DrawBitmap
Εμφάνιση LOGO χρησιμοποιώντας το DrawBitmap
Εμφάνιση LOGO χρησιμοποιώντας το DrawBitmap
Εμφάνιση LOGO χρησιμοποιώντας το DrawBitmap
Εμφάνιση LOGO χρησιμοποιώντας το DrawBitmap
Εμφάνιση LOGO χρησιμοποιώντας το DrawBitmap
Εμφάνιση LOGO χρησιμοποιώντας το DrawBitmap
Εμφάνιση LOGO χρησιμοποιώντας το DrawBitmap

Τώρα φορτώνουμε το arduino IDE και δημιουργούμε νέο σκίτσο και το αποθηκεύουμε με το όνομα logoexample.ino, στη συνέχεια ως απάτη στο arduino ide κάντε κλικ στο μενού αρχείων και μετά αποθηκεύστε ως, επιστρέψτε στο φάκελο έργου δεξί κλικ και επικολλήστε στο αρχείο.c (pic2) και στη συνέχεια κάντε κλικ στο κουμπί ακύρωση, αυτό σας εξοικονομεί την ανάγκη να περιηγηθείτε στο φάκελο για επικόλληση στο αρχείο.

πληκτρολογήστε τον ακόλουθο κώδικα στο arduino IDE ή κάντε λήψη στο ino.

(συνιστούμε να πληκτρολογείτε αντί να αντιγράφετε και να επικολλάτε ή να χρησιμοποιείτε τα παρακάτω αρχεία είναι ο καλύτερος τρόπος για να μάθετε)

#include /* αυτό θα διαφέρει ανάλογα με το πού αποθηκεύετε

το ino συνήθως στο φάκελο C: / Users / ername username / Documents / Arduino / project ~ όνομα

και με αυτόν τον τρόπο συνδέουμε το bitmap μας */

#περιλαμβάνω

#περιλαμβάνω

uint8_t bmpX, bmpY = 0; /* αποθήκευση μνήμης για ακέραιους 2 X 8 bit, χρειαζόμαστε μόνο int 8 bit

καθώς η τιμή δεν είναι ποτέ μεγαλύτερη από 128 (εικονοστοιχεία), έτσι μπορούμε να εξοικονομήσουμε χώρο χρησιμοποιώντας int 8 bit (που έχει μέγιστη τιμή 255) */

void setup ()

{καθυστέρηση (100); // δώστε χρόνο στην οθόνη κ.λπ. // αυτό είναι για να αρχικοποιήσει την οθόνη display.clearDisplay (); // ξεκινήστε με μια κενή οθόνη}

/* Σημειώστε ότι δεν χρειάζεται να πληκτρολογήσετε αυτά τα σχόλια, για λόγους αναφοράς …………..

η εντολή στην οποία θα επικεντρωθούμε είναι το display.drawBitmap, αυτό είναι που τραβάει την splash οθόνη μας. (bmpX, είναι η τιμή του άξονα X στην οθόνη όπου θα είναι το σημείο αγκύρωσης Χ του bitmap και bmpX και bmpY είναι οι τιμές που μας ενδιαφέρουν να δημιουργήσουμε κίνηση (bmpY, είναι η τιμή του άξονα Y στην οθόνη όπου η άγκυρα Y το σημείο του bitmap θα είναι να πάρουμε τα ονόματα αναφοράς όπως τα ορίσαμε στο logo.c (LOGOPIC, είναι το όνομα του bitmap στο #included file logo.c (LOGOWIDTH, είναι πόσα εικονοστοιχεία (X) για να σχεδιάσετε το bitmap από το σημείο αγκύρωσης (LOGOHEIGHT, είναι πόσα εικονοστοιχεία προς τα κάτω (Y) για να αντλήσετε τον bitmap από το σημείο αγκύρωσης, τα εικονοστοιχεία X και Y διασταυρώνονται με μη αυτόματο τρόπο, αλλά είναι ευκολότερο να χρησιμοποιήσετε αυτά που έχετε προκαθορίσει από ό, τι τα θυμάστε όλα (1, η τελευταία τιμή είναι το χρώμα καθώς η οθόνη είναι μονόχρωμη 0 μαύρο 1 λευκό. εντάξει ξεκινήστε να πληκτρολογείτε από την επόμενη γραμμή: ¬D lol*/ void loop () {display.clearDisplay (); // κενό της οθόνης // bitmap που αντλείται από το επάνω αριστερά, x, y, όνομα bitmap, πλάτος X, ύψος Y, έγχρωμη εμφάνιση.drawBitmap (bmpX, bmpY, LOGOPIC, LOGOWIDTH, LOGOHEIGHT, 1); display.display (); // Αυτό πραγματικά τραβά το buffer στην οθόνη πάντα}

ανεβάστε τον κωδικό σας arduino και επιβεβαιώστε ότι λειτουργεί (pic3).

Βήμα 5: Μετακίνηση Bitmap Sprite

Image
Image
Μετακίνηση Bitmap Sprite
Μετακίνηση Bitmap Sprite
Μετακίνηση Bitmap Sprite
Μετακίνηση Bitmap Sprite

χρησιμοποιώντας τις προηγούμενες οδηγίες, χρησιμοποιήστε το paint.net και δημιουργήστε ένα νέο αρχείο, φτιάξτε το 30x15 pixel (pic1) και σχεδιάστε ένα τραχύ αυτοκίνητο, ο νεαρός μας σχεδιαστής ξεκινά πρώτα με το παρμπρίζ (φωτογραφίες 2 & 3).

αποθηκεύστε το ξανά ως αρχείο Windows bmp (όπως στο βήμα 2), μετατρέψτε σε bitmap C (βήμα 3) και τοποθετήστε το αρχείο car.c (ή ό, τι αποφασίσετε) στον ίδιο φάκελο με ένα νεοδημιουργημένο arduino ino (σκίτσο) αρχείο.

(p.s. θυμηθείτε να προσθέσετε τη γραμμή #include στο car.c αυτό μας χρησιμοποιούσε συχνά)

Πρώτα συνδέστε το αντίστοιχο του αυτοκινήτου σας.γ

#περιλαμβάνω

#include #include Adafruit_GFX.h> // https://github.com/adafruit/Adafruit-GFX-Library #include Adafruit_SSD1306 //

Οθόνη Adafruit_SSD1306 (128, 64). // ρυθμίστε την ανάλυση της οθόνης

/* bmpX/bmpY χρειαζόμαστε αυτές να είναι μεταβλητές καθώς αλλάζουμε αυτές τις τιμές και επανασχεδιάζουμε

η οθόνη είναι πώς δημιουργούμε εφέ κίνησης κίνησης. hitSide και hitTop είναι το πώς διατηρούμε το sprite στην οθόνη */ uint8_t bmpX, bmpY = 0; // αποθήκευση μνήμης για 2 int 8 8 bit (0-255) που δεν χρειαζόμαστε μεγαλύτερο 128 θα είναι ο μεγαλύτερος αριθμός που θα χρησιμοποιηθεί bool hitSide = 0; bool hitTop = 0;

void setup ()

{καθυστέρηση (100); // δώστε χρόνο στην οθόνη κ.λπ. // αυτό είναι για να αρχικοποιήσει την οθόνη display.clearDisplay (); // ξεκινήστε με μια κενή οθόνη

}

κενός βρόχος ()

{display.clearDisplay (); // κενό της οθόνης // bitmap που έχει σχεδιαστεί από πάνω αριστερά, x, y, όνομα bitmap, πλάτος X, ύψος Y, έγχρωμη εμφάνιση. drawBitmap (bmpX, bmpY, CARSPRITE, CARWIDTH, CARHEIGHT, 1). // display.display (); // αυτό πραγματικά τραβάει το buffer στην οθόνη πάντα/ * με αυτόν τον τρόπο παρακολουθούμε την άκρη της οθόνης και αποφασίζουμε αν θα προσθέσουμε ένα pixel από πάνω προς τα κάτω) ή θα αφαιρέσουμε ένα pixel (μετακίνηση από κάτω προς τα πάνω) */ switch (hitSide) // αυτό επιλέγει την κατεύθυνση του αυτοκινήτου με βάση το μπουλόνι {case 0: bmpX ++; Διακοπή;

περίπτωση 1:

bmpX--; Διακοπή; } // αυτές οι 2 if δηλώσεις ορίζουν το bool σε true ή false εάν (bmpX == 0) {hitSide = 0; } if (bmpX == 96) // το πλάτος της οθόνης μείον το αυτοκίνητο {hitSide = 1; } // το ίδιο όπως παραπάνω για τον άξονα Υ εάν (bmpY == 0) {hitTop = 0; } if (bmpY == 49) // ύψος οθόνης μείον το ύψος του αυτοκινήτου {hitTop = 1; } switch (hitTop) {case 0: bmpY ++; Διακοπή; περίπτωση 1: bmpY--; Διακοπή; }

}

μπορείτε να δείτε το πρόγραμμα που λειτουργεί στο συνημμένο βίντεο

Βήμα 6: Κάνοντας το παιχνίδι οδήγησης

Image
Image

Αρχικά σχεδιάζουμε μερικά διαφορετικά αυτοκίνητα ή εμπόδια όπως στα προηγούμενα στάδια του σεμιναρίου κάνοντάς τα 30x15 pixel. Στη συνέχεια, τα μετατρέπουμε σε c bitmap και συνδέουμε τον κώδικα.

#include // αυτές οι διαδρομές θα πρέπει να αλλάξουν ανάλογα

// για το που αποθηκεύετε τα αρχεία // επεξεργασία: μόλις ανακάλυψα αν αντικαθιστάτε // με "" δεν απαιτείτε την πλήρη διαδρομή // με τις δικές σας βιβλιοθήκες #include

#περιλαμβάνω

#συμπεριλάβω #συμπεριλάβω

#περιλαμβάνω

#include // https://github.com/adafruit/Adafruit-GFX-Library #include <Adafruit_SSD1306 //

Οθόνη Adafruit_SSD1306 (128, 64). // καθορίστε τις παραμέτρους της οθόνης

καθορίζουν τις μεταβλητές και τις σταθερές τιμές

// καθορισμός ακίδων εισόδου Αυτές είναι οι ακίδες στο arduino που δεν αλλάζουν ποτέ, έτσι #define #define INTPIN 3 // μόνο οι ακίδες 2 και 3 μπορούν να διακοπούν ακίδες στο UNO #define UPPIN 4 // αυτές είναι ακίδες συνδεδεμένες tp σχετικός διακόπτης #define DWNPIN 5 #define LFTPIN 6 #define RHTPIN 7 #define SND 9 // καθορίστε οδηγίες

#define DIRUP 1 // αυτές οι τιμές είναι αυτό που κοιτάζει το "φίδι" για να αποφασίσει-

#define DIRDOWN 2 // η κατεύθυνση που θα ταξιδέψει το φίδι #define DIRLEFT 3 #define DIRRIGHT 4

uint8_t dirPressed = 0; // τιμή για να καταχωρήσετε την κατεύθυνση για να μετακινηθείτε στην οποία η καρφίτσα ανέβηκε ψηλά

// booleans store που η καρφίτσα ανέβηκε ψηλά

bool BUTUP = 0; bool BUTDWN = 0; bool BUTLFT = 0; bool BUTRHT = 0; // βάζα για τη θέση του αυτοκινήτου uint8_t carPosX = 1; uint8_t carPosY = {0, 16, 32, 48}; // χρειάζεται τιμή που αγγίζει τον πίνακα

uint8_t lanePosArr = {0, 16, 32, 48}; // συστοιχία για αποθήκευση όπου βρίσκεται κάθε λωρίδα

uint8_t carPosYCnt = 0; uint8_t carYTmp = 0; // μεταβλητές για τις γραμμές στο δρόμο uint8_t roadLineX1 = 51; // αυτά είναι προκαθορισμένα στην αρχή, τότε οι γραμμές εμφανίζονται απρόσκοπτα uint8_t roadLineX2 = 102. uint8_t roadLineX3 = 153; uint8_t roadLineX4 = 254; uint8_t roadLineX5 = 200;

// αυτό είναι το πόσα εικονοστοιχεία μετακινείται η περιοχή παιχνιδιού κάθε φορά

uint8_t drawSpeed = 4;

// vars για τον εχθρό0

uint8_t dijmin0PosX = 255; uint8_t dijmin0PosY = 0; uint8_t dijmin1PosX = 255; uint8_t dijmin1PosY = 0; uint8_t dijmin2PosX = 255; uint8_t dijmin2PosY = 0;

// μεταβλητή για τυχαία εκχώρηση αριθμού λωρίδας στα εμπόδια

uint8_t laneGen = 0;

uint8_t laneGen0 = 0; uint8_t laneGen1 = 0; uint8_t laneGen2 = 0;

// μετρητής βαθμολογίας

μεγάλη βαθμολογία = 0; // αυτό είναι το σκορ:/ lol long σύγκριση = 0; // αυτό αποθηκεύει τη βαθμολογία στο τελευταίο επίπεδο για να συγκριθεί με το υψηλό υψηλό σκορ = 25; uint8_t metreCnt = 0;

εδώ ξεκινάμε τις συναρτήσεις

// αυτό είναι το σύνολο εντολών εάν η διακοπή ενεργοποιηθεί void interruptressed () {delay (150); updateDirection (); } // ενημερώστε ποια τιμή είναι στην κατεύθυνση var ελέγχοντας τα DIR bools // -------------------------- UPDATE DIRECTION (player)- ------------------------- void updateDirection () {//Serial.println("updateDirection Called "); BUTUP = digitalRead (UPPIN); BUTDWN = digitalRead (DWNPIN); BUTLFT = digitalRead (LFTPIN); BUTRHT = digitalRead (RHTPIN); if (BUTUP == true) {dirPressed = DIRUP; } if (BUTDWN == true) {dirPressed = DIRDOWN; } if (BUTLFT == true) {dirPressed = DIRLEFT; } if (BUTRHT == true) {dirPressed = DIRRIGHT; }

}

// ----------------------------------- ΚΙΝΗΣΗ ΑΥΤΟΚΙΝΗΤΟΥ --------------- -------------------------

// αυτό θα ενημερώσει την οθόνη στον κινητήρα του αυτοκινήτου sprite

void moveCar ()

{switch (dirPressed) {case DIRUP: carPosYCnt--; carPosY [carPosYCnt]; τόνος (SND, 100, 100). εάν (carPosYCnt == 255) {carPosYCnt = 0; } carYTmp = carPosY [carPosYCnt]; dirPressed = 0; // Serial.println ("carPosY up"); // Serial.println (carPosYCnt); Διακοπή; θήκη DIRDOWN: carPosYCnt ++; τόνος (SND, 100, 100). εάν (carPosYCnt == 4) {carPosYCnt = 3; } // Serial.println ("carPosY"); // Serial.println (carPosYCnt); carYTmp = carPosY [carPosYCnt]; dirPressed = 0; Διακοπή; // σχολίασε αυτοκίνητο ικανό να μετακινεί την ανίχνευση σύγκρουσης αριστερά και δεξιά όχι τόσο καλό /* περίπτωση ΘΕΜΑ: carPosX--; αν (carPosX == 0) {carPosX = 1; } // Serial.println ("carPosX"); // Serial.println (carPosX); dirPressed = 0; Διακοπή; */ case DIRRIGHT: // μόνο για διασκέδαση αν πατήσετε δεξιά το παιχνίδι θα κάνει έναν ήχο θορύβου (SND, 100, 50). // carPosX ++; // if (carPosX == 128) // {// carPosX = 127; //} // Serial.println ("carPosX"); // Serial.println (carPosX); // dirPressed = 0; Διακοπή; } updateDisplay (); }

// -------------------------- RANDOM POS X ------------------- -----------

uint8_t randomPosX () // αυτές οι 2 ρουτίνες δημιουργούν απλώς τυχαία θέση για τα εμπόδια

{uint8_t posValTmp = 0; posValTmp = τυχαίο (129, 230); //Serial.println("andom x "); //Serial.println(posValTmp); επιστροφή (posValTmp)? }

// ---------------------------- ΤΥΧΕΙΑ POS Y ------------------ ------------------

uint8_t randomPosY ()

{uint8_t laneVal = 0; laneVal = τυχαίο (0, 4); // προσθέστε μια επιπλέον λωρίδα για τυχαιότητα δηλαδή κανένα αντικείμενο στην οθόνη ενώ βρίσκεστε σε αυτήν τη λωρίδα //Serial.println("RandomY "). //Serial.println(lanePosArr [laneVal]); επιστροφή (lanePosArr [laneVal]); }// ------------------------------- ΡΥΘΜΙΣΗ ΤΑΧΥΤΗΤΑΣ ΠΑΙΧΝΙΔΙΟΥ -------------- -------------- void setGameSpeed () // αυτό σταματά το επίπεδο να ανεβαίνει πάνω από 20 καθιστώντας το παιχνίδι μη αναπαραγωγικό {εάν (drawSpeed <21) {drawSpeed = drawSpeed+2; }}// -------------------------------- ----------------------- void deteCrash () {

εάν (dijmin0PosX = 0 && dijmin0PosY == carYTmp)

{// Serial.println ("Game Over CRAASSSSHHHHHHEEEDDD in Traffic 0"); τέλος παιχνιδιού(); } if (dijmin1PosX = 0 && dijmin1PosY == carYTmp) {//Serial.println("Game Over CRAASSSSHHHHHHEEEEDDD στην κυκλοφορία 1 "); τέλος παιχνιδιού(); } if (dijmin2PosX = 0 && dijmin2PosY == carYTmp) {//Serial.println("Game Over CRAASSSSHHHHHHEEEEDDD στην κυκλοφορία 2 "); τέλος παιχνιδιού(); }}

Αυτές είναι οι ρουτίνες που σχεδιάζουν την οθόνη.

// ----------------------------------- DRAW ROAD --------------- --------------------- void drawRoad () // X, Y, μήκος, πλάτος {display.fillRect (roadLineX1, 15, 30, 4, ΛΕΥΚΟ); display.fillRect (roadLineX1, 30, 30, 4, ΛΕΥΚΟ); display.fillRect (roadLineX1, 45, 30, 4, ΛΕΥΚΟ); display.fillRect (roadLineX2, 15, 30, 4, ΛΕΥΚΟ); display.fillRect (roadLineX2, 30, 30, 4, ΛΕΥΚΟ); display.fillRect (roadLineX2, 45, 30, 4, ΛΕΥΚΟ); display.fillRect (roadLineX3, 15, 30, 4, ΛΕΥΚΟ); display.fillRect (roadLineX3, 30, 30, 4, ΛΕΥΚΟ); display.fillRect (roadLineX3, 45, 30, 4, ΛΕΥΚΟ); display.fillRect (roadLineX4, 15, 30, 4, ΛΕΥΚΟ); display.fillRect (roadLineX4, 30, 30, 4, ΛΕΥΚΟ); display.fillRect (roadLineX4, 45, 30, 4, ΛΕΥΚΟ); display.fillRect (roadLineX5, 15, 30, 4, ΛΕΥΚΟ); display.fillRect (roadLineX5, 30, 30, 4, ΛΕΥΚΟ); display.fillRect (roadLineX5, 45, 30, 4, ΛΕΥΚΟ);

roadLineX1 = roadLineX1-drawSpeed;

roadLineX2 = roadLineX2-drawSpeed; roadLineX3 = roadLineX3-drawSpeed; roadLineX4 = roadLineX4-drawSpeed; roadLineX5 = roadLineX5-drawSpeed; display.display (); } // --------------------------------------------- ΣΧΕΔΙΑΣΤΕ εχθρούς ---- ------------------------------------------- void enemysDraw () {// X, Y, όνομα bmp, πλάτος, ύψος, έγχρωμη εμφάνιση.drawBitmap (dijmin0PosX, εχθρός0PosY, ΕΧΘΡΟΣ0, ΕΧΘΡΟΣ0_WIDTH, ΕΧΘΡΟΣ0_ΥEΟΣ, 1); dijmin0PosX = εχθρός0PosX-drawSpeed; display.drawBitmap (dijmin1PosX, εχθρός1PosY, ΕΧΘΡΟΣ 1, ΕΧΘΡΟΣ1_WIDTH, ΕΧΘΡΟΣ1, Υ,ΟΣ, 1); dijmin1PosX = εχθρός1PosX-drawSpeed; display.drawBitmap (dijmin2PosX, εχθρός2PosY, ΕΧΘΡΟΣ2, ΕΧΘΡΟΣ2_WIDTH, ΕΧΘΡΟΣ2, Υ,ΟΣ, 1); dijmin2PosX = εχθρός2PosX-drawSpeed; display.display (); if (dijmin0PosX> 231 && dijmin0PosX231 && dijmin1PosX <255) {εχθρός1PosX = randomPosX (); dijmin1PosY = randomPosY (); checkDuplicate (); }

if (dijmin2PosX> 231 && dijmin2PosX <255) {εχθρός2PosX = randomPosX (); dijmin2PosY = randomPosY (); }} // ------------------------------------- ΕΝΗΜΕΡΩΣΗ ΟΘΟΝΗΣ -------- -------------------------------------------- άκυρη ενημέρωσηDisplay () {display.clearDisplay () ? display.drawBitmap (carPosX, carPosY [carPosYCnt], CARSPRITE, 30, 15, 1); display.fillRect (100, 0, 28, 10, ΜΑΥΡΟ); display.setCursor (100, 0); display.setTextColor (ΛΕΥΚΟ, ΜΑΥΡΟ); display.println (βαθμολογία); display.display ();

}

// ------------------------- περιμένετε για βρόχο πιέσεων ------------------- ------

// αυτός είναι ο κωδικός αρχικής οθόνης void waitForPress () {splashScreen (); bool αναμονή = 0; // ο βρόχος τελειώνει όταν αυτό είναι πραγματικό display.clearDisplay (); ενώ (αναμονή == 0) {

display.fillRect (19, 20, 90, 32, ΜΑΥΡΟ); // κενό φόντο για κείμενο

display.setTextColor (ΛΕΥΚΟ); display.setCursor (23, 24); display.setTextSize (0); display.println ("Reckless"); display.setCursor (36, 34); display.println ("Racer"); display.drawBitmap (74, 24, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // x y w h r col display.drawRoundRect (21, 21, 86, 23, 4, ΛΕΥΚΟ); // περίγραμμα Snake display.drawRect (19, 20, 90, 33, ΛΕΥΚΟ); // πλαίσιο περιγράμματος - 3 display.setCursor (25, 43); display.setTextSize (0); // γραμματοσειρά πίσω στην κανονική οθόνη.println ("πατήστε οποιοδήποτε πλήκτρο"); display.fillRect (0, 0, 127, 8, ΜΑΥΡΟ); display.setCursor (10, 0); display.print ("Υψηλή βαθμολογία:"); // εμφάνιση της υψηλής βαθμολογίας display.print (highScore); display.display (); αναμονή = digitalRead (INTPIN); // ελέγξτε για να δείτε αν το πλήκτρο αναμονής θα αλλάξει σε 1 λήξη ενώ dirPressed = 0; // κουμπί επαναφοράς πατήστε χωρίς κατεύθυνση}} // ------------------------------------------ ----- ΕΝΗΜΕΡΩΣΗ ΠΑΙΧΝΙΔΙΟΥ --------------------------------------------- void updateGame () {moveCar (); drawRoad (); enemysDraw (); // dijmin1Draw (); // dijmin2Draw (); metreCnt ++; deteCrash (); εάν (metreCnt == 5) // προσθέτει ένα σημείο για κάθε 10 κύκλους για να ανεβάσει το σκορ {metreCnt = 0; βαθμολογία ++; } if (σκορ == σύγκριση+5) // επιταχύνει το παιχνίδι κάθε 5 πόντους σε μέγιστο 20 ταχύτητες {σύγκριση = σκορ; setGameSpeed (); } noTone (SND); updateDisplay ();

}

// ------------------------------ ΤΕΛΟΣ ΠΑΙΧΝΙΔΙΟΥ---------------- ----------------------------------

// αυτή η ρουτίνα τραβά τις γραμμές γύρω από το νεκρό αυτοκίνητο -ήρωα και στη συνέχεια εμφανίζει το παιχνίδι στην οθόνη

void gameOver ()

{τόνος (SND, 200, 200); // αναπαραγωγή ήχου uint8_t linePosX, linePosY, pixwidth, pixheight = 0; // ορίστε βάρες για να σχεδιάσετε κουτιά γύρω από τη γραμμή αυτοκινήτουPosX = carPosY; linePosY = carYTmp; pixwidth = 30; pixheight = 15; display.drawRect (linePosX, linePosY, pixwidth, pixheight, WHITE); display.display (); για (int i = 0; i <= 26; i ++) // αυτό περιβάλλει το αυτοκίνητο σε ορθογώνια που προσομοιώνουν την έκρηξη {linePosX = linePosX-2; linePosY = linePosY-2; pixwidth = pixwidth+4; pixheight = pixheight+4; display.drawRect (linePosX, linePosY, pixwidth, pixheight, BLACK); display.drawRect (linePosX, linePosY, pixwidth, pixheight, WHITE); display.display (); τόνος (SND, i*20, 50). καθυστέρηση (10)? } display.setTextSize (2); display.setTextColor (ΛΕΥΚΟ, ΜΑΥΡΟ); display.setCursor (10, 23); τόνος (SND, 50, 500). display.print ("ΠΑΙΧΝΙΔΙ"); display.display (); καθυστέρηση (500)? τόνος (SND, 40, 500). display.print ("OVER"); display.setTextSize (0); display.display (); καθυστέρηση (3000)? restartGame (); waitForPress (); }

// -------------------------------------------- ΕΠΑΝΑΡΤΗΣΗ ΠΑΙΧΝΙΔΙΟΥ ----- ------------------------------------------------------ -----

void restartGame () // αυτό αντιγράφει υψηλή βαθμολογία και επαναφέρει όλα τα στατιστικά στοιχεία και δημιουργεί τυχαίες θέσεις

{if (score> = highScore) // ελέγξτε αν η βαθμολογία είναι υψηλότερη από την υψηλή βαθμολογία {highScore = score; // single if statment για ενημέρωση υψηλής βαθμολογίας}

βαθμολογία = 0;

drawSpeed = 4; metreCnt = 0; carPosYCnt = 0; dijmin0PosX = randomPosX (); dijmin0PosY = randomPosY (); dijmin1PosX = randomPosX (); dijmin1PosY = randomPosY (); dijmin2PosX = randomPosX (); dijmin2PosY = randomPosY (); noTone (SND);

checkDuplicate ();

}

// ---------------------------------------------------- -ΕΛΕΓΧΟΣ ΔΙΠΛΙΚΟ --------------------------------------------------- ------ void checkDuplicate () // αυτοί οι έλεγχοι για να δείτε αν τα εμπόδια καταλαμβάνουν τον ίδιο χώρο παιχνιδιού {// Serial.println ("διπλό έλεγχο"); if (dijmin2PosX> 230 && dijmin2PosX <255) {ενώ (dijmin2PosY == dijmin1PosY || εχθρός2PosY == dijmin0PosY) {εχθρός2PosY = randomPosY (); }}

if (dijmin0PosX> 230 && dijmin0PosX230 && dijmin2PosXenemy1PosX && dijmin2PosX230 && dijmin0PosXenemy1PosX && dijmin0PosX

// ----------------------------------------------- ΟΘΟΝΗ ΛΕΠΙΣΗΣ --- ------------------------------------

void splashScreen ()

{display.clearDisplay (); display.drawBitmap (0, 0, CRASH, CRASHWIDTH, CRASHHEIGHT, 1); display.display (); καθυστέρηση (2000). } // --------------------------------------------------- ΡΥΘΜΙΣΗ ----------------------------------------------------- ----------- void setup () {delay (100); // αφήστε τα πράγματα να ξεκινήσουν // Serial.begin (9600). // σχολιάστε αυτό και όλο το Serial. εντολές για απεικόνιση σφάλματος. begin (SSD1306_SWITCHCAPVCC, 0x3C). display.clearDisplay (); display.setTextColor (ΛΕΥΚΟ, ΜΑΥΡΟ); display.setTextWrap (false); display.dim (0); pinMode (INTPIN, INPUT); pinMode (UPPIN, INPUT); pinMode (DWNPIN, INPUT); pinMode (LFTPIN, INPUT); pinMode (RHTPIN, INPUT);

attachInterrupt (digitalPinToInterrupt (INTPIN), διακοπή, RISING);

// τοποθετήστε τυχαία εμπόδια dijmin0PosX = randomPosX (); dijmin0PosY = randomPosY (); dijmin1PosX = randomPosX (); dijmin1PosY = randomPosY (); dijmin2PosX = randomPosX (); dijmin2PosY = randomPosY (); checkDuplicate (); // έλεγχος για διπλές τοποθεσίες // Serial.println ("setup Complete"); splashScreen (); waitForPress (); } // --------------------------------------------------- ----- LOOP ------------------------------------------------ ----------

κενός βρόχος ()

{updateGame (); }

και αυτό είναι λίγο πολύ, τυχόν τροποποιήσεις και σχόλια θα είναι ευπρόσδεκτα. Θέματα που πρέπει να αντιμετωπίσουμε το τρεμόπαιγμα της οθόνης πρέπει να εξετάσουμε πώς να το μειώσουμε και τα εχθρικά αυτοκίνητα εξακολουθούν να είναι σε θέση να καταλαμβάνουν τον ίδιο χώρο.

Συνιστάται: