תוכן עניינים:

משחק ה- OLED Reckless Racer Arduino, AdafruitGFX ו- Bitmaps יסודות: 6 שלבים
משחק ה- OLED Reckless Racer Arduino, AdafruitGFX ו- Bitmaps יסודות: 6 שלבים

וִידֵאוֹ: משחק ה- OLED Reckless Racer Arduino, AdafruitGFX ו- Bitmaps יסודות: 6 שלבים

וִידֵאוֹ: משחק ה- OLED Reckless Racer Arduino, AdafruitGFX ו- Bitmaps יסודות: 6 שלבים
וִידֵאוֹ: RIMBA Racer | Episode 14 | Animation 2024, נוֹבֶמבֶּר
Anonim
משחק ה- OLED Reckless Racer Arduino, AdafruitGFX ו- Basmaps Basics
משחק ה- OLED Reckless Racer Arduino, AdafruitGFX ו- Basmaps Basics
משחק ה- OLED Reckless Racer Arduino, AdafruitGFX ו- Basmaps Basics
משחק ה- OLED Reckless Racer Arduino, AdafruitGFX ו- Basmaps Basics

במדריך זה נבחן כיצד להשתמש במפות סיביות באמצעות ספריית Adafruit_GFX.c כמעין ספריטים במשחק. המשחק הפשוט ביותר שיכולנו לחשוב עליו הוא משחק מכוניות להחלפת נתיב צדדי, בסופו של דבר בודק הבטא והקודן העוזר שלנו החליטו על "מרוץ פזיז" כשם, כיוון שזה די פזיז לנהוג בדרך הלא נכונה במורד הכביש המהיר !!.

עיצוב המעגל שלנו מצוי בתמונות הכלולות למעלה ומפורט בפרויקט/הדרכה אחרונים שלנו כאן 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 צבעים שחור ולבן בלבד בעיפרון כלי (pic2), כאשר ציירת (או הדבקת) את תמונת מסך ההתזה שלך, לחץ על התמונה ולאחר מכן שנה את גודל (image4), בחלון הקופץ שנה את הגודל מ 1260x620 ל- 126x62 (2 פיקסלים קטנים יותר מהתצוגה שלך) (pic5) לחץ על אישור.

לחץ על תפריט קובץ ולאחר מכן שמור בשם (pic6).

כאשר הקופץ המופיע בתפריט הנפתח של סוג הקובץ בחר BMP (מפת סיביות). (pic7), הקלד שם קובץ ולחץ על שמור, כאשר המראה המוקפץ מוגדר כ- 0 והוגדר ל- 8 ביט, לחץ על אישור (pic8).

שלב 3: המרת BMP לקובץ מפת סיביות C

המרת BMP לקובץ מפת סיביות C
המרת BMP לקובץ מפת סיביות C
המרת BMP לקובץ מפת סיביות C
המרת BMP לקובץ מפת סיביות C
המרת BMP לקובץ מפת סיביות C
המרת BMP לקובץ מפת סיביות C
המרת BMP לקובץ מפת סיביות C
המרת BMP לקובץ מפת סיביות C

עכשיו עלינו להמיר את התמונה שלנו לפורמט שהארדואינו יכול להבין שיש הרבה כלים זמינים לעשות זאת, אך המקום שלי "עבור אל" הוא הכלי ממיר מפות סיביות של אתר marlin webs …

marlinfw.org/tools/u8glib/converter.html

אז אנו מתחילים את החלק הזה באמצעות הקישור לעיל כדי לפתוח את האתר המוצג בתמונה 1

לחץ על בחר קובץ ובחר את מפת הסיביות שיצרת קודם (pic2)

ממיר מפות סיביות מרלין יהפוך את התמונה שלך אוטומטית לקוד c לחץ לחיצה כפולה על הקוד שאמור להדגיש את הקוד, ואז לחץ לחיצה ימנית ולחץ על העתק (pic3)

הבא אנו יוצרים קליק ימני ויוצרים מסמך טקסט חדש (pic4)

לחץ פעמיים על המסמך החדש, כאשר הוא נפתח לחץ לחיצה ימנית והדבק את הקוד (pic5)

לאחר מכן עלינו להוסיף את השורה ליד החלק העליון של הקוד #כלול זה מאפשר לנו לשמור את נתוני מפת הסיביות בזיכרון הפלאש בארדואינו, ואז אנו משנים את שם הרוחב, הגובה והשם #define למשהו קל יותר לשימוש. בתמונה 6, אנו משנים אותם מהדמויות שנוצרות באופן אקראי אנו משנים אותן לדוגמה המודגשת להלן

#define LOGOWIDTH

#define LOGOHEIGHT

const unsigned char LOGOPIC PROGMEM

לחץ על קובץ הבא ואז שמור בשם, שמור את הקובץ בתור logo.c סגור פנקס רשימות, לחץ לחיצה ימנית על logo.c ולחץ על העתק.

שלב 4: הצגת לוגו באמצעות DrawBitmap

הצגת לוגו באמצעות DrawBitmap
הצגת לוגו באמצעות DrawBitmap
הצגת לוגו באמצעות DrawBitmap
הצגת לוגו באמצעות DrawBitmap
הצגת לוגו באמצעות DrawBitmap
הצגת לוגו באמצעות DrawBitmap
הצגת לוגו באמצעות DrawBitmap
הצגת לוגו באמצעות DrawBitmap

כעת אנו מעמיסים את ה- arduino IDE ויוצרים סקיצה חדשה ושומרים אותו בשם logoexample.ino, הבא כרמאי ב- arduino ide לחץ על תפריט הקובץ ואז שמור בשם, חזור לתיקיית הפרוייקט לחץ לחיצה ימנית והדבק בקובץ.c (pic2) ולאחר מכן לחץ על ביטול, הדבר חוסך ממך צורך לגלוש לתיקייה להדביק בקובץ.

הקלד את הקוד הבא ב- arduino IDE או הורד ב- ino.

(אנו ממליצים להקליד במקום להעתיק ולהדביק או להשתמש בקבצים מתחת זו הדרך הטובה ביותר ללמוד)

#include /* זה ישתנה בהתאם למקום שבו אתה מאחסן

ino בדרך כלל בתיקייה C: / Users / ~ שם משתמש / Documents / Arduino / project ~ שם

וכך אנו מקשרים למפת הסיביות שלנו */

#לִכלוֹל

#לִכלוֹל

uint8_t bmpX, bmpY = 0; /* שמור זיכרון עבור 2 X 8 סיביות שלמות, אנו זקוקים רק ל- 8 סיביות

מכיוון שהערך לעולם אינו גבוה מ -128 (פיקסלים) כך שנוכל לחסוך מקום באמצעות אינטסים של 8 סיביות (בעל ערך מרבי של 255) */

הגדרת חלל ()

{עיכוב (100); // לתת לתצוגה וכו 'זמן להפעיל את display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // זה לאתחול התצוגה display.clearDisplay (); // התחל במסך ריק}

/* שים לב שאינך צריך להקליד את ההערות האלה בהן הן לעיון …………..

הפקודה שאנחנו מתמקדים בה היא display.drawBitmap, זה מה שמושך את מסך ההתזה שלנו. (bmpX, הוא ערך ציר ה- X במסך שבו נקודת העוגן X של מפת הסיביות תהיה ו- bmpX ו- bmpY הם הערכים בהם אנו מעוניינים ליצור תנועה (bmpY, הוא ערך ציר ה- Y במסך שבו עוגן Y נקודת מפת הסיביות תהיה שנקבל את שמות ההתייחסות כפי שהגדרנו אותם ב- logo.c (LOGOPIC, הוא שמו של מפת הסיביות בלוגו הקובץ #כלול. c (LOGOWIDTH, הוא כמה פיקסלים לאורך (X) כדי לצייר את מפת סיביות מנקודת העוגן (LOGOHEIGHT, היא כמה פיקסלים כלפי מטה (Y) כדי לצייר את מפת הסיביות מנקודת העוגן ניתן להזין ידנית את הפיקסלים X ו- Y על פניהם אך פשוט יותר להשתמש בפיקסלים שהוגדרו מראש מאשר לזכור את כולם (1, הערך האחרון הוא הצבע מכיוון שהמסך מונו 0 שחור 1 לבן. בסדר התחל להקליד מהשורה הבאה: ¬D lol*/ void loop () {display.clearDisplay (); // ריק את המסך // מפת סיביות שנמשכה מה- שמאל למעלה, x, y, שם מפת הסיביות, רוחב X, גובה Y, תצוגת צבעים.drawBitmap (bmpX, bmpY, LOGOPIC, LOGOWIDTH, LOGOHEIGHT, 1); display.display (); // זה בעצם מושך את המאגר לתצוגה אי פעם}

העלה את הקוד שלך arduino ואשר שהוא עובד (pic3).

שלב 5: העברת Sprite של מפת סיביות

Image
Image
העברת Sprite של מפת סיביות
העברת Sprite של מפת סיביות
העברת מפת ביט
העברת מפת ביט

באמצעות ההוראות המוקדמות יותר השתמשו ב- paint.net וצרו קובץ חדש בגודל 30x15 פיקסלים (pic1) וציירו מכונית מחוספסת המעצב הצעיר שלנו מתחיל עם השמשה הראשונה (תמונות 2 & 3).

שוב שמור אותו כקובץ bmp של windows (כמו בשלב 2), המר למפת סיביות C (שלב 3) והנח את קובץ ה- car.c (או כל מה שתחליט עליו) באותה תיקייה של arduino ino (סקיצה) קוֹבֶץ.

(זכור להוסיף את השורה #include ברכב. 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 8 ביט אינטס (0-255) אנחנו לא צריכים יותר גדול 128 יהיה המספר הגדול ביותר בשימוש bool hitSide = 0; bool hitTop = 0;

הגדרת חלל ()

{עיכוב (100); // לתת לתצוגה וכו 'זמן להפעיל את display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // זה לאתחול התצוגה display.clearDisplay (); // התחל במסך ריק

}

לולאת חלל ()

{display.clearDisplay (); // ריק את המסך // מפת סיביות שנמשכה מצד שמאל למעלה, x, y, שם מפת סיביות, רוחב X, גובה Y, צבע display.drawBitmap (bmpX, bmpY, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // display.display (); // זה בעצם מושך את המאגר לתצוגה אי פעם/ * כך אנו עוקבים אחר קצה המסך ומחליטים אם להוסיף פיקסל זז מלמעלה למטה) או להסיר פיקסל (העבר מלמטה למעלה) */ מתג (hitSide) // זה בוחר את כיוון המכונית על סמך הבול {מקרה 0: bmpX ++; לשבור;

תיק 1:

bmpX--; לשבור; } // אלה 2 אם הצהרות מגדירות את הציון לאמיתי או לא נכון אם (bmpX == 0) {hitSide = 0; } אם (bmpX == 96) // רוחב המסך מינוס המכונית {hitSide = 1; } // זהה לעיל לציר Y אם (bmpY == 0) {hitTop = 0; } אם (bmpY == 49) // גובה המסך מינוס גובה המכונית {hitTop = 1; } switch (hitTop) {case 0: bmpY ++; לשבור; מקרה 1: bmpY--; לשבור; }

}

אתה יכול לראות את התוכנית עובדת בסרטון המצורף

שלב 6: הכנת משחק הנהיגה

Image
Image

ראשית נתחיל בציור של כמה מכוניות או מכשולים שונים כמו בשלבים קודמים של ההדרכה והופך אותם לגודל 30x15 פיקסלים. לאחר מכן אנו ממירים אותם למפות סיביות ג ומקשרים את הקוד.

#include // נתיבים אלה יצטרכו להשתנות בהתאם

// על המקום שבו אתה מאחסן את הקבצים // עריכה: רק עכשיו גיליתי אם אתה מחליף // ב- "" אינך דורש את הנתיב המלא // בספריות משלך #include

#לִכלוֹל

#כלול #כלול

#לִכלוֹל

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

תצוגת Adafruit_SSD1306 (128, 64); // הגדר את פרמטרי התצוגה

להגדיר את המשתנים והערכים הקבועים

// הגדירו סיכות קלט אלה הסיכות בארדואינו הם אף פעם לא משתנים ולכן #הגדר #הגדר INTPIN 3 // רק סיכות 2 ו -3 יכולות להיות סיכות אינטרפט ב- UNO #הגדר UPPIN 4 // אלה סיכות המחוברות tp מתג רלוונטי #הגדר DWNPIN 5 #define LFTPIN 6 #define RHTPIN 7 #define SND 9 // הגדר כיוונים

#define DIRUP 1 // ערכים אלה הם מה שה"נחש "מסתכל כדי להחליט-

#define DIRDOWN 2 // הכיוון שהנחש ינוע #הגדר DIRLEFT 3 #הגדר DIRRIGHT 4

uint8_t dirPressed = 0; // ערך לרישום כיוון כדי להמשיך באיזה סיכה עלתה גבוה

// חנות בוליאנים איזה סיכה עלתה גבוה

בול BUTUP = 0; bool BUTDWN = 0; bool BUTLFT = 0; bool BUTRHT = 0; // vars למיקום המכונית uint8_t carPosX = 1; uint8_t carPosY = {0, 16, 32, 48}; // צריך ערך cahnging המערך

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 אויב 0PosX = 255; uint8_t opponent0PosY = 0; uint8_t אויב 1PosX = 255; uint8_t opponent1PosY = 0; uint8_t opponent2PosX = 255; uint8_t opponent2PosY = 0;

// משתנה לאקראי הקצה מספר נתיב למכשולים

uint8_t laneGen = 0;

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

// מונה ציונים

ציון ארוך = 0; // זהו הציון:/ חחח ארוך השווה = 0; // זה מאחסן את הציון ברמה האחרונה עד להשוואה חזרה ל- HighScore ארוך = 25; uint8_t metreCnt = 0;

כאן אנו מתחילים את הפונקציות

// זוהי קבוצת הפקודות אם ההפרעה מופעלת חלל נקטע () {עיכוב (150); updateDirection (); } // עדכן איזה ערך נמצא בכיוון var על ידי בדיקת ה- bools DIR // -------------------------- עדכון כיוון (שחקן)- ------------------------- void updateDirection () {//Serial.println("updateDirection נקרא "); BUTUP = digitalRead (UPPIN); BUTDWN = digitalRead (DWNPIN); BUTLFT = digitalRead (LFTPIN); BUTRHT = digitalRead (RHTPIN); אם (BUTUP == true) {dirPressed = DIRUP; } אם (BUTDWN == true) {dirPressed = DIRDOWN; } אם (BUTLFT == true) {dirPressed = DIRLEFT; } אם (BUTRHT == true) {dirPressed = DIRRIGHT; }

}

// ------------------------------- העברת רכב --------------- -------------------------

// זה יעדכן את המסך המניע את המכונית

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; לשבור; // הגיב על המכונית מסוגלת לנוע לאיתור התנגשות שמאלה וימינה עדיין לא כל כך טובה /* מקרה DIRLEFT: carPosX--; אם (carPosX == 0) {carPosX = 1; } // Serial.println ("carPosX"); // Serial.println (carPosX); dirPressed = 0; לשבור; */ case DIRRIGHT: // סתם בשביל הכיף אם תלחץ ימינה המשחק ישמיע צליל רעש (SND, 100, 50); // carPosX ++; // אם (carPosX == 128) // {// carPosX = 127; //} // Serial.println ("carPosX"); // Serial.println (carPosX); // dirPressed = 0; לשבור; } updateDisplay (); }

// -------------------------- רנדום קופה X ------------------- -----------

uint8_t randomPosX () // 2 שגרות אלה פשוט יוצרות מיקום אקראי למכשולים

{uint8_t posValTmp = 0; posValTmp = אקראי (129, 230); //Serial.println("random x "); //Serial.println(posValTmp); החזרה (posValTmp); }

// --------------------------- RANDOM POS Y ------------------ ------------------

uint8_t randomPosY ()

{uint8_t laneVal = 0; laneVal = אקראי (0, 4); // הוסף נתיב נוסף לאקראיות כלומר אין אובייקט על המסך בזמן הנתיב הזה //Serial.println("RandomY "); //Serial.println(lanePosArr [LaneVal]); return (lanePosArr [laneVal]); }// ------------------------------- קבע מהירות משחק -------------- -------------- void setGameSpeed () // זה מפסיק את הרמה לעלות מעל 20 מה שהופך את המשחק לבלתי ניתן לשחק {אם (drawSpeed <21) {drawSpeed = drawSpeed+2; }}// ------------------------------------ זיהוי התרסקות ---------- ----------------------- void detectCrash () {

אם (אויב 0PosX = 0 && אויב 00 פוסי == carYTmp)

{// Serial.println ("Game Over CRAASSSSHHHHHHEEEEEDDD לתוך Traffic 0"); סוף המשחק(); } if (אויב 1PosX = 0 && אויב 11 פוסי == carYTmp) {//Serial.println("משחק CRAASSSSHHHHHHEEEEEDDD לתנועה 1 "); סוף המשחק(); } if (enemy2PosX = 0 && enemy2PosY == carYTmp) {//Serial.println("משחק CRAASSSSHHHHHHHEEEEEDDD לתנועה 2 "); סוף המשחק(); }}

אלה הם השגרות שמושכות את התצוגה.

// ------------------------------- צייר כביש --------------- --------------------- void drawRoad () // X, Y, אורך, רוחב {display.fillRect (roadLineX1, 15, 30, 4, WHITE); display.fillRect (roadLineX1, 30, 30, 4, WHITE); display.fillRect (roadLineX1, 45, 30, 4, WHITE); display.fillRect (roadLineX2, 15, 30, 4, WHITE); display.fillRect (roadLineX2, 30, 30, 4, WHITE); display.fillRect (roadLineX2, 45, 30, 4, WHITE); display.fillRect (roadLineX3, 15, 30, 4, WHITE); display.fillRect (roadLineX3, 30, 30, 4, WHITE); display.fillRect (roadLineX3, 45, 30, 4, WHITE); display.fillRect (roadLineX4, 15, 30, 4, WHITE); display.fillRect (roadLineX4, 30, 30, 4, WHITE); display.fillRect (roadLineX4, 45, 30, 4, WHITE); display.fillRect (roadLineX5, 15, 30, 4, WHITE); display.fillRect (roadLineX5, 30, 30, 4, WHITE); display.fillRect (roadLineX5, 45, 30, 4, WHITE);

roadLineX1 = roadLineX1-drawSpeed;

roadLineX2 = roadLineX2-drawSpeed; roadLineX3 = roadLineX3-drawSpeed; roadLineX4 = roadLineX4-drawSpeed; roadLineX5 = roadLineX5-drawSpeed; display.display (); } // ----------------------------------------- צייר אויבים ---- --------------------------------------- שונאי חלל Draw () {// X, Y, שם bmp, רוחב, גובה, תצוגת צבע.צייר Bitmap (אויב 0PosX, אויב 0 פוסי, ENEMY0, ENEMY0_WIDTH, ENEMY0_HEIGHT, 1); אויב 0PosX = אויב 00PosX-drawSpeed; display.drawBitmap (אויב 1PosX, אויב 1 פוסי, ENEMY 1, ENEMY1_WIDTH, ENEMY1_HEIGHT, 1); אויב 1PosX = אויב 1PosX-drawSpeed; display.drawBitmap (vijand2PosX, fijnd2PosY, ENEMY2, ENEMY2_WIDTH, ENEMY2_HEIGHT, 1); אויב 2PosX = אויב 2PosX-drawSpeed; display.display (); if (אויב 0PosX> 231 && אויב 00 פוסקס 231 && שונא 1 פוס <255) {fijne1PosX = randomPosX (); אויב 1PosY = randomPosY (); checkDuplicate (); }

if (vijand2PosX> 231 && fijnd2PosX <255) {fijnd2PosX = randomPosX (); אויב 2PosY = randomPosY (); }} // ------------------------------------ עדכון תצוגה -------- ---------------------------------------- void updateDisplay () {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 (); בול המתנה = 0; // הלולאה מסתיימת כשזה נכון display.clearDisplay (); בזמן (מחכה == 0) {

display.fillRect (19, 20, 90, 32, שחור); // רקע ריק לטקסט

display.setTextColor (לבן); display.setCursor (23, 24); display.setTextSize (0); display.println ("פזיז"); display.setCursor (36, 34); display.println ("מרוץ"); display.drawBitmap (74, 24, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // x y w h r col display.drawRoundRect (21, 21, 86, 23, 4, WHITE); // גבול תצוגת נחש.צייר (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); // בדוק אם המפתח שנלחץ ממתין ישתנה לסוף אחד בעוד dirPressed = 0; // איפוס כפתור לחיצה ללא כיוון}} // -------------------------------------- ----- עדכון משחק ----------------------------------------- void updateGame () {moveCar (); drawRoad (); enemysDraw (); // אויב 1Draw (); // אויב 2Draw (); metreCnt ++; detectCrash (); אם (metreCnt == 5) // מוסיף נקודה לכל 10 מחזורים כדי להעלות את הציון {metreCnt = 0; ציון ++; } אם (ציון == השווה+5) // מאיץ את המשחק כל 5 נקודות למקסימום של 20 מהירות {השווה = ציון; setGameSpeed (); } noTone (SND); updateDisplay ();

}

// ------------------------------ סוף המשחק---------------- ------------------------------

// שגרה זו מותחת את הקווים סביב מכונית הגיבור המת ואז מציגה את המשחק מעל המסך

void gameOver ()

{טון (SND, 200, 200); // הפעל צליל uint8_t linePosX, linePosY, pixwidth, pixheight = 0; // הגדר vars לצייר קופסאות מסביב לרכב linePosX = carPosY; linePosY = carYTmp; רוחב פיקס = 30; פיקסהייט = 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 ("GAME"); display.display (); עיכוב (500); טון (SND, 40, 500); display.print ("מעל"); display.setTextSize (0); display.display (); עיכוב (3000); restartGame (); waitForPress (); }

// ----------------------------------------- הפעל מחדש את המשחק ----- -------------------------------------------------- -----

void restartGame () // זה מעתיק ציון גבוה ומאפס את כל הנתונים הסטטיסטיים ויוצר עמדות אקראיות

{if (score> = highScore) // לבדוק אם הציון גבוה מהציון הגבוה {highScore = הציון; // סיסמה אם עדכון לעדכון ציון גבוה}

ציון = 0;

drawSpeed = 4; metreCnt = 0; carPosYCnt = 0; אויב 0PosX = randomPosX (); אויב 0PosY = randomPosY (); אויב 1PosX = randomPosX (); אויב 1PosY = randomPosY (); אויב 2PosX = randomPosX (); אויב 2PosY = randomPosY (); noTone (SND);

checkDuplicate ();

}

// ------------------------------------------------ -בדוק כפילות ----------------------------------------------- ------ void checkDuplicate () // אלה בודקים אם המכשולים תופסים את אותו שטח המשחק {// Serial.println ("כפול נבדק"); אם (vijand2PosX> 230 && fijnd2PosX <255) {while (fjend2PosY == fijnd1PosY || fijnd2PosY == fijnd0PosY) {fijnd2PosY = randomPosY (); }}

אם (אויב 0PosX> 230 && אויב 0PosX230 && אויב

// ------------------------------------------- מסך הדפסה --- --------------------------------

ריסוס חלל מסך ()

{display.clearDisplay (); display.drawBitmap (0, 0, CRASH, CRASHWIDTH, CRASHHEIGHT, 1); display.display (); עיכוב (2000); } // ----------------------------------------------- להכין ------------------------------------------------- ----------- הגדרת בטל () {עיכוב (100); // תנו לדברים להתחיל // Serial.begin (9600); // לא להגיב על זה ועל כל הסידרה. פקודות לתצוגת diag. begin (SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay (); display.setTextColor (לבן, שחור); display.setTextWrap (שקר); display.dim (0); pinMode (INTPIN, INPUT); pinMode (UPPIN, INPUT); pinMode (DWNPIN, INPUT); pinMode (LFTPIN, INPUT); pinMode (RHTPIN, INPUT);

attachInterrupt (digitalPinToInterrupt (INTPIN), מופרע, עולה);

// מקם מכשולים אקראיים אויב 0PosX = randomPosX (); אויב 0PosY = randomPosY (); אויב 1PosX = randomPosX (); אויב 1PosY = randomPosY (); אויב 2PosX = randomPosX (); אויב 2PosY = randomPosY (); checkDuplicate (); // בדוק אם יש מיקומים כפולים // Serial.println ("ההגדרה הושלמה"); splashScreen (); waitForPress (); } // ----------------------------------------------- ----- LOOP -------------------------------------------- ----------

לולאת חלל ()

{updateGame (); }

וזהו בערך, כל שינוי ומשוב יתקבל בברכה. נושאים שעלינו לטפל בהבהוב המסך עלינו לבדוק כיצד ניתן להפחית אותו ומכוניות האויב עדיין מסוגלות לתפוס את אותו שטח.

מוּמלָץ: