Mündəricat:

Tələsik Racer Arduino OLED Oyunu, AdafruitGFX və Bitmap əsasları: 6 addım
Tələsik Racer Arduino OLED Oyunu, AdafruitGFX və Bitmap əsasları: 6 addım

Video: Tələsik Racer Arduino OLED Oyunu, AdafruitGFX və Bitmap əsasları: 6 addım

Video: Tələsik Racer Arduino OLED Oyunu, AdafruitGFX və Bitmap əsasları: 6 addım
Video: Arduino Mega + LCD Nokia 5110 2024, Iyul
Anonim
Tələsik Racer Arduino OLED Oyunu, AdafruitGFX və Bitmaps əsasları
Tələsik Racer Arduino OLED Oyunu, AdafruitGFX və Bitmaps əsasları
Tələsik Racer Arduino OLED Oyunu, AdafruitGFX və Bitmaps əsasları
Tələsik Racer Arduino OLED Oyunu, AdafruitGFX və Bitmaps əsasları

Bu təlimatda, Adafruit_GFX.c kitabxanasından istifadə edərək bit -xəritələri bir oyunda sprite kimi necə istifadə edəcəyimizə baxacağıq. Düşünə biləcəyimiz ən sadə oyun, yan sürüşmə zolağını dəyişdirən avtomobil oyunudur, nəticədə beta test cihazımız və köməkçi kodlayıcımız "Tələsik Racer" i avtomobil yolu ilə səhv yola sürmək üçün çox tələsik olduğuna görə bir ad olaraq qərar verdi !!.

Dövrümüzün dizaynı yuxarıda göstərilən şəkillərdədir və dövrənin necə işlədiyini izah edən Snake Instructables adlı son layihəmizdə/təlimatımızda ətraflı şəkildə izah edilmişdir.

tələb edəcəyik

Adafruit_GFX

Paint.net

Arduino IDE windowslinux

və zəhmət olmasa, qalan avadanlıqlar üçün İlan təlimatına baxın.

Təchizat

İlan Oyunu

Addım 1: Paint.net -in quraşdırılması

Paint.net quraşdırılır
Paint.net quraşdırılır
Paint.net quraşdırılır
Paint.net quraşdırılır
Paint.net quraşdırılır
Paint.net quraşdırılır

Paint. Net proqramını pulsuz istifadə etdiyimiz üçün Paint. Net -i buradan yükləyə bilərsiniz.

Paint.net yükləmək üçün yüklənmiş proqramı iki dəfə vurun və bundan sonra müsbət cavab verin, bəli, tamam, razıyam və yuxarıdakı şəkillər sizə istiqamət verəcək.

Addım 2: Sadə bir açılış ekranı çəkmək

Sadə bir açılış ekranı çəkmək
Sadə bir açılış ekranı çəkmək
Sadə bir açılış ekranı çəkmək
Sadə bir açılış ekranı çəkmək
Sadə bir açılış ekranı çəkmək
Sadə bir açılış ekranı çəkmək

Paint.net -də olanda "Fayl sonra yeni" düyməsini basaraq yeni bir şəkil yaradın, şəkil ölçüsünü 1260x620 olaraq təyin edin (ilk şəkilə baxın) yeni səhifəniz olanda ok düyməsini vurun, yalnız 2 rəngli qara və qələmdən istifadə edin alət (şəkil 2), açılış ekranınızın şəklini çəkdiyiniz zaman (və ya yapışdırdığınızda) görüntüyə vurun, sonra ölçüsünü dəyişin (image4), açılan pəncərədə ölçüsünü 1260x620 -dən 126x62 -ə (ekranınızdan 2 piksel kiçik) dəyişdirin (şəkil 5) OK düyməsini basın.

sonra Fayl menyusunu vurun və sonra qeyd edin (şəkil 6).

açılan fayl növündə açılan menyuda BMP (bitmap) seçin. (şəkil 7), bir fayl adı yazın və saxla düyməsini basın, açılan pəncərə 0 -a və 8 bit olaraq təyin olunduqda OK (şəkil 8)).

Addım 3: BMP -ni C Bitmap Faylına çevirmək

BMP -ni C Bitmap Faylına çevirmək
BMP -ni C Bitmap Faylına çevirmək
BMP -ni C Bitmap Faylına çevirmək
BMP -ni C Bitmap Faylına çevirmək
BMP -ni C Bitmap Faylına çevirmək
BMP -ni C Bitmap Faylına çevirmək
BMP -ni C Bitmap Faylına çevirmək
BMP -ni C Bitmap Faylına çevirmək

İndi şəklimizi arduino -nun başa düşə biləcəyi bir formata çevirməliyik, amma bunu etmək üçün çoxlu vasitələr var, amma marlin web saytının bitmap çeviricisidir.

marlinfw.org/tools/u8glib/converter.html

Şəkil 1 -də göstərilən veb saytı açmaq üçün yuxarıdakı linkdən istifadə edərək bu bölməyə başlayırıq

faylı seçin və əvvəllər yaratdığınız bitmapı seçin (şəkil 2)

marlin bitmap çeviricisi, şəklinizi avtomatik olaraq c koduna çevirəcək, kodu vurğulamalı olan kodu iki dəfə vurun, sonra sağ klikləyin və kopyalayın (şəkil 3)

sonrakı Sağ klik və yeni bir mətn sənədi yaradırıq (şəkil 4)

yeni sənədi iki dəfə vurun, açıldıqda sağ vurun və kodu yapışdırın (şəkil 5)

bundan sonra #include kodunun yuxarısına yaxın bir sətir əlavə etməliyik, bu, bitmap məlumatlarını arduino üzərindəki flash yaddaşa saxlamağa imkan verir, sonra #define genişliyini, hündürlüyünü və adını istifadə etmək daha asan olan bir şey adlandırırıq. Şəkil 6 -da, təsadüfi olaraq meydana gətirdiyimiz simvolların adlarını aşağıda qeyd etdiyimiz nümunəyə dəyişirik

#LOGOWIDTH təyin edin

#LOGOHEIGHT təyin edin

const imzasız simvol LOGOPIC PROGMEM

Növbəti klik faylını sonra qeyd edin, faylı log.c olaraq qeyd edin, log.c üzərinə sağ vurun və kopyalayın.

Addım 4: DrawBitmap istifadə edərək LOGO göstərin

DrawBitmap istifadə edərək LOGO göstərilməsi
DrawBitmap istifadə edərək LOGO göstərilməsi
DrawBitmap istifadə edərək LOGO göstərilməsi
DrawBitmap istifadə edərək LOGO göstərilməsi
DrawBitmap istifadə edərək LOGO göstərilməsi
DrawBitmap istifadə edərək LOGO göstərilməsi
DrawBitmap istifadə edərək LOGO göstərilməsi
DrawBitmap istifadə edərək LOGO göstərilməsi

İndi arduino IDE -ni yükləyirik və yeni eskiz yaradırıq və logoexample.ino adında saxlayırıq, sonra arduino -da bir fırıldaqçı olaraq fayl menyusuna vurun və sonra qeyd edin, layihə qovluğuna qayıdın və sağ vurun.c faylına yapışdırın. (şəkil 2) sonra ləğv et düyməsini basın, bu, faylı yapışdırmaq üçün qovluğa baxmaq məcburiyyətində qalmanızı təmin edir.

aşağıdakı kodu arduino IDE -ə yazın və ya ino -da yükləyin.

(öyrənməyi öyrənməyin ən yaxşı yolu olan faylları kopyalayıb yapışdırmaq əvəzinə yazmağı məsləhət görürük)

#include /* saxladığınız yerə görə dəyişəcək

ino ümumiyyətlə C: / Users / ~ istifadəçi adı / Documents / Arduino / project ~ ad qovluğundadır

və bitmapimizi bu şəkildə bağlayırıq */

#daxil edin

#daxil edin

uint8_t bmpX, bmpY = 0; /* 2 X 8 bit tam ədədlər üçün ehtiyat yaddaş, bizə yalnız 8 bit ints lazımdır

dəyər heç vaxt 128 (piksel) -dən yüksək olmadığından 8 bit ints (maksimum dəyəri 255 olan) istifadə edərək yerdən qənaət edə bilərik */

boş quraşdırma ()

{gecikmə (100); // displeyə və s. ekranda işə salınması üçün vaxt verin.begin (SSD1306_SWITCHCAPVCC, 0x3C); // bu, display.clearDisplay () ekranını işə salmaq üçündür; // boş ekranla başlayın}

/* unutmayın ki, bu şərhləri istinad üçün yazmağınız lazım deyil ……………

Diqqətimizi çəkəcəyimiz əmr display.drawBitmap -dır, bu da sıçrayış ekranımızı çəkir. (bmpX, bitmapin X bağlama nöqtəsinin olacağı ekrandakı X oxu dəyəridir və bmpX və bmpY, hərəkət yaratmaq üçün maraqlandığımız dəyərlərdir (bmpY, Y çapanın olduğu ekrandakı Y oxu dəyəridir) bitmapin nöqtəsi logo.c -də təyin etdiyimiz kimi istinad adlarını əldə edəcəyik. Çapa nöqtəsindən bitmap (LOGOHEIGHT), X və Y piksellərini bağlama nöqtəsindən bitmap çəkmək üçün neçə piksel aşağı (Y) aşağıya endirmək əl ilə daxil edilə bilər, lakin hamısını xatırlamaqdan əvvəl əvvəlcədən təyin edilmiş olanları istifadə etmək daha asandır (1, son dəyər ekran mono 0 qara 1 ağ olduğu üçün rəngdir. tamam, növbəti sətirdən yazmağa başlayın: ¬D lol*/ void loop () {display.clearDisplay (); // ekranı boşaldın // bitmap sol üst, x, y, bitmap adı, eni X, hündürlüyü Y, rəngli ekran.drawBitmap (bmpX, bmpY, LOGOPIC, LOGOWIDTH, LOGOHEIGHT, 1); display.display (); // bu, əslində tamponu ekrana çəkir}

Arduino kodunuzu yükləyin və işlədiyini təsdiq edin (şəkil 3).

Addım 5: Bitmap Sprite hərəkət etdirin

Image
Image
Bir Bitmap Sprite hərəkət
Bir Bitmap Sprite hərəkət
Bir Bitmap Sprite hərəkət
Bir Bitmap Sprite hərəkət

əvvəlki təlimatlardan istifadə edərək paint.net istifadə edin və 30x15 piksel (şəkil 1) olan yeni bir fayl hazırlayın və gənc dizaynerimizin əvvəlcə ön şüşədən başladığı kobud bir avtomobil çəkin (şəkillər 2 və 3).

Yenə bir Windows bmp faylı olaraq qeyd edin (2 -ci addımda olduğu kimi), C bitmapinə (addım 3) çevirin və car.c faylını (və ya qərar verdiyiniz şeyi) yeni yaradılmış arduino ino (eskiz) ilə eyni qovluğa yerləşdirin. fayl.

(p.s. avtomobilə #clude xəttini əlavə etməyi unutmayın. c bu bizi tez -tez yaxalamaq üçün istifadə olunurdu)

Əvvəlcə ekvivalentinizi car.c ilə əlaqələndirin

#daxil edin

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

Adafruit_SSD1306 ekran (128, 64); // ekranın qətnaməsini təyin edin

/* bmpX/bmpY, bu dəyərləri dəyişdirərkən və yenidən çəkərkən dəyişənlərə ehtiyacımız var

Ekranda hərəkət animasiya effekti necə yaranır. hitSide və hitTop, ekranda sprite saxlamağımızdır */ uint8_t bmpX, bmpY = 0; // 2 8 bit ints (0-255) üçün yaddaş ehtiyatı saxlamalıyıq, daha böyük 128-ə ehtiyacımız yoxdur, ən çox istifadə olunan bool hitSide = 0 olacaq; bool hitTop = 0;

boş quraşdırma ()

{gecikmə (100); // displeyə və s. ekranda işə salınması üçün vaxt verin.begin (SSD1306_SWITCHCAPVCC, 0x3C); // bu, display.clearDisplay () ekranını işə salmaq üçündür; // boş bir ekranla başlayın

}

boşluq döngəsi ()

{display.clearDisplay (); // ekranı boşaldır // sol üstdən çəkilmiş bitmap, x, y, bitmapin adı, eni X, hündürlüyü Y, rəngli ekran.drawBitmap (bmpX, bmpY, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // display.display (); // bu, əslində tamponu ekrana çəkir/ * bu şəkildə ekranın kənarını izləyirik və bir piksel əlavə edib yuxarıdan aşağıya doğru hərəkət etdirəcəyimizə qərar veririk və ya bir piksel çıxarırıq (aşağıdan yuxarıya doğru hərəkət edirik) */ keçid (hitSide) // bu, boole əsasında avtomobilin istiqamətini seçir {hal 0: bmpX ++; fasilə;

hal 1:

bmpX-; fasilə; } // bu 2 if ifadəsi boolu doğru və ya yanlış olaraq təyin edərsə (bmpX == 0) {hitSide = 0; } if (bmpX == 96) // ekranın eni minus avtomobil {hitSide = 1; } // Y oxu üçün yuxarıdakı kimidirsə (bmpY == 0) {hitTop = 0; } if (bmpY == 49) // ekran hündürlüyü minik avtomobil hündürlüyü {hitTop = 1; } keçid (hitTop) {hal 0: bmpY ++; fasilə; hal 1: bmpY--; fasilə; }

}

proqramın işlədiyini əlavə olunmuş videoda görə bilərsiniz

Addım 6: Sürmə Oyununun Hazırlanması

Image
Image

Əvvəlcə dərslərin əvvəlki mərhələlərində olduğu kimi 30x15 piksellik bir neçə fərqli avtomobil və ya maneə çəkərək başlayırıq. Sonra onları c bitmaplərə çeviririk və kodu bağlayırıq.

#include // bu yollar asılı olaraq dəyişməli olacaq

// faylları saxladığınız yer haqqında // redaktə edin: // "" ilə əvəz etsəniz, tam yolu // öz kitabxanalarınızla // tələb etmədiyinizi öyrəndim #include

#daxil edin

#daxil edin #daxil edin

#daxil edin

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

Adafruit_SSD1306 ekran (128, 64); // ekran parametrlərini təyin edin

dəyişənləri və sabit dəyərləri təyin edin

// giriş pinlərini təyin edin, bunlar heç vaxt dəyişmədikləri arduino -dakı pinlərdir #tanımlayın #INTPIN 3 -ü təyin edin // yalnız 2 və 3 -cü pinlər UNO -da kəsişmə pinləri ola bilər #UPPIN 4 -ü təyin edin // bunlar müvafiq açarla əlaqəli sancaqlardır #define DWNPIN 5 #define LFTPIN 6 #dehine RHTPIN 7 #define SND 9 // istiqamətləri təyin edin

#defire DIRUP 1 // bu dəyərlər "ilanın" qərar vermək üçün baxdığı şeydir-

#DIRDOWN 2 təyin edin // ilanın gedəcəyi istiqamət #DIRLEFT 3 #DIRRIGHT 4 təyin edin

uint8_t dirPressed = 0; // hündürlüyün hansı nöqtəyə qalxdığını öyrənmək üçün istiqaməti qeyd etmək üçün dəyər

// booleans mağazası, hansı pin ucaldı

bool BUTUP = 0; bool BUTDWN = 0; bool BUTLFT = 0; bool BUTRHT = 0; // maşının mövqeyi üçün standartlar uint8_t carPosX = 1; uint8_t carPosY = {0, 16, 32, 48}; // serialın cahnging dəyərinə ehtiyacı var

uint8_t lanePosArr = {0, 16, 32, 48}; // hər zolağın olduğu yerdə saxlamaq üçün sıra

uint8_t carPosYCnt = 0; uint8_t carYTmp = 0; // yoldakı xətlər üçün dəyişənlər uint8_t roadLineX1 = 51; // bunlar əvvəlində əvvəlcədən təyin olunur, sonra xətlər sorunsuz görünür uint8_t roadLineX2 = 102; uint8_t roadLineX3 = 153; uint8_t roadLineX4 = 254; uint8_t roadLineX5 = 200;

// bu, oyun sahəsinin bir anda neçə piksel hərəkət etməsidir

uint8_t drawSpeed = 4;

// düşmən üçün variantlar0

uint8_t düşmən0PosX = 255; uint8_t düşmən0PosY = 0; uint8_t düşmən1PosX = 255; uint8_t düşmən1PosY = 0; uint8_t düşmən2PosX = 255; uint8_t düşmən2PosY = 0;

// təsadüfi maneələrə bir zolaq nömrəsi təyin etmək üçün varialble

uint8_t laneGen = 0;

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

// hesab sayğacı

uzun hesab = 0; // bu hesab:/ lol uzun müqayisə = 0; // uzun highScore = 25 ilə müqayisə etmək üçün hesabı son səviyyədə saxlayır; uint8_t metreCnt = 0;

funksiyaları başladığımız yer budur

// bu, kəsilmə aktivdirsə void interruptressed () {delay (150); updateDirection (); } // DIR boollarını yoxlayaraq var istiqamətdə olan dəyərləri yeniləyin // --------------------------------- YÖNLƏMƏ YÖNÜ (oyunçu)- ------------------------- void updateDirection () {//Serial.println("updateDirection Called "); BUTUP = digitalRead (UPPIN); BUTDWN = digitalRead (DWNPIN); BUTLFT = digitalRead (LFTPIN); BUTRHT = digitalRead (RHTPIN); əgər (BUTUP == doğru) {dirPressed = DIRUP; } əgər (BUTDWN == doğru) {dirPressed = DIRDOWN; } əgər (BUTLFT == doğru) {dirPressed = DIRLEFT; } əgər (BUTRHT == doğru) {dirPressed = DIRRIGHT; }

}

// ------------------------------- Maşın HAREKET ET --------------- -------------------------

// bu, avtomobilin sprite -ini aparan ekranı yeniləyəcək

boş hərəkət CarCar ()

{switch (dirPressed) {case DIRUP: carPosYCnt--; carPosY [carPosYCnt]; ton (SND, 100, 100); əgər (carPosYCnt == 255) {carPosYCnt = 0; } carYTmp = carPosY [carPosYCnt]; dirPressed = 0; // Serial.println ("carPosY up"); // Serial.println (carPosYCnt); fasilə; DIRDOWN işi: carPosYCnt ++; ton (SND, 100, 100); əgər (carPosYCnt == 4) {carPosYCnt = 3; } // Serial.println ("carPosY"); // Serial.println (carPosYCnt); carYTmp = carPosY [carPosYCnt]; dirPressed = 0; fasilə; // şərh etdi avtomobil sola və sağa toqquşma aşkar etməyi o qədər də yaxşı deyil /* vəziyyət DIRLEFT: carPosX--; əgər (carPosX == 0) {carPosX = 1; } // Serial.println ("carPosX"); // Serial.println (carPosX); dirPressed = 0; fasilə; */ case DIRRIGHT: // yalnız əylənmək üçün sağa basarsanız oyun səs -küy salacaq (SND, 100, 50); // carPosX ++; // əgər (carPosX == 128) // {// carPosX = 127; //} // Serial.println ("carPosX"); // Serial.println (carPosX); // dirPressed = 0; fasilə; } updateDisplay (); }

// -------------------------- TƏSDİF POS X ------------------- -----------

uint8_t randomPosX () // bu 2 prosedur maneələr üçün təsadüfi mövqe yaradır

{uint8_t posValTmp = 0; posValTmp = təsadüfi (129, 230); //Serial.println("random x "); //Serial.println(posValTmp); qayıt (posValTmp); }

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

uint8_t təsadüfiPosY ()

{uint8_t laneVal = 0; laneVal = təsadüfi (0, 4); // təsadüfi olmaq üçün əlavə bir zolaq əlavə edin, yəni həmin zolaqda olarkən ekranda heç bir obyekt yoxdur //Serial.println("RandomY "); //Serial.println(lanePosArr[laneVal]); dönüş (lanePosArr [laneVal]); }// ------------------------------- OYUN HIZINI AYARLA -------------- -------------- boşluq setGameSpeed () // bu, səviyyənin 20-dən yuxarı qalxmasını oyunun oynanılmaz hala gəlməsini dayandırır {əgər (drawSpeed <21) {drawSpeed = drawSpeed+2; }}// ------------------------------------ KRASI AÇIQ ---------- ----------------------- void detectCrash () {

əgər (düşmən0PosX = 0 && düşmən0PosY == carYTmp)

{// Serial.println ("0 Trafikə CRAASSSSHHHHHHEEEDDD üzərində Oyun"); oyun bitdi(); } əgər (düşmən1PosX = 0 && düşmən1PosY == carYTmp) {//Serial.println("Oyun CRAASSSSHHHHHHHEEEEDDD trafikə 1 "); oyun bitdi(); } if (düşmən2PosX = 0 && düşmən2PosY == carYTmp) {//Serial.println("Oyunda CRAASSSSHHHHHHHEEEEDDD 2 -ci trafikə girdi "); oyun bitdi(); }}

bunlar ekranı çəkən qaydalardır.

// ------------------------------- ÇİZİN YOLU --------------- --------------------- drawRoad () // X, Y, uzunluğu, eni {display.fillRect (roadLineX1, 15, 30, 4, BEYAZ); display.fillRect (roadLineX1, 30, 30, 4, BEYAZ); display.fillRect (roadLineX1, 45, 30, 4, BEYAZ); display.fillRect (roadLineX2, 15, 30, 4, BEYAZ); display.fillRect (roadLineX2, 30, 30, 4, BEYAZ); display.fillRect (roadLineX2, 45, 30, 4, BEYAZ); display.fillRect (roadLineX3, 15, 30, 4, BEYAZ); display.fillRect (roadLineX3, 30, 30, 4, BEYAZ); display.fillRect (roadLineX3, 45, 30, 4, BEYAZ); display.fillRect (roadLineX4, 15, 30, 4, BEYAZ); display.fillRect (roadLineX4, 30, 30, 4, BEYAZ); display.fillRect (roadLineX4, 45, 30, 4, BEYAZ); display.fillRect (roadLineX5, 15, 30, 4, BEYAZ); display.fillRect (roadLineX5, 30, 30, 4, BEYAZ); display.fillRect (roadLineX5, 45, 30, 4, BEYAZ);

roadLineX1 = roadLineX1-drawSpeed;

roadLineX2 = roadLineX2-drawSpeed; roadLineX3 = roadLineX3-drawSpeed; roadLineX4 = roadLineX4-drawSpeed; roadLineX5 = roadLineX5-drawSpeed; display.display (); } // ----------------------------------------- Düşmənləri Çək ---- --------------------------------------- boş düşmənDraw () {// X, Y, bmp adı, eni, hündürlüyü, rəng göstəricisi.drawBitmap (düşmən0PosX, düşmən0PosY, DÜŞMAN0, ENEMY0_WIDTH, ENEMY0_HEIGHT, 1); düşmən0PosX = düşmən0PosX-DrawSpeed; display.drawBitmap (düşmən1PosX, düşmən1PosY, DÜŞMAN1, ENEMY1_WIDTH, ENEMY1_HEIGHT, 1); düşmən1PosX = düşmən1PosX-çəkmə Sürəti; display.drawBitmap (düşmən2PosX, düşmən2PosY, DÜŞMAN2, ENEMY2_WIDTH, ENEMY2_HEIGHT, 1); düşmən2PosX = düşmən2PosX-DrawSpeed; display.display (); əgər (düşmən0PosX> 231 && düşmən0PosX231 && düşmən1PosX <255) {düşmən1PosX = təsadüfiPosX (); düşmən1PosY = təsadüfiPosY (); checkDuplicate (); }

if (düşmən2PosX> 231 && düşmən2PosX <255) {düşmən2PosX = təsadüfiPosX (); düşmən2PosY = təsadüfiPosY (); }} // ------------------------------------ EKRANI YENİLƏYİN -------- ---------------------------------------- void updateDisplay () {display.clearDisplay (); display.drawBitmap (carPosX, carPosY [carPosYCnt], CARSPRITE, 30, 15, 1); display.fillRect (100, 0, 28, 10, SİYAH); display.setCursor (100, 0); display.setTextColor (AĞ, SİYAH); display.println (hesab); display.display ();

}

// ------------------------- mətbuat düyməsini gözləyin ------------------- ------

// bu ana ekran kodunun etibarsız waitForPress () {splashScreen (); bool gözləmə = 0; // loop bu doğru olduqda bitir. display.clearDisplay (); isə (gözləmə == 0) {

display.fillRect (19, 20, 90, 32, SİYAH); // mətn üçün boş fon

display.setTextColor (BEYAZ); display.setCursor (23, 24); display.setTextSize (0); display.println ("Ehtiyatsız"); display.setCursor (36, 34); display.println ("Yarışçı"); display.drawBitmap (74, 24, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // x y w h r col display.drawRoundRect (21, 21, 86, 23, 4, BEYAZ); // sərhəd İlan ekranı.drawRect (19, 20, 90, 33, BEYAZ); // sərhəd qutusu - 3 display.setCursor (25, 43); display.setTextSize (0); // yazı tipini normal display.println ("hər hansı bir düyməyə basın"); display.fillRect (0, 0, 127, 8, SİYAH); display.setCursor (10, 0); display.print ("Yüksək Puan:"); // yüksək hesab ekranını göstər.print (highScore); display.display (); gözləmə = digitalRead (INTPIN); // dirPressed = 0 olarkən düyməyə basılan gözləmənin 1 sona çevriləcəyini yoxlayın. // sıfırlama düyməsini heç bir istiqamətə basmayın}} // -------------------------------------- ----- OYUNU YENİLƏ ----------------------------------------- void updateGame () {moveCar (); drawRoad (); enemysDraw (); // düşmən1Draw (); // düşmən2Draw (); metreCnt ++; detectCrash (); if (metreCnt == 5) // hesabını artırmaq üçün hər 10 dövr üçün bir nöqtə əlavə edir {metreCnt = 0; bal ++; } if (hesab == müqayisə+5) // oyunu hər 5 baldan maksimum 20 sürətlə sürətləndirir {müqayisə = hesab; setGameSpeed (); } noTone (SND); updateDisplay ();

}

// ------------------------------ OYUN BİTDİ---------------- ------------------------------

// bu rutin ölü qəhrəman maşının ətrafında xətt çəkir, sonra oyunu ekranda göstərir

boş oyunOver ()

{ton (SND, 200, 200); // səsi uint8_t linePosX, linePosY, pixwidth, pixheight = 0 oynayın; // avtomobilin ətrafına qutular çəkmək üçün varsları təyin edin linePosX = carPosY; linePosY = carYTmp; piksel genişliyi = 30; pixheight = 15; display.drawRect (linePosX, linePosY, pixwidth, pixheight, BEYAZ); display.display (); for (int i = 0; i <= 26; i ++) // bu avtomobili partlayışı simüle edən düzbucaqlı şəkildə əhatə edir {linePosX = linePosX-2; linePosY = linePosY-2; pixwidth = pixwidth+4; pixheight = pixheight+4; display.drawRect (linePosX, linePosY, pixwidth, pixheight, SİYAH); display.drawRect (linePosX, linePosY, pixwidth, pixheight, BEYAZ); display.display (); ton (SND, i*20, 50); gecikmə (10); } display.setTextSize (2); display.setTextColor (AĞ, SİYAH); display.setCursor (10, 23); ton (SND, 50, 500); display.print ("OYUN"); display.display (); gecikmə (500); ton (SND, 40, 500); display.print ("OVER"); display.setTextSize (0); display.display (); gecikmə (3000); yenidən başladın (); waitForPress (); }

// ---------------------------------------- OYUNU BAŞLAT ----- -------------------------------------------------- -----

void restartGame () // bu yüksək balı kopyalayır və bütün statistikaları sıfırlayır və təsadüfi mövqelər yaradır

{if (score> = highScore) // hesabın yüksək hesabdan yüksək olub olmadığını yoxlayın {highScore = score; // yüksək balı yeniləmək üçün status varsa tək}

bal = 0;

drawSpeed = 4; metreCnt = 0; carPosYCnt = 0; düşmən0PosX = təsadüfiPosX (); düşmən0PosY = təsadüfiPosY (); düşmən1PosX = təsadüfiPosX (); düşmən1PosY = təsadüfiPosY (); düşmən2PosX = təsadüfiPosX (); düşmən2PosY = təsadüfiPosY (); noTone (SND);

checkDuplicate ();

}

// ------------------------------------------------ -TƏKRAR EDİN ----------------------------------------------- ------ void checkDuplicate () // maneələr eyni oyun məkanını tutub-tutmadığını yoxlayır {// Serial.println ("dublikat yoxlanılır"); if (düşmən2PosX> 230 && düşmən2PosX <255) {isə (düşmən2PosY == düşmən1PosY || düşmən2PosY == düşmən0PosY) {düşmən2PosY = təsadüfiPosY (); }}

if (düşmən0PosX> 230 && düşmən0PosX230 && düşmən2PosXenemy1PosX && düşmən2PosX230 && düşmən0PosXenemy1PosX && düşmən0PosX

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

boş splashScreen ()

{display.clearDisplay (); display.drawBitmap (0, 0, CRASH, CRASHWIDTH, CRASHHIGHT, 1); display.display (); gecikmə (2000); } // ----------------------------------------------- QURMAQ ------------------------------------------------- ----------- void setup () {gecikmə (100); // işlərin başlasın // Serial.begin (9600); // bu və bütün Seriallara münasibət bildirməyin. arıza diaqnozu əmrləri display.begin (SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay (); display.setTextColor (AĞ, SİYAH); display.setTextWrap (yanlış); display.dim (0); pinMode (GİRİŞ, GİRİŞ); pinMode (UPPIN, GİRİŞ); pinMode (DWNPIN, GİRİŞ); pinMode (LFTPIN, GİRİŞ); pinMode (RHTPIN, GİRİŞ);

attachInterrupt (digitalPinToInterrupt (INTPIN), kəsilmiş, yüksələn);

// təsadüfi maneələri yerləşdirin dushman0PosX = randomPosX (); düşmən0PosY = təsadüfiPosY (); düşmən1PosX = təsadüfiPosX (); düşmən1PosY = təsadüfiPosY (); düşmən2PosX = təsadüfiPosX (); düşmən2PosY = təsadüfiPosY (); checkDuplicate (); // dublikat yerləri yoxlayın // Serial.println ("quraşdırma tamamlandı"); splashScreen (); waitForPress (); } // ----------------------------------------------- ----- Döngü -------------------------------------------- ----------

boşluq döngəsi ()

{updateGame (); }

və bu olduqca çoxdur, hər hansı bir dəyişiklik və rəy xoş qarşılanacaqdır. Ekranın titrəməsini həll etməyimiz lazım olan məsələlər, onu necə azaltacağımızı araşdırmalıyıq və düşmən maşınları hələ də eyni məkanı tuta bilir.

Tövsiyə: