Obsah:

Reckless Racer Arduino OLED Game, AdafruitGFX a Bitmaps Základy: 6 krokov
Reckless Racer Arduino OLED Game, AdafruitGFX a Bitmaps Základy: 6 krokov

Video: Reckless Racer Arduino OLED Game, AdafruitGFX a Bitmaps Základy: 6 krokov

Video: Reckless Racer Arduino OLED Game, AdafruitGFX a Bitmaps Základy: 6 krokov
Video: Arduino Star Wars Game - how to make 2024, November
Anonim
Reckless Racer Arduino OLED Game, AdafruitGFX a Bitmaps Základy
Reckless Racer Arduino OLED Game, AdafruitGFX a Bitmaps Základy
Reckless Racer Arduino OLED Game, AdafruitGFX a Bitmaps Základy
Reckless Racer Arduino OLED Game, AdafruitGFX a Bitmaps Základy

V tomto tutoriále sa pozrieme na to, ako používať bitmapy pomocou knižnice Adafruit_GFX.c ako druhu škriatkov v hre. Najjednoduchšia hra, ktorú by sme si mohli predstaviť, je hra s automatickým striedaním jazdných pruhov a nakoniec sa náš beta tester a asistent kodéra rozhodli pre názov „Reckless Racer“, pretože je celkom bezohľadné, ak idete zlou cestou po diaľnici !!.

Dizajn nášho obvodu je na vyššie uvedených obrázkoch a je podrobne popísaný v našom poslednom projekte/návode tu Snake Instructables, ktorý popisuje, ako obvod funguje.

budeme požadovať

Adafruit_GFX

Paint.net

Arduino IDE windowslinux

a pozrite sa na návod na had pre ostatné vybavenie.

Zásoby

Hra s hadom

Krok 1: Inštalácia programu Paint.net

Inštalácia Paint.net
Inštalácia Paint.net
Inštalácia Paint.net
Inštalácia Paint.net
Inštalácia Paint.net
Inštalácia Paint.net

Používame paint.net, pretože softvér je bezplatný, takže používanie úplne zadarmo si môžete stiahnuť pomocou programu Paint. Net tu.

Ak chcete nainštalovať paint.net, dvakrát kliknite na stiahnutý program a odpovedzte kladne, napríklad ďalej, áno, ok, súhlasím a obrázky vyššie vám poskytnú návod.

Krok 2: Nakreslenie jednoduchej úvodnej obrazovky

Kreslenie jednoduchej úvodnej obrazovky
Kreslenie jednoduchej úvodnej obrazovky
Kreslenie jednoduchej úvodnej obrazovky
Kreslenie jednoduchej úvodnej obrazovky
Kreslenie jednoduchej úvodnej obrazovky
Kreslenie jednoduchej úvodnej obrazovky

Keď ste na webe paint.net, vytvorte nový obrázok kliknutím na položku Súbor a potom na nový, nastavte veľkosť obrázka na 1260 x 620 (pozri prvý obrázok) kliknite na tlačidlo OK, keď máte novú stránku, nakreslite úvodnú obrazovku pomocou iba 2 farieb čiernobielej farby pomocou ceruzky nástroj (obr. 2), keď nakreslíte (alebo prilepíte) obrázok úvodnej obrazovky, kliknite na obrázok a potom zmeňte veľkosť (obrázok 4), v rozbaľovacom zozname zmeňte veľkosť z 1260 x 620 na 126 x 62 (o 2 pixely menšia ako obrazovka) (obr. 5) Kliknite na tlačidlo OK.

potom kliknite na ponuku Súbor a potom uložte ako (obr. 6).

akonáhle sa v rozbaľovacej ponuke typu súboru zobrazí rozbaľovacie okno, vyberte položku BMP (bitmapa). (obr. 7), zadajte názov súboru a kliknite na tlačidlo uložiť, keď sa rozbaľovacie okno zobrazí ako nastavená hodnota dithering na 0 a nastavená na 8 bitov, kliknite na tlačidlo ok (obr.).

Krok 3: Konverzia bitmapového súboru BMP na C

Konvertovanie BMP na bitmapový súbor C
Konvertovanie BMP na bitmapový súbor C
Konvertovanie BMP na bitmapový súbor C
Konvertovanie BMP na bitmapový súbor C
Konvertovanie BMP na bitmapový súbor C
Konvertovanie BMP na bitmapový súbor C
Konvertovanie BMP na bitmapový súbor C
Konvertovanie BMP na bitmapový súbor C

Teraz musíme previesť náš obrázok do formátu, ktorému arduino rozumie, že je na to k dispozícii množstvo nástrojov, ale moje miesto „ísť na“je nástroj na prevod bitmapových webových stránok je marlin web…

marlinfw.org/tools/u8glib/converter.html

Túto časť teda spustíme pomocou vyššie uvedeného odkazu na otvorenie webovej stránky, ktorá je zobrazená na obrázku 1

kliknite na vybrať súbor a vyberte bitmapu, ktorú ste vytvorili predtým (obr. 2)

marlin bitmapový prevodník automaticky prevedie váš obrázok na kód c ľavým dvojitým kliknutím na kód, ktorý by mal kód zvýrazniť, potom pravým tlačidlom myši a kliknutím kliknite na skopírovať (obr. 3)

ďalej Vytvoríme pravé kliknutie a vytvoríme nový textový dokument (obr. 4)

dvakrát kliknite na nový dokument, pri otvorení kliknite pravým tlačidlom myši a vložte kód (obr. 5)

Ďalej musíme pridať riadok v hornej časti kódu #zahrnúť, čo nám umožňuje uložiť údaje bitmapy do pamäte flash na arduino, potom premenujeme #definovať šírku, výšku a názov na niečo jednoduchšie na používanie. tieto sú zvýraznené na obrázku 6, premenujeme ich z náhodne generovaných znakov premenujeme ich na podčiarknutý príklad nižšie

#define LOGOWIDTH

#define LOGOHEIGHT

konšt. nepodpísaný znak LOGOPICKÝ PROGMEM

potom kliknite na súbor, potom ho uložte ako, uložte súbor ako logo.c zatvorte poznámkový blok, kliknite pravým tlačidlom na logo.c a kliknite na skopírovať.

Krok 4: Zobrazenie LOGA pomocou DrawBitmap

Zobrazenie LOGA pomocou DrawBitmap
Zobrazenie LOGA pomocou DrawBitmap
Zobrazenie LOGA pomocou DrawBitmap
Zobrazenie LOGA pomocou DrawBitmap
Zobrazenie LOGA pomocou DrawBitmap
Zobrazenie LOGA pomocou DrawBitmap
Zobrazenie LOGA pomocou DrawBitmap
Zobrazenie LOGA pomocou DrawBitmap

Teraz načítame arduino IDE a vytvoríme nový náčrt a uložíme ho pomenovaný ako logoexample.ino, ďalej ako cheat v arduino ide kliknite na ponuku súborov a potom uložte ako, vráťte sa do priečinka projektu pravým tlačidlom myši a vložte do súboru.c (obr. 2), potom kliknite na tlačidlo Zrušiť. Vďaka tomu budete musieť prejsť do priečinka, ktorý chcete vložiť do súboru.

zadajte nasledujúci kód do IDE arduino alebo ho stiahnite do ino.

(najlepšie je naučiť sa písať, než kopírovať a vkladať alebo používať súbory uvedené nižšie)

#include /* toto sa líši v závislosti od toho, kde skladujete

ino zvyčajne v priečinku C: / Users / ~ užívateľské meno / Documents / Arduino / project ~ názov

a takto odkazujeme na našu bitmapu */

#zahrnúť

#zahrnúť

uint8_t bmpX, bmpY = 0; /* rezervujte pamäť na 2 x 8 bitové celé čísla, potrebujeme iba 8 bitov

pretože hodnota nikdy nie je vyššia ako 128 (pixelov), takže môžeme ušetriť miesto pomocou 8 bitových intov (ktoré majú maximálnu hodnotu 255) */

neplatné nastavenie ()

{oneskorenie (100); // dajte displeju atď. čas na zapnutie displeja.begin (SSD1306_SWITCHCAPVCC, 0x3C); // toto má inicializovať zobrazenie displeja.clearDisplay (); // začnite s prázdnou obrazovkou}

/* upozorňujeme, že tieto komentáre nemusíte písať, pretože slúžia na referenciu …………..

príkaz, na ktorý sa zameriame, je display.drawBitmap, to je to, čo kreslí našu úvodnú obrazovku. (bmpX, je hodnota osi X na obrazovke, kde bude kotviaci bod X bitmapy a bmpX a bmpY sú hodnoty, ktoré nás zaujímajú na vytvorenie pohybu (bmpY, je hodnota osi Y na obrazovke, kde je kotva Y bodom bitmapy bude, že získame referenčné názvy, ako sme ich definovali v logu.c (LOGOPIC, je názov bitmapy v #zahrnutom súbore logo.c (LOGOWIDTH, je počet pixelov naprieč (X), aby sa nakreslil bitmapa z bodu ukotvenia (LOGOHEIGHT, je počet pixelov nadol (Y) na vykreslenie bitmapy z bodu ukotvenia, že pixely X a Y naprieč je možné zadať ručne, ale je jednoduchšie použiť preddefinované pixely, ako si ich všetky zapamätať (1, posledná hodnota je farba, pretože obrazovka je mono 0 čierna 1 biela. v poriadku, začnite písať z nasledujúceho riadku: ¬D lol*/ void loop () {display.clearDisplay (); // vyprázdnite obrazovku // bitmapu nakreslenú z vľavo hore, x, y, názov bitmapy, šírka X, výška Y, farebný displej.drawBitmap (bmpX, bmpY, LOGOPIC, LOGOWIDTH, LOGOHEIGHT, 1); display.display (); // v skutočnosti sa tým vykreslí vyrovnávacia pamäť na obrazovku}

nahrajte kód arduino a potvrďte, že funguje (obr. 3).

Krok 5: Presunutie bitmapového skřítka

Image
Image
Presunutie bitmapového skřítka
Presunutie bitmapového skřítka
Presunutie bitmapového skřítka
Presunutie bitmapového skřítka

podľa predchádzajúcich pokynov použite paint.net a vytvorte nový súbor s rozmermi 30 x 15 pixelov (obr. 1) a nakreslite hrubé auto, ktoré náš mladý dizajnér začína najskôr na prednom skle (obrázky 2 a 3).

znova ho uložte ako súbor bmp systému Windows (ako v kroku 2), preveďte na bitmapu C (krok 3) a umiestnite súbor car.c (alebo čokoľvek, pre čo sa rozhodnete) do rovnakého priečinka ako novovytvorené arduino ino (skica) súbor.

(p.s., nezabudnite pridať riadok #include do auta. c, čo nás často chytilo)

Najprv prepojte svoj ekvivalent automobilu.c

#zahrnúť

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

Displej Adafruit_SSD1306 (128, 64); // nastavenie rozlíšenia displeja

/* bmpX/bmpY potrebujeme, aby to boli premenné pri zmene týchto hodnôt a prekreslení

obrazovka je spôsob, akým vytvárame efekt pohybovej animácie. hitSide a hitTop je spôsob, akým udržujeme sprite na obrazovke */ uint8_t bmpX, bmpY = 0; // rezervná pamäť na 2 8 bitové palce (0-255) nepotrebujeme väčšiu 128 bude najväčší počet použitých bool hitSide = 0; bool hitTop = 0;

neplatné nastavenie ()

{oneskorenie (100); // dajte displeju atď. čas na zapnutie displeja.begin (SSD1306_SWITCHCAPVCC, 0x3C); // toto má inicializovať zobrazenie displeja.clearDisplay (); // začnite s prázdnou obrazovkou

}

prázdna slučka ()

{display.clearDisplay (); // vyprázdnenie obrazovky // bitmapa nakreslená zľava hore, x, y, názov bitmapy, šírka X, výška Y, farebné zobrazenie.drawBitmap (bmpX, bmpY, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // display.display (); // toto vlastne čerpá vyrovnávaciu pamäť na displej vždy/ * takto sledujeme okraj obrazovky a rozhodujeme, či pridať pixel posunúť zhora nadol) alebo odstrániť pixel (posunúť zdola nahor) */ prepnúť (hitSide) // toto vyberie smer auta na základe boole {prípad 0: bmpX ++; prestávka;

prípad 1:

bmpX--; prestávka; } // tieto 2 if príkazy nastavia bool na true alebo false if (bmpX == 0) {hitSide = 0; } if (bmpX == 96) // šírka obrazovky mínus auto {hitSide = 1; } // to isté ako vyššie pre os Y, ak (bmpY == 0) {hitTop = 0; } if (bmpY == 49) // výška obrazovky mínus výška auta {hitTop = 1; } prepínač (hitTop) {prípad 0: bmpY ++; prestávka; prípad 1: bmpY--; prestávka; }

}

program, ktorý funguje, môžete vidieť na priloženom videu

Krok 6: Vytvorenie hry pre vodiča

Image
Image

Najprv začneme kreslením niekoľkých rôznych áut alebo prekážok, ako v predchádzajúcich fázach tutoriálu, a vytvoríme ich s rozmermi 30 x 15 pixelov. Potom ich skonvertujeme na c bitmapy a prepojíme v kóde.

#include // tieto cesty sa budú musieť zmeniť v závislosti od toho

// kde ukladáte súbory // edit: práve som zistil, či nahradíte // za "" nevyžadujete úplnú cestu // s vašimi vlastnými knižnicami #include

#zahrnúť

#include #include

#zahrnúť

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

Displej Adafruit_SSD1306 (128, 64); // definujte parametre zobrazenia

definovať premenné a pevné hodnoty

// definujte vstupné piny toto sú piny na Arduine, ktoré sa nikdy nezmenia #definujte #definujte INTPIN 3 // iba piny 2 a 3 môžu byť prerušovacími kolíkmi na UNO #definujte UPPIN 4 // toto sú piny spojené tp relevantný prepínač #definovať DWNPIN 5 #define LFTPIN 6 #define RHTPIN 7 #define SND 9 // definovať smery

#define DIRUP 1 // na tieto hodnoty sa pozerá „had“, aby sa rozhodol-

#define DIRDOWN 2 // smer, ktorým sa bude had uberať #define DIRLEFT 3 #define DIRRIGHT 4

uint8_t dirPressed = 0; // hodnota pre registráciu smeru pohybu, na ktorom kolíku bol vysoký

// booleovský obchod, ktorého kolík sa zvýšil

bool BUTUP = 0; bool BUTDWN = 0; bool BUTLFT = 0; bool BUTRHT = 0; // vars pre polohu auta uint8_t carPosX = 1; uint8_t carPosY = {0, 16, 32, 48}; // potrebuje hodnotu uloženú v poli

uint8_t lanePosArr = {0, 16, 32, 48}; // pole na uloženie tam, kde je každý pruh

uint8_t carPosYCnt = 0; uint8_t carYTmp = 0; // premenné pre čiary na ceste uint8_t roadLineX1 = 51; // tieto sú preddefinované na začiatku, potom sa čiary javia ako plynulé uint8_t roadLineX2 = 102; uint8_t roadLineX3 = 153; uint8_t roadLineX4 = 254; uint8_t roadLineX5 = 200;

// toto je počet pixelov, v ktorých sa hracia plocha pohybuje súčasne

uint8_t drawSpeed = 4;

// vars pre nepriateľa0

uint8_t nepriateľ0PosX = 255; uint8_t nepriateľ0PosY = 0; uint8_t nepriateľ1PosX = 255; uint8_t nepriateľ1PosY = 0; uint8_t nepriateľ2PosX = 255; uint8_t nepriateľ2PosY = 0;

// premenná na náhodné priradenie čísla jazdného pruhu prekážkam

uint8_t laneGen = 0;

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

// počítadlo skóre

dlhé skóre = 0; // toto je skóre:/ lol dlhé porovnanie = 0; // toto uloží skóre na poslednú úroveň nahor na porovnanie späť k dlhému highScore = 25; uint8_t metreCnt = 0;

tu začíname funkcie

// toto je sada príkazov, ak je prerušenie aktivované neplatné prerušené () {delay (150); updateDirection (); } // aktualizujte, ktorá hodnota je v smere var, kontrolou boolov DIR // -------------------------- UPDATE DIRECTION (prehrávač)- ------------------------- neplatná aktualizáciaDirection () {//Serial.println("updateDirection Called "); BUTUP = digitalRead (UPPIN); BUTDWN = digitalRead (DWNPIN); BUTLFT = digitalRead (LFTPIN); BUTRHT = digitalRead (RHTPIN); if (BUTUP == true) {dirPressed = DIRUP; } if (BUTDWN == true) {dirPressed = DIRDOWN; } if (BUTLFT == true) {dirPressed = DIRLEFT; } if (BUTRHT == true) {dirPressed = DIRRIGHT; }

}

// ------------------------------- PRESUNUTIE AUTA --------------- -------------------------

// tým sa aktualizuje obrazovka pohybovača automobilového škriatka

void moveCar ()

{switch (dirPressed) {case DIRUP: carPosYCnt--; carPosY [carPosYCnt]; tón (SND, 100, 100); if (carPosYCnt == 255) {carPosYCnt = 0; } carYTmp = carPosY [carPosYCnt]; dirPressed = 0; // Serial.println ("carPosY up"); // Serial.println (carPosYCnt); prestávka; prípad DIRDOWN: carPosYCnt ++; tón (SND, 100, 100); if (carPosYCnt == 4) {carPosYCnt = 3; } // Serial.println ("carPosY"); // Serial.println (carPosYCnt); carYTmp = carPosY [carPosYCnt]; dirPressed = 0; prestávka; // komentované auto schopné pohybu vľavo a vpravo detekcia kolízií ešte nie je taká dobrá /* prípad DIRLEFT: carPosX--; if (carPosX == 0) {carPosX = 1; } // Serial.println ("carPosX"); // Serial.println (carPosX); dirPressed = 0; prestávka; */ case DIRRIGHT: // len pre zábavu, ak stlačíte pravé tlačidlo, hra vydá zvuk (SND, 100, 50); // carPosX ++; // if (carPosX == 128) // {// carPosX = 127; //} // Serial.println ("carPosX"); // Serial.println (carPosX); // dirPressed = 0; prestávka; } updateDisplay (); }

// -------------------------- NÁHODNÝ POS X ------------------- -----------

uint8_t randomPosX () // tieto 2 rutiny len generujú náhodnú pozíciu pre prekážky

{uint8_t posValTmp = 0; posValTmp = náhodný (129, 230); //Serial.println("raddom x "); //Serial.println(posValTmp); návrat (posValTmp); }

// --------------------------- NÁHODNÝ POS Y ------------------ ------------------

uint8_t randomPosY ()

{uint8_t laneVal = 0; laneVal = náhodný (0, 4); // pridanie extra pruhu pre náhodnosť, t.j. žiadny objekt na obrazovke, keď sa v tomto pruhu //Serial.println("RandomY "); //Serial.println(lanePosArr[laneVal]); návrat (lanePosArr [laneVal]); }// ------------------------------- NASTAVTE RÝCHLOSŤ HRY -------------- -------------- void setGameSpeed () // toto zastaví úroveň vyššiu ako 20, čím sa stane hra nehratelná {if (drawSpeed <21) {drawSpeed = drawSpeed+2; }}// ------------------------------------ DETEKCIA ZRUŠENIA ---------- ----------------------- neplatné detectCrash () {

if (nepriatel0PosX = 0 && nepriatel0PosY == carYTmp)

{// Serial.println ("Hra cez CRAASSSSHHHHHHEEEEEDDD do návštevnosti 0"); koniec hry(); } if (nepriatel1PosX = 0 && nepriatel1PosY == carYTmp) {//Serial.println("Game Over CRAASSSSHHHHHHHEEEEEDDD do prevádzky 1 "); koniec hry(); } if (nepriatel2PosX = 0 && nepriatel2PosY == carYTmp) {//Serial.println("Game Over CRAASSSSHHHHHHHEEEEEDDD do prevádzky 2 "); koniec hry(); }}

toto sú rutiny, ktoré kreslia displej.

// ------------------------------- NAKRESLI CESTU --------------- --------------------- neplatné drawRoad () // X, Y, dĺžka, šírka {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 (); } // ----------------------------------------- NAKRESLI nepriateľov ---- --------------------------------------- neplatné enemysDraw () {// X, Y, názov bmp, šírka, výška, farebný displej.drawBitmap (nepriateľ0PosX, nepriateľ0PosY, ENEMY0, ENEMY0_WIDTH, ENEMY0_HEIGHT, 1); nepriateľ0PosX = nepriateľ0PosX-drawSpeed; display.drawBitmap (nepriatel1PosX, nepriatel1PosY, ENEMY1, ENEMY1_WIDTH, ENEMY1_HEIGHT, 1); nepriateľ1PosX = nepriateľ1PosX-drawSpeed; display.drawBitmap (nepriateľ2PosX, nepriateľ2PosY, ENEMY2, ENEMY2_WIDTH, ENEMY2_HEIGHT, 1); nepriateľ2PosX = nepriateľ2PosX-drawSpeed; display.display (); if (nepriatel0PosX> 231 && nepriatel0PosX231 && nepriatel1PosX <255) {nepriatel1PosX = randomPosX (); nepriateľ1PosY = randomPosY (); checkDuplicate (); }

if (nepriatel2PosX> 231 && nepriatel2PosX <255) {nepriatel2PosX = randomPosX (); nepriateľ2PosY = randomPosY (); }} // ------------------------------------ UPDATE DISPLAY -------- ---------------------------------------- neplatná aktualizáciaDisplay () {display.clearDisplay (); display.drawBitmap (carPosX, carPosY [carPosYCnt], CARSPRITE, 30, 15, 1); display.fillRect (100, 0, 28, 10, ČIERNY); display.setCursor (100, 0); display.setTextColor (BIELA, ČIERNA); display.println (skóre); display.display ();

}

// ------------------------- počkajte na stlačenie slučky ------------------- ------

// toto je kód domovskej obrazovky neplatný waitForPress () {splashScreen (); bool čakanie = 0; // slučka končí, keď je to pravda display.clearDisplay (); počas (čakania == 0) {

display.fillRect (19, 20, 90, 32, ČIERNY); // prázdne pozadie textu

display.setTextColor (BIELY); display.setCursor (23, 24); display.setTextSize (0); display.println („Bezohľadný“); display.setCursor (36, 34); display.println („pretekár“); display.drawBitmap (74, 24, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // x y w h r col display.drawRoundRect (21, 21, 86, 23, 4, WHITE); // orámovanie Snake display.drawRect (19, 20, 90, 33, WHITE); // ohraničovací rámček - 3 display.setCursor (25, 43); display.setTextSize (0); // písmo späť na normálne zobrazenie.println ("stlačte ľubovoľné tlačidlo"); display.fillRect (0, 0, 127, 8, ČIERNY); display.setCursor (10, 0); display.print („High Score:“); // zobrazenie vysokého skóre display.print (highScore); display.display (); čakanie = digitalRead (INTPIN); // skontrolujte, či sa čakanie pri stlačení klávesu zmení na 1 končiac pri dirPressed = 0; // tlačidlo reset stlačte bez smerovania}} // -------------------------------------- ----- UPDATE GAME ----------------------------------------- neplatná aktualizačná hra () {moveCar (); drawRoad (); enemysDraw (); // nepriateľ1Draw (); // nepriateľ2Draw (); metreCnt ++; detectCrash (); if (metreCnt == 5) // pripočíta bod za každých 10 cyklov, aby sa dosiahlo skóre {metreCnt = 0; skóre ++; } if (skóre == porovnať+5) // zrýchli hru každých 5 bodov na maximálne 20 rýchlostí {porovnanie = skóre; setGameSpeed (); } noTone (SND); updateDisplay ();

}

// ------------------------------ KONIEC HRY---------------- ------------------------------

// táto rutina nakreslí čiary okolo auta mŕtveho hrdinu a potom zobrazí hru na obrazovke

prázdna hraOver ()

{tón (SND, 200, 200); // prehrávanie zvuku uint8_t linePosX, linePosY, pixwidth, pixheight = 0; // set vars to draw boxes around car linePosX = carPosY; linePosY = carYTmp; šírka pixelu = 30; pixheight = 15; display.drawRect (linePosX, linePosY, pixwidth, pixheight, WHITE); display.display (); for (int i = 0; i <= 26; i ++) // toto obklopuje auto v obdĺžnikoch simulujúcich výbuch {linePosX = linePosX-2; linePosY = linePosY-2; pixwidth = šírka pixelu+4; pixheight = pixheight+4; display.drawRect (linePosX, linePosY, pixwidth, pixheight, BLACK); display.drawRect (linePosX, linePosY, pixwidth, pixheight, WHITE); display.display (); tón (SND, i*20, 50); oneskorenie (10); } display.setTextSize (2); display.setTextColor (BIELA, ČIERNA); display.setCursor (10, 23); tón (SND, 50, 500); display.print („HRA“); display.display (); oneskorenie (500); tón (SND, 40, 500); display.print („NAD“); display.setTextSize (0); display.display (); oneskorenie (3000); restartGame (); waitForPress (); }

// ----------------------------------------- Reštartujte hru ----- ---------------------------------------------------------- -----

void restartGame () // toto skopíruje najvyššie skóre a vynuluje všetky štatistiky a vygeneruje náhodné pozície

{if (score> = highScore) // check to see if score higher than high score {highScore = score; // single if statment na aktualizáciu vysokého skóre}

skóre = 0;

drawSpeed = 4; metreCnt = 0; carPosYCnt = 0; nepriateľ0PosX = randomPosX (); nepriateľ0PosY = randomPosY (); nepriateľ1PosX = randomPosX (); nepriateľ1PosY = randomPosY (); nepriateľ2PosX = randomPosX (); nepriateľ2PosY = randomPosY (); noTone (SND);

checkDuplicate ();

}

// ------------------------------------------------ -SKONTROLUJTE DUPLIKÁT ----------------------------------------------- ------ void checkDuplicate () // tieto kontrolujú, či prekážky nezaberajú rovnaký herný priestor {// Serial.println ("duplikát začiarknutý"); if (nepriatel2PosX> 230 && nepriatel2PosX <255) {pricom (nepriatel2PosY == nepriatel1PosY || nepriatel2PosY == nepriatel0PosY) {nepriatel2PosY = nahodnyPosY (); }}

if (nepriatel0PosX> 230 && nepriatel0PosX230 && nepriatel2PosXenemy1PosX && nepriatel2PosX230 && nepriatel0PosXenemy1PosX && nepriatel0PosX

//------------------------------------------- ÚVODNÁ OBRAZOVKA --- --------------------------------

void splashScreen ()

{display.clearDisplay (); display.drawBitmap (0, 0, CRASH, CRASHWIDTH, CRASHHEIGHT, 1); display.display (); oneskorenie (2000); } // ----------------------------------------------- NASTAVIŤ ------------------------------------------------- ----------- neplatné nastavenie () {oneskorenie (100); // nech sa veci začnú // Serial.begin (9600); // odkomentujte toto a všetko sériové číslo. príkazy pre zobrazenie diagnostiky porúch.begin (SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay (); display.setTextColor (BIELA, ČIERNA); display.setTextWrap (false); display.dim (0); pinMode (INTPIN, INPUT); pinMode (UPPIN, INPUT); pinMode (DWNPIN, INPUT); pinMode (LFTPIN, INPUT); pinMode (RHTPIN, INPUT);

attachInterrupt (digitalPinToInterrupt (INTPIN), prerušované, RISING);

// náhodne umiestnite prekážky nepriateľ0PosX = randomPosX (); nepriateľ0PosY = randomPosY (); nepriateľ1PosX = randomPosX (); nepriateľ1PosY = randomPosY (); nepriateľ2PosX = randomPosX (); nepriateľ2PosY = randomPosY (); checkDuplicate (); // vyhľadanie duplicitných miest // Serial.println ("nastavenie dokončené"); Úvodná obrazovka(); waitForPress (); } // ----------------------------------------------- ----- SLUČKA -------------------------------------------- ----------

prázdna slučka ()

{updateGame (); }

a to je skoro všetko, akékoľvek úpravy a spätná väzba budú vítané. Problémy, ktoré musíme riešiť pri blikaní obrazovky, musíme preskúmať, ako ho zmierniť a nepriateľské autá môžu stále zaberať rovnaký priestor.

Odporúča: