Mundarija:

Ehtiyotsiz Racer Arduino OLED o'yini, AdafruitGFX va bitmap asoslari: 6 qadam
Ehtiyotsiz Racer Arduino OLED o'yini, AdafruitGFX va bitmap asoslari: 6 qadam

Video: Ehtiyotsiz Racer Arduino OLED o'yini, AdafruitGFX va bitmap asoslari: 6 qadam

Video: Ehtiyotsiz Racer Arduino OLED o'yini, AdafruitGFX va bitmap asoslari: 6 qadam
Video: Руководство по разблокировке СЕКРЕТОВ Hot Wheels Unleashed 2024, Noyabr
Anonim
Ehtiyotsiz Racer Arduino OLED o'yini, AdafruitGFX va bitmaps asoslari
Ehtiyotsiz Racer Arduino OLED o'yini, AdafruitGFX va bitmaps asoslari
Ehtiyotsiz Racer Arduino OLED o'yini, AdafruitGFX va bitmaps asoslari
Ehtiyotsiz Racer Arduino OLED o'yini, AdafruitGFX va bitmaps asoslari

Ushbu qo'llanmada biz Adafruit_GFX.c kutubxonasidan foydalanib, o'yinda spritlar sifatida bitmaplardan qanday foydalanishni ko'rib chiqamiz. Biz o'ylashimiz mumkin bo'lgan eng oddiy o'yin - bu yonma -yon harakatlanuvchi chiziqli avtomashina o'yini, natijada bizning beta -testerimiz va yordamchi kodimiz "beparvo poygachi" nomini tanladi, chunki u avtomagistralda noto'g'ri yo'lni haydashda juda ehtiyotsiz edi !!

Bizning sxemamizning dizayni yuqoridagi rasmlarda joylashgan va bizning loyihamiz/o'quv qo'llanmamizda batafsil bayon qilingan, bu erda sxema qanday ishlashini tasvirlab beradi.

talab qilamiz

Adafruit_GFX

Paint.net

Arduino IDE windowslinux

va iltimos, qolgan uskunalar uchun ilon qo'llanmasiga qarang.

Ta'minotlar

Ilon o'yini

1 -qadam: Paint.net -ni o'rnatish

Paint.net ni o'rnatish
Paint.net ni o'rnatish
Paint.net ni o'rnatish
Paint.net ni o'rnatish
Paint.net ni o'rnatish
Paint.net ni o'rnatish

Biz paint.net -dan foydalanmoqdamiz, chunki dastur bepul, shuning uchun Paint. Net -ni bu erdan yuklab olishingiz mumkin.

Paint.net -ni o'rnatish uchun yuklab olingan dasturni ikki marta bosing va ijobiy javob bering, ha, ok, roziman va yuqoridagi rasmlar sizga ko'rsatma beradi.

2 -qadam: oddiy ekranni chizish

Oddiy ekranni chizish
Oddiy ekranni chizish
Oddiy ekranni chizish
Oddiy ekranni chizish
Oddiy ekranni chizish
Oddiy ekranni chizish

Paint.net saytida bo'lganingizda "Fayl" va "Yangi" tugmachalarini bosish orqali yangi rasm yarating, rasm hajmini 1260x620 qilib sozlang (birinchi rasmga qarang), agar sizda yangi sahifa bo'lsa, qalam yordamida qora va oq rangdan foydalangan holda ekran oching. asbob (rasm 2), Agar siz ekran tasvirini chizganingizda (yoki yopishtirganingizda), rasmni bosing, keyin o'lchamini o'zgartiring (image4), qalqib chiquvchi oynada o'lchamini 1260x620 dan 126x62 gacha o'zgartiring (displeyingizdan 2 piksel kichikroq) (rasm 5) OK tugmasini bosing.

Keyin Fayl menyusini bosing va keyin saqlang (rasm 6).

ochiladigan menyuda fayl turi paydo bo'lganda, BMP (bitmap) ni tanlang. (rasm 7), fayl nomini kiriting va saqlash tugmasini bosing, qalqib chiquvchi oynani 0 va 8 bitli qilib belgilang, OK tugmasini bosing (rasm 8)).

3 -qadam: BMP -ni C bitmap fayliga aylantirish

BMP ni C bitmap faylga aylantirish
BMP ni C bitmap faylga aylantirish
BMP ni C bitmap faylga aylantirish
BMP ni C bitmap faylga aylantirish
BMP ni C bitmap faylga aylantirish
BMP ni C bitmap faylga aylantirish
BMP ni C bitmap faylga aylantirish
BMP ni C bitmap faylga aylantirish

Endi biz o'z rasmimizni arduino tushunadigan formatga aylantirishimiz kerak, buning uchun ko'plab vositalar mavjud, lekin men "marlin" veb -saytining bitmap -konvertor vositasini joylashtiraman …

marlinfw.org/tools/u8glib/converter.html

Shunday qilib, biz ushbu bo'limni 1 -rasmda ko'rsatilgan veb -saytni ochish uchun yuqoridagi havola orqali boshlaymiz

fayl tanlash -ni bosing va ilgari yaratgan bitmapni tanlang (pic2)

marlin bitmap konvertori sizning rasmingizni avtomatik ravishda c kodiga aylantiradi, kodni ajratib ko'rsatish kerak bo'lgan kodni ikki marta bosing, so'ng sichqonchaning o'ng tugmachasini bosing va nusxasini bosing (3 -rasm)

Keyingi Biz sichqonchaning o'ng tugmachasini bosamiz va yangi matnli hujjatni yaratamiz (4 -rasm)

yangi hujjatni ikki marta bosing, ochilganda sichqonchaning o'ng tugmachasini bosing va kodni joylashtiring (5 -rasm)

Keyin biz kodni yuqori qismiga yaqin qatorni qo'shishimiz kerak #include bu bizga bitmap ma'lumotlarini arduino flesh xotirasiga saqlashga imkon beradi, keyin biz #define kengligi, balandligi va nomini o'zgartiramiz, ulardan foydalanish osonroq bo'ladi. 6 -rasmda, biz ularni tasodifan yaratiladigan belgilar nomidan o'zgartiramiz va biz ularni quyida chizilgan misolga o'zgartiramiz

#LOGOWIDTHni aniqlang

#LOGOHEIGHT ni aniqlang

const unsigned char LOGOPIC PROGMEM

Keyingi faylni bosing, keyin saqlang, faylni log.c daftarchasini yoping, logo.c -ni o'ng tugmasini bosing va nusxalash -ni bosing.

4 -qadam: DrawBitmap yordamida logotipni ko'rsatish

DrawBitmap yordamida logotipni ko'rsatish
DrawBitmap yordamida logotipni ko'rsatish
DrawBitmap yordamida logotipni ko'rsatish
DrawBitmap yordamida logotipni ko'rsatish
DrawBitmap yordamida logotipni ko'rsatish
DrawBitmap yordamida logotipni ko'rsatish
DrawBitmap yordamida logotipni ko'rsatish
DrawBitmap yordamida logotipni ko'rsatish

Endi biz arduino IDE -ni yuklaymiz va yangi eskiz yaratamiz va uni logoexample.ino deb nomlaymiz, so'ngra arduino -dagi xiyla sifatida fayl menyusini bosing va keyin saqlang, loyiha papkasiga qayting va sichqonchaning o'ng tugmachasini bosing.c fayliga joylashtiring. (pic2), keyin "Bekor qilish" tugmachasini bosing, bu faylga joylashtirish uchun papkani ko'rib chiqishingizni saqlaydi.

arduino IDE -ga quyidagi kodni kiriting yoki yuklab oling.

(nusxa ko'chirishni emas, balki yozishni tavsiya qilamiz yoki pastdagi fayllarni o'rganishning eng yaxshi usuli)

#include /* bu saqlanadigan joyga qarab o'zgaradi

ino odatda C: / Users / ~ username / Documents / Arduino / project ~ papkasida joylashgan

va biz bitmapga shu tarzda bog'lanamiz */

#qo'shing

#qo'shing

uint8_t bmpX, bmpY = 0; /* 2 X 8 bitli butun sonlar uchun zaxira xotira, bizga faqat 8 bitli ints kerak

chunki qiymat hech qachon 128 (piksel) dan oshmaydi, shuning uchun biz 8 bitli ints yordamida bo'sh joyni tejashimiz mumkin (maksimal qiymati 255) */

bo'sh o'rnatish ()

{kechikish (100); // displey va hokazolarni displeyda yoqish uchun vaqt bering.begin (SSD1306_SWITCHCAPVCC, 0x3C); // bu displeyni ishga tushirish uchun.clearDisplay (); // bo'sh ekrandan boshlang}

/* Iltimos, esda tutingki, bu izohlarni yozish shart emas, ular ma'lumot uchun ……………

biz e'tibor qaratmoqchi bo'lgan buyruq - bu displey.drawBitmap, bu bizning ekranimizni tortadi. (bmpX, bu ekrandagi X o'qi qiymati, u erda bitmapning X bog'lanish nuqtasi bo'ladi va bmpX va bmpY bizni harakatlanish uchun qiziqtiradigan qiymatlardir (bmpY - Y o'qining ekranda Y o'qi qiymati) bitmapning nuqtasi biz logo.c (LOGOPIC, #kiritilgan fayl logotipidagi bitmapning nomi. Ankraj nuqtasidan bitmap (LOGOHEIGHT) - X va Y piksellarini ankraj nuqtasidan bitmapni chizish uchun qancha piksel pastga (Y) tushirilishi qo'lda kiritilishi mumkin, lekin barchasini eslab qolishdan ko'ra, oldindan aniqlanganlardan foydalanish osonroq (1, Oxirgi qiymat - rang, chunki ekran mono 0 qora 1 oq. OK, keyingi qatordan yozishni boshlang: ¬D lol*/ void loop () {display.clearDisplay (); // ekranni bo'shatish // bitmap yuqori chap, x, y, bitmap nomi, kengligi X, balandligi Y, rangli displey.drawBitmap (bmpX, bmpY, LOGOPIC, LOGOWIDTH, LOGOHEIGHT, 1); display.display (); // bu aslida buferni ekranga tortadi}

sizga arduino kodini yuklang va u ishlayotganini tasdiqlang (3 -rasm).

5 -qadam: Bitmap Sprite -ni ko'chirish

Image
Image
Bitmap Sprite -ni ko'chirish
Bitmap Sprite -ni ko'chirish
Bitmap Sprite -ni ko'chirish
Bitmap Sprite -ni ko'chirish

oldingi ko'rsatmalardan foydalanib, paint.net -dan foydalaning va 30x15 pikselli yangi faylni yarating (pic1) va bizning yosh dizaynerimiz birinchi bo'lib old oynadan boshlanadi (2 va 3 -rasmlar).

yana uni Windows bmp fayli sifatida saqlang (2 -qadamda bo'lgani kabi), C bitmapiga aylantiring (3 -qadam) va car.c faylini (yoki siz qaror qilgan narsani) yangi yaratilgan arduino ino (eskiz) bilan bir papkaga joylashtiring. fayl

(p.s. mashinaga #include qatorini qo'shishni unutmang, bu bizni tez -tez ushlab turardi)

Avval ekvivalenti car.c ga ulang

#qo'shing

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

Adafruit_SSD1306 displeyi (128, 64); // displeyning aniqligini belgilang

/* bmpX/bmpY bu o'zgaruvchilar bo'lishi kerak, chunki bu qiymatlarni o'zgartirish va qayta chizish

ekran - bu biz harakat animatsiyasi effektini yaratamiz. hitSide va hitTop - biz sprite -ni ekranda qanday saqlaymiz */ uint8_t bmpX, bmpY = 0; // 2 8 bitli ints uchun zaxira xotira (0-255) bizga kattaroq 128 kerak emas, eng ko'p ishlatiladigan bool hitSide = 0 bo'ladi; boT hitTop = 0;

bo'sh o'rnatish ()

{kechikish (100); // displey va hokazolarni displeyda yoqish uchun vaqt bering.begin (SSD1306_SWITCHCAPVCC, 0x3C); // bu displeyni ishga tushirish uchun.clearDisplay (); // bo'sh ekrandan boshlang

}

bo'sh halqa ()

{displey.clearDisplay (); // ekranni bo'sh qoldiring // yuqori chapdan chizilgan bitmap, x, y, bitmap nomi, kengligi X, balandligi Y, rangli displey.drawBitmap (bmpX, bmpY, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // displey.display (); // bu aslida buferni ekranga tortadi/ * shunday qilib biz ekranning chetini kuzatamiz va pikselni yuqoridan pastga siljitamizmi yoki pikselni olib tashlaymizmi (pastdan yuqoriga siljiting) */ switch (hitSide) // bu mashinaning yo'nalishini boole asosida tanlaydi {0 holat: bmpX ++; tanaffus;

1 -holat:

bmpX-; tanaffus; } // bu 2 if ifodalari boolni haqiqiy yoki noto'g'ri deb belgilaydi, agar (bmpX == 0) {hitSide = 0; } agar (bmpX == 96) // ekran kengligi minus mashina {hitSide = 1; } // Y o'qi uchun yuqoridagi kabi, agar (bmpY == 0) {hitTop = 0; } if (bmpY == 49) // ekran balandligi minus mashina balandligidan {hitTop = 1; } switch (hitTop) {0 holat: bmpY ++; tanaffus; 1-holat: bmpY--; tanaffus; }

}

dasturning ishlayotganini biriktirilgan videoda ko'rishingiz mumkin

6 -qadam: Haydash o'yinini yaratish

Image
Image

Birinchidan, biz darslikning oldingi bosqichlarida bo'lgani kabi 30x15 pikselli turli xil mashinalar yoki to'siqlarni chizishdan boshlaymiz. Keyin biz ularni bitmaplarga aylantiramiz va kodga havola qilamiz.

#include // bu yo'llar bog'liq holda o'zgarishi kerak bo'ladi

// fayllarni qayerda saqlayotganingiz haqida // tahrir: men bildimki, // ni "" bilan almashtirsangiz, to'liq yo'lni // o'z kutubxonangiz bilan to'ldirish shart emas #include

#qo'shing

#qo'shing #qo'shing

#qo'shing

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

Adafruit_SSD1306 displeyi (128, 64); // ko'rsatish parametrlarini aniqlang

o'zgaruvchilar va sobit qiymatlarni aniqlang

// kirish pimlarini aniqlang, bu ular hech qachon o'zgarmaydigan arduino -dagi pinlar #belgilash #INTPIN 3 -ni belgilash // faqat 2 va 3 -pinlar UNOda o'zaro bog'lanish pinlari bo'lishi mumkin #UPPIN 4 -ni aniqlang // bu tegishli kalitga ulangan pinlar #define DWNPIN 5 #define LFTPIN 6 #RHTPIN 7ni belgilang #SND 9 ni aniqlang // yo'nalishlarni aniqlang

#define DIRUP 1 // bu qiymatlarni "ilon" hal qilish uchun qaraydi-

#DIRDOWN 2 ni belgilang // ilonning qaysi yo'nalishda harakatlanishini aniqlang #DIRLEFT 3ni belgilang #DIRRIGHTni 4 aniqlang

uint8_t dirPressed = 0; // qiymat, qaysi pim yuqoriga ko'tarilganida harakat qilish uchun yo'nalishni ro'yxatdan o'tkazish

// booleans do'koni qaysi pin balandga ko'tarildi

bool BUTUP = 0; bool BUTDWN = 0; bool BUTLFT = 0; bool BUTRHT = 0; // mashinaning pozitsiyasi uchun standartlar uint8_t carPosX = 1; uint8_t carPosY = {0, 16, 32, 48}; // qatorni o'lchash qiymatiga muhtoj

uint8_t lanePosArr = {0, 16, 32, 48}; // har bir bo'lak joylashgan joyni saqlash uchun qator

uint8_t carPosYCnt = 0; uint8_t carYTmp = 0; // yo'ldagi chiziqlar uchun o'zgaruvchilar uint8_t roadLineX1 = 51; // ular boshida oldindan belgilanadi, keyin chiziqlar uzluksiz ko'rinadi uint8_t roadLineX2 = 102; uint8_t roadLineX3 = 153; uint8_t roadLineX4 = 254; uint8_t roadLineX5 = 200;

// bu o'yin maydoni bir vaqtning o'zida qancha piksel harakat qiladi

uint8_t drawSpeed = 4;

// dushman uchun variantlar0

uint8_t dushman0PosX = 255; uint8_t dushman0PosY = 0; uint8_t dushman1PosX = 255; uint8_t dushman1PosY = 0; uint8_t dushman2PosX = 255; uint8_t dushman2PosY = 0;

// varialble tasodifan to'siqlarga yo'l chizig'ini belgilaydi

uint8_t laneGen = 0;

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

// ball hisoblagichi

uzoq ball = 0; // bu hisob:/ lol uzoq vaqt solishtiring = 0; // bu yuqori reytingni uzoq reyting = 25 bilan taqqoslash uchun oxirgi darajadagi ballarni saqlaydi; uint8_t metreCnt = 0;

bu erda biz funktsiyalarni boshlaymiz

// bu buyruqlar to'plami, agar uzilish yoqilgan bo'lsa void interruptressed () {delay (150); updateDirection (); } // DIR boollarini tekshirish orqali var yo'nalishidagi qaysi qiymatni yangilang // ----------------------------- YO'LLANTIRISH YO'NALISHI (pleer)- ------------------------- void updateDirection () {//Serial.println("updateDirection chaqirildi "); BUTUP = digitalRead (UPPIN); BUTDWN = digitalRead (DWNPIN); BUTLFT = digitalRead (LFTPIN); BUTRHT = digitalRead (RHTPIN); agar (BUTUP == rost) {dirPressed = DIRUP; } agar (BUTDWN == rost) {dirPressed = DIRDOWN; } agar (BUTLFT == rost) {dirPressed = DIRLEFT; } agar (BUTRHT == rost) {dirPressed = DIRRIGHT; }

}

// ------------------------------- Avtomobilni harakatlantirish --------------- -------------------------

// bu ekranni harakatlantiruvchi mashinani yangilaydi

bo'sh harakat CarCar ()

{switch (dirPressed) {case DIRUP: carPosYCnt--; carPosY [carPosYCnt]; ohang (SND, 100, 100); agar (carPosYCnt == 255) {carPosYCnt = 0; } carYTmp = carPosY [carPosYCnt]; dirPressed = 0; // Serial.println ("carPosY yuqoriga"); // Serial.println (carPosYCnt); tanaffus; DIRDOWN holati: carPosYCnt ++; ohang (SND, 100, 100); agar (carPosYCnt == 4) {carPosYCnt = 3; } // Serial.println ("carPosY"); // Serial.println (carPosYCnt); carYTmp = carPosY [carPosYCnt]; dirPressed = 0; tanaffus; // sharhlangan mashina chap va o'ngda to'qnashuvni aniq aniqlay olmaydi, lekin hali yaxshi emas** holat DIRLEFT: carPosX--; agar (carPosX == 0) {carPosX = 1; } // Serial.println ("carPosX"); // Serial.println (carPosX); dirPressed = 0; tanaffus; */ case DIRRIGHT: // faqat o'yin -kulgi uchun, agar siz o'ng tugmani bossangiz, o'yin shovqin chiqaradi (SND, 100, 50); // carPosX ++; // agar (carPosX == 128) // {// carPosX = 127; //} // Serial.println ("carPosX"); // Serial.println (carPosX); // dirPressed = 0; tanaffus; } updateDisplay (); }

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

uint8_t randomPosX () // bu 2 tartib faqat to'siqlar uchun tasodifiy pozitsiyani hosil qiladi

{uint8_t posValTmp = 0; posValTmp = tasodifiy (129, 230); //Serial.println("random x "); //Serial.println(posValTmp); qaytish (posValTmp); }

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

uint8_t randomPosY ()

{uint8_t laneVal = 0; laneVal = tasodifiy (0, 4); // tasodifiylik uchun qo'shimcha chiziq qo'shing, ya'ni bu chiziqda ekranda hech qanday ob'ekt yo'q //Serial.println("RandomY "); //Serial.println(lanePosArr[laneVal]); qaytish (lanePosArr [laneVal]); }// ------------------------------- O'YIN tezligini o'rnatish -------------- -------------- void setGameSpeed () // bu 20 dan yuqori darajani to'xtatadi, bu o'yinni o'ynatib bo'lmaydi {agar (drawSpeed <21) {drawSpeed = drawSpeed+2; }}// ------------------------------------ CRASHni aniqlang ---------- ----------------------- void detectCrash () {

agar (dushman0PosX = 0 && dushman0PosY == carYTmp)

{// Serial.println ("0 -trafikda CRAASSSSHHHHHHEEEDDD ustidan o'yin"); O'yin tamom(); } if (dushman1PosX = 0 && dushman1PosY == carYTmp) {//Serial.println("O'yin CRAASSSSHHHHHHHEEEEDDD 1 -trafikda "); O'yin tamom(); } if (dushman2PosX = 0 && dushman2PosY == carYTmp) {//Serial.println("O'yin CRAASSSSHHHHHHHEEEEDDD 2 -trafikda "); O'yin tamom(); }}

bu displeyni chizadigan tartiblar.

// ------------------------------- YO'LNI YO'L --------------- -------------------- void drawRoad () // X, Y, uzunlik, kenglik {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 (); } // ----------------------------------------- Dushmanlarni torting ---- --------------------------------------- bo'sh dushmanlarDraw () {// X, Y, bmp nomi, kengligi, balandligi, rangi displeyi.drawBitmap (dushman0PosX, dushman0PosY, DUSMAN0, DUSMAN0_WIDTH, DUSUM0_YUQORI, 1); dushman0PosX = dushman0PosX-chizish Tezligi; display.drawBitmap (dushman1PosX, dushman1PosY, DUSHMAN1, DUYMAN1_WIDTH, DUYMAN1_YUQORI, 1); dushman1PosX = dushman1PosX-chizish Tezligi; display.drawBitmap (dushman2PosX, dushman2PosY, Dushman2, ENEMY2_WIDTH, Dushman2_YUQORI, 1); dushman2PosX = dushman2PosX-chizish Tezligi; display.display (); agar (dushman0PosX> 231 && dushman0PosX231 && dushman1PosX <255) {dushman1PosX = randomPosX (); dushman1PosY = tasodifiyPosY (); checkDuplicate (); }

agar (dushman2PosX> 231 && dushman2PosX <255) {dushman2PosX = randomPosX (); dushman2PosY = randomPosY (); }} // ------------------------------------ DISPLAYNI YANGILASH -------- ---------------------------------------- void updateDisplay () {display.clearDisplay (); display.drawBitmap (carPosX, carPosY [carPosYCnt], CARSPRITE, 30, 15, 1); display.fillRect (100, 0, 28, 10, Qora); display.setCursor (100, 0); display.setTextColor (oq, qora); display.println (ball); display.display ();

}

// ------------------------- bosish tsiklini kuting ------------------- ------

// bu bosh ekranning kodi bekor bekor waitForPress () {splashScreen (); bool kutish = 0; // loop haqiqiy tugagandan so'ng tugaydi display.clearDisplay (); vaqt (kutish == 0) {

display.fillRect (19, 20, 90, 32, Qora); // matn uchun bo'sh fon

display.setTextColor (oq); display.setCursor (23, 24); display.setTextSize (0); display.println ("Ehtiyotsiz"); display.setCursor (36, 34); display.println ("poygachi"); display.drawBitmap (74, 24, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // x y w h r col display.drawRoundRect (21, 21, 86, 23, 4, WHITE); // chegara Snake display.drawRect (19, 20, 90, 33, oq); // chegara qutisi - 3 display.setCursor (25, 43); display.setTextSize (0); // shrift normal displeyga qaytariladi.println ("istalgan tugmani bosing"); display.fillRect (0, 0, 127, 8, Qora); display.setCursor (10, 0); display.print ("Yuqori ball:"); // yuqori ball displeyini ko'rsatish.print (highScore); display.display (); kutish = digitalRead (INTPIN); // tugma bosilganda kutish 1 tugashga o'zgarishini tekshirish uchun dirPressed = 0; // tiklash tugmasi hech qanday yo'nalishga bosilmaydi}} // -------------------------------------- ----- O'YINNI YANGILASH ----------------------------------------- void updateGame () {moveCar (); drawRoad (); enemysDraw (); // dushman1Draw (); // dushman2Draw (); metrCnt ++; aniqlashCrash (); if (metreCnt == 5) // hisobni ko'tarish uchun har 10 tsikl uchun ball qo'shadi {metreCnt = 0; ball ++; } agar (ball == taqqoslash+5) // o'yinni har 5 ochkodan maksimal 20 tezlikka tezlashtiradi {solishtiring = ball; setGameSpeed (); } noTone (SND); updateDisplay ();

}

// ------------------------------ O'YIN TAMOM---------------- ------------------------------

// bu tartib o'lik qahramon mashinasining atrofini chizadi, so'ngra o'yinni ekranda ko'rsatadi

void gameOver ()

{ohang (SND, 200, 200); // tovushni ijro etish uint8_t linePosX, linePosY, pixwidth, pixheight = 0; // avtomashina atrofida qutilar chizish uchun parametrlarni o'rnating linePosX = carPosY; linePosY = carYTmp; piksel kengligi = 30; pixheight = 15; display.drawRect (linePosX, linePosY, pixwidth, pixheight, WHITE); display.display (); uchun (int i = 0; i <= 26; i ++) // bu mashinani portlashni simulyatsiya qiladigan to'rtburchaklar shaklida o'rab oladi {linePosX = linePosX-2; linePosY = chiziqPosY-2; pixwidth = pixwidth+4; pixheight = pixheight+4; display.drawRect (linePosX, linePosY, pixwidth, pixheight, BLACK); display.drawRect (linePosX, linePosY, pixwidth, pixheight, WHITE); display.display (); ohang (SND, i*20, 50); kechikish (10); } display.setTextSize (2); display.setTextColor (oq, qora); display.setCursor (10, 23); ohang (SND, 50, 500); display.print ("O'YIN"); display.display (); kechikish (500); ohang (SND, 40, 500); display.print ("OVER"); display.setTextSize (0); display.display (); kechikish (3000); qayta ishga tushirish (); waitForPress (); }

// ---------------------------------------- O'YINNI QAYTA BOSHLASH ----- -------------------------------------------------- -----

void restartGame () // bu yuqori ballni nusxa ko'chiradi va barcha statistikani tiklaydi va tasodifiy pozitsiyalarni hosil qiladi

{if (score> = highScore) // ball yuqori ballardan yuqori ekanligini tekshiring {highScore = ball; // bitta bo'lsa, statement yuqori ballni yangilaydi}

ball = 0;

drawSpeed = 4; metrCnt = 0; carPosYCnt = 0; dushman0PosX = randomPosX (); dushman0PosY = randomPosY (); dushman1PosX = randomPosX (); dushman1PosY = tasodifiyPosY (); dushman2PosX = randomPosX (); dushman2PosY = randomPosY (); noTone (SND);

checkDuplicate ();

}

// ------------------------------------------------ -DUPLIKATNI CHEKLASH ----------------------------------------------- ------ void checkDuplicate () // bular to'siqlar bir xil o'yin maydonini egallaganligini tekshiradi {// Serial.println ("dublikati tekshiriladi"); if (dushman2PosX> 230 && dushman2PosX <255) {esa (dushman2PosY == dushman1PosY || dushman2PosY == dushman0PosY) {dushman2PosY = tasodifiyPosY (); }}

if (dushman0PosX> 230 && dushman0PosX230 && dushman2PosXenemy1PosX && dushman2PosX230 && dushman0PosXenemy1PosX && dushman0PosX

// ------------------------------------------- SPLASH EKRANI --- --------------------------------

bo'sh splashScreen ()

{displey.clearDisplay (); display.drawBitmap (0, 0, CRASH, CRASHWIDTH, CRASHHIGHT, 1); display.display (); kechikish (2000); } // ----------------------------------------------- SOZLASH ------------------------------------------------- ----------- void setup () {delay (100); // ishlar boshlasin // Serial.begin (9600); // bu va barcha seriyalarni sharhlamang. xato diag displey.begin uchun buyruqlar (SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay (); display.setTextColor (oq, qora); display.setTextWrap (noto'g'ri); display.dim (0); pinMode (INTPIN, INPUT); pinMod (UPPIN, INPUT); pinMode (DWNPIN, INPUT); pinMode (LFTPIN, Kirish); pinMode (RHTPIN, INPUT);

attachInterrupt (digitalPinToInterrupt (INTPIN), uzilishlar, RISING);

// to'siqlarni tasodifiy joylashtirish dushman0PosX = randomPosX (); dushman0PosY = randomPosY (); dushman1PosX = randomPosX (); dushman1PosY = tasodifiyPosY (); dushman2PosX = randomPosX (); dushman2PosY = randomPosY (); checkDuplicate (); // takroriy manzillarni tekshirish // Serial.println ("sozlash tugallandi"); splashScreen (); waitForPress (); } // ----------------------------------------------- ----- Loop -------------------------------------------- ----------

bo'sh halqa ()

{updateGame (); }

va bu deyarli hamma narsa, har qanday o'zgartirishlar va mulohazalar qabul qilinadi. Biz ekranning miltillashini hal qilishimiz kerak bo'lgan muammolar, uni qanday kamaytirishni ko'rib chiqishimiz kerak va dushman mashinalari hali ham o'sha joyni egallashga qodir.

Tavsiya: