Mundarija:
- Ta'minotlar
- 1 -qadam: Paint.net -ni o'rnatish
- 2 -qadam: oddiy ekranni chizish
- 3 -qadam: BMP -ni C bitmap fayliga aylantirish
- 4 -qadam: DrawBitmap yordamida logotipni ko'rsatish
- 5 -qadam: Bitmap Sprite -ni ko'chirish
- 6 -qadam: Haydash o'yinini yaratish
Video: Ehtiyotsiz Racer Arduino OLED o'yini, AdafruitGFX va bitmap asoslari: 6 qadam
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:23
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
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
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
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
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
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
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:
Visuino yordamida SSD1331 OLED displeyidagi (SPI) bitmap animatsiyasi: 8 qadam
Visuino yordamida SSD1331 OLED -displeyidagi (SPI) bitmap animatsiyasi: Ushbu qo'llanmada biz Visuino yordamida SSD1331 OLED -displeyda (SPI) oddiy animatsiya ko'rinishida bitmap tasvirini ko'rsatamiz va uning atrofida harakat qilamiz. Videoni tomosha qiling
Interfeys tugmachalari - Arduino asoslari: 3 qadam
Arduino tugmachalarini o'zaro bog'lash - bu tugmachani bosganingizda, kontaktlarning zanglashiga olib keladigan ikkita nuqtani bog'laydigan komponent. volt (tortishish kuchi orqali
Arduino OLED ilon o'yini: 3 qadam
Arduino OLED ilon o'yini: Salom va xush kelibsiz, bizning OLED o'yinini qanday qilish bo'yicha ko'rsatmalarimizga xush kelibsiz, bu loyiha biz birinchi o'yinimizni arduino, soooo bilan o'tkazmoqchi bo'lganimizda, biz nokiyadan ko'ra qaerdan boshlash kerakligini o'yladik. klassik ilon (hech bo'lmaganda
Arduino Esplora asoslari: 4 qadam
Arduino Esplora asoslari: Oh! Men sizni u erda ko'rmadim! Siz ajoyib Esplora taxtasi asoslarini o'rganishni xohlashingiz kerak. Xo'sh, kiring, kiring. Bu o'quv qo'llanma sizga Esplora bilan bir nechta nozik fokuslarni o'rgatadi
Uno yordamida Pro-mini dasturi (Arduino asoslari): 7 qadam (rasmlar bilan)
Uno yordamida Pro-mini dasturi (Arduino asoslari): Salom, men sizlarga yaqinda sotib olingan Arduino pro-mini bilan o'z tajribamni va o'z kodimni birinchi marta yuklaganim bilan o'rtoqlashmoqchiman. Eski Arduino Uno.Arduino pro-mini quyidagi xususiyatlarga ega: Bu men