Kazalo:

Brezskrbni Racer Arduino OLED igra, osnove AdafruitGFX in bitnih slik: 6 korakov
Brezskrbni Racer Arduino OLED igra, osnove AdafruitGFX in bitnih slik: 6 korakov

Video: Brezskrbni Racer Arduino OLED igra, osnove AdafruitGFX in bitnih slik: 6 korakov

Video: Brezskrbni Racer Arduino OLED igra, osnove AdafruitGFX in bitnih slik: 6 korakov
Video: Часть 1 — Аудиокнига «Лорд Джим» Джозефа Конрада (гл. 01–06) 2024, November
Anonim
Brezskrbni Racer Arduino OLED igra, AdafruitGFX in osnove bitnih kart
Brezskrbni Racer Arduino OLED igra, AdafruitGFX in osnove bitnih kart
Brezskrbni Racer Arduino OLED igra, AdafruitGFX in osnove bitnih kart
Brezskrbni Racer Arduino OLED igra, AdafruitGFX in osnove bitnih kart

V tej vadnici bomo pogledali, kako uporabiti bitne slike z uporabo knjižnice Adafruit_GFX.c kot neke vrste sprite v igri. Najpreprostejša igra, ki bi si jo lahko omislili, je igra avtomobila s spreminjanjem stranskega pomikanja pasov, na koncu sta se naš beta preizkuševalec in pomočnik koderja odločila za ime "Reckless Racer", saj je precej nepremišljeno voziti po napačni poti po avtocesti !!.

Zasnova našega vezja je na zgornjih slikah in je podrobno opisana v našem zadnjem projektu/vadnici Snake Instructables, ki opisuje, kako deluje vezje.

bomo zahtevali

Adafruit_GFX

Paint.net

Arduino IDE windowslinux

za ostalo opremo pa si oglejte vadnico Snake.

Zaloge

Igra kače

1. korak: Namestitev programa Paint.net

Namestitev programa Paint.net
Namestitev programa Paint.net
Namestitev programa Paint.net
Namestitev programa Paint.net
Namestitev programa Paint.net
Namestitev programa Paint.net

Paint.net uporabljamo, saj je programska oprema brezplačna, zato popolnoma brezplačno za uporabo lahko prenesete Paint. Net tukaj.

Če želite namestiti paint.net, dvokliknite preneseni program in na naslednji odgovor odgovorite pozitivno, ja, ok, se strinjam in zgornje slike vam bodo dale navodila.

2. korak: Narišite preprost zaslon

Risanje preprostega zaslone
Risanje preprostega zaslone
Risanje preprostega zaslone
Risanje preprostega zaslone
Risanje preprostega zaslone
Risanje preprostega zaslone

Ko ste v paint.net, ustvarite novo sliko, tako da kliknete Datoteka in nato novo, nastavite velikost slike na 1260 x 620 (glejte prvo sliko) Kliknite V redu, ko imate novo stran, s svinčnikom narišite zaslon v dveh barvah, črno -belo orodje (pic2), ko ste narisali (ali prilepili) sliko na začetnem zaslonu, kliknite sliko in nato spremenite velikost (image4), v pojavnem oknu spremenite velikost z 1260x620 na 126x62 (2 slikovni piki manjši od prikaza) (pic5) Kliknite V redu.

nato kliknite meni Datoteka in shranite kot (pic6).

ko se pojavno okno prikaže v spustnem meniju vrste datoteke, izberite BMP (bitna slika). (pic7), vnesite ime datoteke in kliknite shrani, ko se prikaže pojavno okno, nastavljeno na 0 in nastavljeno na 8 bit, kliknite v redu (pic8).

3. korak: Pretvorba BMP v datoteko bitne slike C

Pretvarjanje BMP v slikovno datoteko C
Pretvarjanje BMP v slikovno datoteko C
Pretvarjanje BMP v slikovno datoteko C
Pretvarjanje BMP v slikovno datoteko C
Pretvarjanje BMP v slikovno datoteko C
Pretvarjanje BMP v slikovno datoteko C
Pretvarjanje BMP v slikovno datoteko C
Pretvarjanje BMP v slikovno datoteko C

Zdaj moramo svojo sliko pretvoriti v obliko, ki jo arduino razume, da je za to na voljo veliko orodij, vendar moje "pojdi na" mesto orodja za pretvorbo bitnih slik spletnega mesta is marlin…

marlinfw.org/tools/u8glib/converter.html

Zato začnemo ta razdelek z uporabo zgornje povezave za odpiranje spletnega mesta, ki je prikazano na sliki 1

kliknite na izberite datoteko in izberite slikovno sliko, ki ste jo ustvarili prej (pic2)

pretvornik bitnih slik marlin bo samodejno pretvoril vašo sliko v kodo c levo dvakrat kliknite kodo, ki naj označi kodo, nato z desno tipko miške kliknite in kliknite kopiraj (pic3)

naslednji Ustvarimo desni klik in ustvarimo nov besedilni dokument (pic4)

dvokliknite nov dokument, ko se odpre desni klik in prilepite kodo (pic5)

nato moramo dodati vrstico na vrhu kode #include, ki nam omogoča shranjevanje bitnih podatkov v pomnilnik flash na arduinu, nato preimenujemo #define width, height in name v nekaj lažjega za uporabo, ki so označeni na sliki 6, preimenujemo jih iz naključno ustvarjenih znakov, preimenujemo jih v spodnji podčrtani primer

#define LOGOWIDTH

#define LOGOHEIGHT

const unsigned char LOGOPIČNI PROGRAM

naslednji klik na datoteko nato shrani kot, shrani datoteko kot logo.c zaprite beležnico, z desno tipko miške kliknite logo.c in kliknite kopiraj.

4. korak: Prikaz LOGO z uporabo DrawBitmap

Prikaz LOGO z uporabo DrawBitmap
Prikaz LOGO z uporabo DrawBitmap
Prikaz LOGO z uporabo DrawBitmap
Prikaz LOGO z uporabo DrawBitmap
Prikaz LOGO z uporabo DrawBitmap
Prikaz LOGO z uporabo DrawBitmap
Prikaz LOGO z uporabo DrawBitmap
Prikaz LOGO z uporabo DrawBitmap

Zdaj naložimo arduino IDE in ustvarimo novo skico ter jo shranimo z imenom logoexample.ino, nato kot goljufija v arduino ide kliknite meni datoteke in nato shranite kot, vrnite se v mapo projekta z desnim klikom in prilepite v datoteko.c (pic2), nato kliknite prekliči, to vam prihrani, da poiščete mapo, da jo prilepite.

vnesite naslednjo kodo v arduino IDE ali prenesite v ino.

(Priporočamo, da namesto kopiranja in lepljenja vnesete ali uporabite spodnje datoteke, je to najboljši način za učenje)

#include /* to se bo razlikovalo glede na to, kje shranjujete

ino običajno v mapi C: / Users / ~ username / Documents / Arduino / project ~ name

in tako se povežemo z našo bitno sliko */

#vključi

#vključi

uint8_t bmpX, bmpY = 0; /* rezervni pomnilnik za 2 X 8 -bitna cela števila, potrebujemo le 8 -bitne inte

ker vrednost nikoli ni višja od 128 (slikovnih pik), zato lahko prihranimo prostor z uporabo 8 -bitnih črk (ki ima največjo vrednost 255) */

void setup ()

{zamuda (100); // damo zaslonu itd. čas, da se vklopi display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // to je za inicializacijo prikaza na zaslonu.clearDisplay (); // začni s praznim zaslonom}

/* upoštevajte, da vam teh komentarjev ni treba vnesti kot referenco …………..

ukaz, na katerega se bomo osredotočili, je display.drawBitmap, to je tisto, kar nariše naš zaslon. (bmpX, je vrednost osi X na zaslonu, kjer bo sidrna točka X bitne slike, bmpX in bmpY pa vrednosti, ki nas zanimata za ustvarjanje premikanja (bmpY, je vrednost osi Y na zaslonu, kjer je sidro Y točka bitne slike bomo dobili referenčna imena, kot smo jih opredelili v logo.c (LOGOPIC, je ime bitne slike v #included datoteki logo.c (LOGOWIDTH, koliko slikovnih pik čez (X) za risanje bitna slika s sidrne točke (LOGOHEIGHT, koliko slikovnih pik navzdol (Y) za risanje bitne slike s sidrne točke se lahko med seboj vnesejo piksli X in Y, vendar je lažje uporabiti vnaprej določene kot zapomniti vse (1, zadnja vrednost je barva, saj je zaslon mono 0 črna 1 bela. v redu začnite tipkati iz naslednje vrstice: ¬D lol*/ void loop () {display.clearDisplay (); // počistite zaslon // bitna slika iz zgoraj levo, x, y, ime bitne slike, širina X, višina Y, barvni prikaz.drawBitmap (bmpX, bmpY, LOGOPIC, LOGOWIDTH, LOGOHEIGHT, 1); display.display (); // to dejansko vleče medpomnilnik na zaslon kdaj}

naložite kodo, ki jo uporabljate, in potrdite, da deluje (pic3).

5. korak: Premikanje bitnega bitnega sprita

Image
Image
Premikanje bitnega zemljevida Sprite
Premikanje bitnega zemljevida Sprite
Premikanje bitnega zemljevida Sprite
Premikanje bitnega zemljevida Sprite

z uporabo prejšnjih navodil uporabite paint.net in naredite novo datoteko 30x15 slikovnih pik (pic1) ter narišite grob avto, ki ga naš mladi oblikovalec najprej zažene s vetrobranskim steklom (sliki 2 in 3).

znova shranite kot datoteko bmp windows (kot v koraku 2), pretvorite v bitno sliko C (korak 3) in datoteko car.c (ali karkoli se odločite) postavite v isto mapo kot novo ustvarjeni arduino ino (skica) mapa.

(p.s. ne pozabite dodati vrstice #include v avto. c. to nas je pogosto ujelo)

Najprej povežite svoj ekvivalent avtomobila.c

#vključi

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

Zaslon Adafruit_SSD1306 (128, 64); // nastavimo ločljivost zaslona

/* bmpX/bmpY potrebujemo, da so te spremenljivke, saj spreminjamo te vrednosti in prerisujemo

Zaslon ustvarja učinek animacije gibanja. hitSide in hitTop je način, kako ohranimo sprite na zaslonu */ uint8_t bmpX, bmpY = 0; // rezerviramo pomnilnik za 2 8 bitna inta (0-255), ne potrebujemo večjih 128 bo največje število uporabljenih bool hitSide = 0; bool hitTop = 0;

void setup ()

{zamuda (100); // damo zaslonu itd. čas, da se vklopi display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // to je za inicializacijo prikaza na zaslonu.clearDisplay (); // začnite s praznim zaslonom

}

void loop ()

{display.clearDisplay (); // počistite zaslon // bitna slika, narisana zgoraj levo, x, y, ime bitne slike, širina X, višina Y, barvni prikaz.drawBitmap (bmpX, bmpY, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // display.display (); // to dejansko vleče medpomnilnik na zaslon// tako sledimo robu zaslona in se odločimo, ali bomo dodali slikovno piko, premakni se od zgoraj navzdol) ali odstranimo slikovno piko (premaknemo od spodaj navzgor) */ stikalo (hitSide) // to izbere smer avtomobila glede na boole {primer 0: bmpX ++; zlom;

primer 1:

bmpX--; zlom; } // ti 2 stavki if nastavi bool na true ali false if (bmpX == 0) {hitSide = 0; } if (bmpX == 96) // širina zaslona minus avto {hitSide = 1; } // enako kot zgoraj za os Y, če (bmpY == 0) {hitTop = 0; } if (bmpY == 49) // višina zaslona minus višina avtomobila {hitTop = 1; } switch (hitTop) {primer 0: bmpY ++; zlom; primer 1: bmpY--; zlom; }

}

v priloženem videu si lahko ogledate program, ki deluje

6. korak: Ustvarjanje vozne igre

Image
Image

Najprej narišemo nekaj različnih avtomobilov ali ovir, kot so bile v zgodnjih fazah vadnice, tako da so 30x15 slikovnih pik. Nato jih pretvorimo v c bitne slike in povežemo v kodo.

#include // te poti bo treba spremeniti odvisno

// kje shranjujete datoteke // edit: pravkar sem ugotovil, če // zamenjate z "", ne potrebujete celotne poti // z lastnimi knjižnicami #include

#vključi

#include #include

#vključi

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

Zaslon Adafruit_SSD1306 (128, 64); // določimo parametre prikaza

določite spremenljivke in fiksne vrednosti

// določimo vhodne zatiče, to so zatiči na arduinu, ki se nikoli ne spremenijo, tako da #define #definiraj INTPIN 3 // samo zatiči 2 in 3 lahko prekinimo zatiče na UNO #define UPPIN 4 // to so zatiči povezani tp ustrezno stikalo #define DWNPIN 5 #define LFTPIN 6 #define RHTPIN 7 #define SND 9 // definiranje smeri

#define DIRUP 1 // te vrednosti "kača" gleda, da se odloči-

#define DIRDOWN 2 // smer kača bo potovala #define DIRLEFT 3 #define DIRRIGHT 4

uint8_t dirPressed = 0; // vrednost za registracijo smeri za premik na kateri pin je bil visoko

// booleans store kateri pin je šel visoko

bool BUTUP = 0; bool BUTDWN = 0; bool BUTLFT = 0; bool BUTRHT = 0; // spremenljivke za položaj avtomobila uint8_t carPosX = 1; uint8_t carPosY = {0, 16, 32, 48}; // potrebuje vrednost za cahnging matriko

uint8_t lanePosArr = {0, 16, 32, 48}; // polje za shranjevanje, kjer je vsak pas

uint8_t carPosYCnt = 0; uint8_t avtoYTmp = 0; // spremenljivke za vrstice na cesti uint8_t roadLineX1 = 51; // te so vnaprej določene, nato se vrstice pojavijo brezhibno uint8_t roadLineX2 = 102; uint8_t roadLineX3 = 153; uint8_t roadLineX4 = 254; uint8_t roadLineX5 = 200;

// to je, koliko slikovnih pik se igralno območje premika hkrati

uint8_t drawSpeed = 4;

// vari za sovražnika0

uint8_t sovražnik0PosX = 255; uint8_t sovražnik0PosY = 0; uint8_t sovražnik1PosX = 255; uint8_t sovražnik1PosY = 0; uint8_t sovražnik2PosX = 255; uint8_t sovražnik2PosY = 0;

// spremenljivo za naključno dodelitev številke voznega pasu oviram

uint8_t laneGen = 0;

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

// števec točk

dolga ocena = 0; // to je rezultat:/ lol dolga primerjava = 0; // to shrani rezultat na zadnji ravni navzgor za primerjavo nazaj na dolgi highScore = 25; uint8_t metreCnt = 0;

tu zaženemo funkcije

// to je niz ukazov, če je prekinitev aktivirana void interruptressed () {delay (150); updateDirection (); } // posodobite, katera vrednost je v smeri var, tako da preverite vmesnike DIR // -------------------------- UPDATE DIRECTION (predvajalnik)- ------------------------- void updateDirection () {//Serial.println("updateDirection Called "); BUTUP = digitalno branje (UPPIN); BUTDWN = digitalno branje (DWNPIN); BUTLFT = digitalno branje (LFTPIN); BUTRHT = digitalno branje (RHTPIN); if (BUTUP == true) {dirPressed = DIRUP; } if (BUTDWN == true) {dirPressed = DIRDOWN; } if (BUTLFT == true) {dirPressed = DIRLEFT; } if (BUTRHT == true) {dirPressed = DIRRIGHT; }

}

// ------------------------------- PREMIKAJ AVTOMOBIL --------------- -------------------------

// to bo posodobilo zaslon za premikanje avtomobila

void moveCar ()

{switch (dirPressed) {case DIRUP: carPosYCnt--; carPosY [carPosYCnt]; ton (SND, 100, 100); če (carPosYCnt == 255) {carPosYCnt = 0; } carYTmp = carPosY [carPosYCnt]; dirPressed = 0; // Serial.println ("carPosY up"); // Serial.println (carPosYCnt); zlom; ohišje DIRDOWN: carPosYCnt ++; ton (SND, 100, 100); če (carPosYCnt == 4) {carPosYCnt = 3; } // Serial.println ("carPosY"); // Serial.println (carPosYCnt); carYTmp = carPosY [carPosYCnt]; dirPressed = 0; zlom; // komentiran avtomobil, ki se lahko premika levo in desno, zaznavanje trka še ni tako dobro /* primer DIRLEFT: carPosX--; če (carPosX == 0) {carPosX = 1; } // Serial.println ("carPosX"); // Serial.println (carPosX); dirPressed = 0; zlom; */ case DIRRIGHT: // samo za zabavo, če pritisnete desno, bo igra oddala zvočni signal (SND, 100, 50); // carPosX ++; // if (carPosX == 128) // {// carPosX = 127; //} // Serial.println ("carPosX"); // Serial.println (carPosX); // dirPressed = 0; zlom; } updateDisplay (); }

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

uint8_t randomPosX () // ti 2 rutini samo ustvarita naključni položaj ovir

{uint8_t posValTmp = 0; posValTmp = naključno (129, 230); //Serial.println("random x "); //Serial.println(posValTmp); return (posValTmp); }

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

uint8_t randomPosY ()

{uint8_t laneVal = 0; laneVal = naključno (0, 4); // dodamo dodaten pas za naključnost, tj. nobenega predmeta na zaslonu, medtem ko smo na tem pasu //Serial.println("RandomY "); //Serial.println(lanePosArr[laneVal]); return (lanePosArr [laneVal]); }// ------------------------------- NASTAVI HITROST IGRE -------------- -------------- void setGameSpeed () // to ustavi raven nad 20, zaradi česar se igra ne igra {if (drawSpeed <21) {drawSpeed = drawSpeed+2; }}// ------------------------------------ DETECT CASH ---------- ----------------------- void detectionCrash () {

če (sovražnik0PosX = 0 && sovražnik0PosY == avtoYTmp)

{// Serial.println ("Igra preko CRAASSSSHHHHHHEEEEDDD v promet 0"); konec igre(); } če (sovražnik1PosX = 0 && sovražnik1PosY == carYTmp) {//Serial.println("Igraj čez CRAASSSSHHHHHHEEEDDD v promet 1 "); konec igre(); } če (sovražnik2PosX = 0 && sovražnik2PosY == carYTmp) {//Serial.println("Game Over CRAASSSSHHHHHHEEEEDDD v promet 2 "); konec igre(); }}

to so rutine, ki rišejo zaslon.

// ------------------------------- RISANA CESTA --------------- --------------------- void drawRoad () // X, Y, dolžina, širina {display.fillRect (roadLineX1, 15, 30, 4, BELA); display.fillRect (roadLineX1, 30, 30, 4, BELA); display.fillRect (roadLineX1, 45, 30, 4, BELA); display.fillRect (roadLineX2, 15, 30, 4, BELA); display.fillRect (roadLineX2, 30, 30, 4, BELA); display.fillRect (roadLineX2, 45, 30, 4, BELA); display.fillRect (roadLineX3, 15, 30, 4, BELA); display.fillRect (roadLineX3, 30, 30, 4, BELA); display.fillRect (roadLineX3, 45, 30, 4, BELA); display.fillRect (roadLineX4, 15, 30, 4, BELA); display.fillRect (roadLineX4, 30, 30, 4, BELA); display.fillRect (roadLineX4, 45, 30, 4, BELA); display.fillRect (roadLineX5, 15, 30, 4, BELA); display.fillRect (roadLineX5, 30, 30, 4, BELA); display.fillRect (roadLineX5, 45, 30, 4, BELA);

roadLineX1 = roadLineX1-drawSpeed;

roadLineX2 = roadLineX2-drawSpeed; roadLineX3 = roadLineX3-drawSpeed; roadLineX4 = roadLineX4-drawSpeed; roadLineX5 = roadLineX5-drawSpeed; display.display (); } // ----------------------------------------- RISI sovražnike ---- --------------------------------------- void neprijateljiDraw () {// X, Y, bmp ime, širina, višina, barvni prikaz.drawBitmap (sovražnik0PosX, sovražnik0PosY, ENEMY0, ENEMY0_WIDTH, ENEMY0_HEIGHT, 1); sovražnik0PosX = sovražnik0PosX-drawSpeed; display.drawBitmap (sovražnik1PosX, sovražnik1PosY, ENEMY1, ENEMY1_WIDTH, ENEMY1_HEIGHT, 1); sovražnik1PosX = sovražnik1PosX-drawSpeed; display.drawBitmap (sovražnik2PosX, sovražnik2PosY, ENEMY2, ENEMY2_WIDTH, ENEMY2_HEIGHT, 1); sovražnik2PosX = sovražnik2PosX-drawSpeed; display.display (); če (sovražnik0PosX> 231 && sovražnik0PosX231 && sovražnik1PosX <255) {sovražnik1PosX = randomPosX (); sovražnik1PosY = naključniPosY (); checkDuplicate (); }

če (sovražnik2PosX> 231 && sovražnik2PosX <255) {sovražnik2PosX = randomPosX (); sovražnikPosY = naključniPosY (); }} // ------------------------------------ PRIKLJUČI ZASLON -------- ---------------------------------------- void updateDisplay () {display.clearDisplay (); display.drawBitmap (carPosX, carPosY [carPosYCnt], CARSPRITE, 30, 15, 1); display.fillRect (100, 0, 28, 10, ČRNO); display.setCursor (100, 0); display.setTextColor (BELA, ČRNA); display.println (rezultat); display.display ();

}

// ------------------------- počakajte na zanko za tiskanje ------------------- ------

// to je koda domačega zaslona void waitForPress () {splashScreen (); bool čaka = 0; // zanka se konča, ko je to res display.clearDisplay (); while (čaka == 0) {

display.fillRect (19, 20, 90, 32, ČRNO); // prazno ozadje za besedilo

display.setTextColor (BELO); display.setCursor (23, 24); display.setTextSize (0); display.println ("Nepremišljeno"); display.setCursor (36, 34); display.println ("Racer"); display.drawBitmap (74, 24, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // x y w h r col display.drawRoundRect (21, 21, 86, 23, 4, BELO); // obroba Snake display.drawRect (19, 20, 90, 33, BELA); // obrobno polje - 3 display.setCursor (25, 43); display.setTextSize (0); // pisava nazaj na običajni display.println ("pritisnite katero koli tipko"); display.fillRect (0, 0, 127, 8, ČRNO); display.setCursor (10, 0); display.print ("Najvišja ocena:"); // prikazovanje prikaza visoke ocene.print (highScore); display.display (); čaka = digitalno branje (INTPIN); // preverimo, če se pritisnjena tipka čaka in se spremeni na 1, medtem ko je dirPressed = 0; // gumb za ponastavitev pritisnite v nobeno smer}} // -------------------------------------- ----- UPDATE IGRA ----------------------------------------- void updateGame () {moveCar (); drawRoad (); neprijateljDraw (); // sovražnik1Draw (); // sovražnik2Draw (); metreCnt ++; discoveryCrash (); if (metreCnt == 5) // doda točko za vsakih 10 ciklov, da se poveča rezultat {metreCnt = 0; rezultat ++; } if (rezultat == primerjaj+5) // pospeši igro vsakih 5 točk do največ 20 hitrosti {compare = score; setGameSpeed (); } noTone (SND); updateDisplay ();

}

// ------------------------------ KONEC IGRE---------------- ------------------------------

// ta rutina potegne črte okoli avtomobila mrtvega junaka in nato igro prikaže na zaslonu

void gameOver ()

{ton (SND, 200, 200); // predvajaj zvok uint8_t linePosX, linePosY, pixwidth, pixheight = 0; // nastavite variante za risanje škatel okoli avtomobilske linijePosX = carPosY; linePosY = carYTmp; pixwidth = 30; pixheight = 15; display.drawRect (linePosX, linePosY, pixwidth, pixheight, BELO); display.display (); for (int i = 0; i <= 26; i ++) // to obdaja avto v pravokotnikih, ki simulirajo eksplozijo {linePosX = linePosX-2; linePosY = linePosY-2; pixwidth = pixwidth+4; pixheight = pixheight+4; display.drawRect (linePosX, linePosY, pixwidth, pixheight, BLACK); display.drawRect (linePosX, linePosY, pixwidth, pixheight, BELO); display.display (); ton (SND, i*20, 50); zamuda (10); } display.setTextSize (2); display.setTextColor (BELA, ČRNA); display.setCursor (10, 23); ton (SND, 50, 500); display.print ("IGRA"); display.display (); zamuda (500); ton (SND, 40, 500); display.print ("PREKO"); display.setTextSize (0); display.display (); zamuda (3000); restartGame (); waitForPress (); }

// ----------------------------------------- ZNOVANJE IGRE ----- -------------------------------------------------- -----

void restartGame () // ta kopira visoko oceno in ponastavi vse statistične podatke ter ustvari naključne položaje

{if (score> = highScore) // preverite, ali je rezultat višji od najvišjega {highScore = score; // samski, če statistika posodobi visoko oceno}

rezultat = 0;

drawSpeed = 4; metreCnt = 0; carPosYCnt = 0; sovražnik0PosX = randomPosX (); sovražnik0PosY = naključniPosY (); sovražnikPosX = naključniPosX (); sovražnik1PosY = naključniPosY (); sovražnik2PosX = randomPosX (); sovražnikPosY = naključniPosY (); noTone (SND);

checkDuplicate ();

}

// ------------------------------------------------ -PREVERITE Dvojnik ----------------------------------------------- ------ void checkDuplicate () // ti preverijo, če ovire zasedajo isti prostor za igre {// Serial.println ("dvojnik preverjen"); če (sovražnik2PosX> 230 && sovražnik2PosX <255) {medtem ko (sovražnik2PosY == sovražnik1PosY || sovražnik2PosY == sovražnik0PosY) {sovražnik2PosY = naključenPosY (); }}

če (sovražnik0PosX> 230 && sovražnik0PosX230 && sovražnik2PosXenemy1PosX && sovražnik2PosX230 && sovražnik0PosXenemy1PosX && sovražnik0PosX

// ------------------------------------------- ZASLON ZA BRISANJE --- --------------------------------

void splashScreen ()

{display.clearDisplay (); display.drawBitmap (0, 0, CRASH, CRASHWIDTH, CRASHHEIGHT, 1); display.display (); zamuda (2000); } // ----------------------------------------------- NASTAVITI ------------------------------------------------- ----------- void setup () {zakasnitev (100); // naj se stvari zaženejo // Serial.begin (9600); // razkomentiraj to in vso serijo. ukazi za prikaz diagnostike napak.začetek (SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay (); display.setTextColor (BELA, ČRNA); display.setTextWrap (false); display.dim (0); pinMode (INTPIN, INPUT); pinMode (UPPIN, INPUT); pinMode (DWNPIN, INPUT); pinMode (LFTPIN, INPUT); pinMode (RHTPIN, INPUT);

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

// naključno postavimo ovire sovražnik0PosX = randomPosX (); sovražnik0PosY = naključniPosY (); sovražnikPosX = naključniPosX (); sovražnik1PosY = naključniPosY (); sovražnik2PosX = randomPosX (); sovražnikPosY = naključniPosY (); checkDuplicate (); // preverjanje podvojenih lokacij // Serial.println ("nastavitev dokončana"); splashScreen (); waitForPress (); } // ----------------------------------------------- ----- ZEMLJA -------------------------------------------- ----------

void loop ()

{updateGame (); }

in to je skoraj vse, vse spremembe in povratne informacije bodo dobrodošle. Težave, ki jih moramo odpraviti z utripanjem zaslona, moramo preučiti, kako ga zmanjšati, sovražni avtomobili pa lahko še vedno zasedajo isti prostor.

Priporočena: