Sadržaj:

Reckless Racer Arduino OLED igra, AdafruitGFX i osnove bitmapa: 6 koraka
Reckless Racer Arduino OLED igra, AdafruitGFX i osnove bitmapa: 6 koraka

Video: Reckless Racer Arduino OLED igra, AdafruitGFX i osnove bitmapa: 6 koraka

Video: Reckless Racer Arduino OLED igra, AdafruitGFX i osnove bitmapa: 6 koraka
Video: OLED дисплей с контроллером SH1106 подключение к Arduino и тесты 2024, Novembar
Anonim
Reckless Racer Arduino OLED igra, osnove AdafruitGFX -a i bitmapa
Reckless Racer Arduino OLED igra, osnove AdafruitGFX -a i bitmapa
Reckless Racer Arduino OLED igra, osnove AdafruitGFX -a i bitmapa
Reckless Racer Arduino OLED igra, osnove AdafruitGFX -a i bitmapa

U ovom vodiču ćemo pogledati kako koristiti bitmape koristeći biblioteku Adafruit_GFX.c kao neku vrstu sprajtova u igri. Najjednostavnija igra koje smo se mogli sjetiti je igra automobila koja mijenja bočne trake, na kraju su se naš beta tester i pomoćni koder odlučili za "Reckless Racer" kao ime, jer je prilično nepromišljeno voziti u pogrešnom smjeru niz autoput !!.

Dizajn našeg kola je na slikama koje su gore navedene i detaljno je opisan u našem zadnjem projektu/vodiču Snake Instructables koji opisuje kako krug funkcionira.

mi ćemo zahtijevati

Adafruit_GFX

Paint.net

Arduino IDE windowslinux

a ostatak opreme pogledajte u vodiču Snake.

Supplies

Zmijska igra

Korak 1: Instaliranje programa Paint.net

Instaliranje Paint.net
Instaliranje Paint.net
Instaliranje Paint.net
Instaliranje Paint.net
Instaliranje Paint.net
Instaliranje Paint.net

Mi koristimo paint.net jer je softver besplatan pa potpuno besplatan za korištenje možete preuzeti Paint. Net ovdje.

Da biste instalirali paint.net, dvaput kliknite na preuzeti program i odgovorite pozitivno sljedeće, da, u redu, slažem se i gornje slike će vam dati upute.

Korak 2: Crtanje jednostavnog ekrana za prskanje

Crtanje jednostavnog ekrana za prskanje
Crtanje jednostavnog ekrana za prskanje
Crtanje jednostavnog ekrana za prskanje
Crtanje jednostavnog ekrana za prskanje
Crtanje jednostavnog ekrana za prskanje
Crtanje jednostavnog ekrana za prskanje

Kada ste na paint.net, stvorite novu sliku klikom na Datoteka, a zatim na novu, postavite veličinu slike na 1260x620 (pogledajte prvu sliku). Pritisnite U redu kada imate novu stranicu. alat (pic2), kada ste nacrtali (ili zalijepili) sliku s ekrana za početak, kliknite na sliku, a zatim promijenite veličinu (image4), u skočnom prozoru promijenite veličinu sa 1260x620 na 126x62 (2 piksela manja od prikaza) (pic5) Pritisnite OK.

zatim kliknite izbornik Datoteka, a zatim spremite kao (pic6).

kada se skočni prozor pojavi u padajućem izborniku vrste datoteke, odaberite BMP (bitmap). (pic7), upišite naziv datoteke i kliknite spremi, kada se pojavi skočni prozor postavljen na 0 i 8 bita, kliknite u redu (pic8).

Korak 3: Pretvaranje BMP -a u C Bitmap datoteku

Pretvaranje BMP u C Bitmap datoteku
Pretvaranje BMP u C Bitmap datoteku
Pretvaranje BMP u C Bitmap datoteku
Pretvaranje BMP u C Bitmap datoteku
Pretvaranje BMP u C Bitmap datoteku
Pretvaranje BMP u C Bitmap datoteku
Pretvaranje BMP u C Bitmap datoteku
Pretvaranje BMP u C Bitmap datoteku

Sada moramo pretvoriti našu sliku u format koji arduino može razumjeti da postoji mnogo alata na raspolaganju za to, ali moj "idi na" mjesto je alat za pretvaranje bitmapa web stranice web stranice marlin …

marlinfw.org/tools/u8glib/converter.html

Stoga započinjemo ovaj odjeljak pomoću gornje veze za otvaranje web stranice koja je prikazana na slici 1

kliknite na odaberite datoteku i odaberite bitmapu koju ste ranije stvorili (pic2)

marlin bitmap converter automatski će pretvoriti vašu sliku u c kôd lijevim dvoklikom na kôd koji bi trebao označiti kôd, zatim desnim klikom i kliknite kopiranje (pic3)

sljedeći Kreiramo desni klik i stvaramo novi tekstualni dokument (pic4)

dvaput kliknite na novi dokument, kada se otvori kliknite desnim tasterom miša i zalepite kôd (pic5)

zatim moramo dodati redak pri vrhu koda #include ovo nam omogućava spremanje bitmap podataka u flash memoriju na arduinu, zatim preimenujemo #define width, height i name u nešto lakše za korištenje, oni su istaknuti na slici 6, preimenujemo ih iz nasumično generiranih znakova preimenujemo ih u dolje podcrtani primjer

#define LOGOWIDTH

#define LOGOHEIGHT

const unsigned char LOGOPIC PROGMEM

sljedeći klik na datoteku zatim spremi kao, spremite datoteku kao logo.c zatvorite bilježnicu, desnom tipkom miša kliknite logo.c i kliknite kopiraj.

Korak 4: Prikaz LOGO -a pomoću DrawBitmap -a

Prikaz LOGO -a pomoću DrawBitmap -a
Prikaz LOGO -a pomoću DrawBitmap -a
Prikaz LOGO -a pomoću DrawBitmap -a
Prikaz LOGO -a pomoću DrawBitmap -a
Prikaz LOGO -a pomoću DrawBitmap -a
Prikaz LOGO -a pomoću DrawBitmap -a
Prikaz LOGO -a pomoću DrawBitmap -a
Prikaz LOGO -a pomoću DrawBitmap -a

Sada učitavamo arduino IDE i stvaramo novu skicu i spremamo je pod imenom logoexample.ino, zatim kao varalicu u arduino ide -u kliknite izbornik datoteka pa spremite kao, vratite se u fasciklu projekta desnim klikom i zalijepite u.c datoteku (pic2), a zatim kliknite na otkaži, ovo vam štedi da morate potražiti fasciklu da biste je zalijepili.

upišite sljedeći kod u arduino IDE ili preuzmite u ino.

(preporučujemo upisivanje umjesto kopiranja i lijepljenja ili korištenje datoteka ispod, najbolji način za učenje)

#include /* ovo će se razlikovati ovisno o mjestu skladištenja

ino obično u fascikli C: / Users / ~ username / Documents / Arduino / project ~ name

i ovako se povezujemo sa našom bitmapom */

#include

#include

uint8_t bmpX, bmpY = 0; /* rezervna memorija za 2 X 8 bitna cela broja, potrebni su nam samo 8 bitni ints

jer vrijednost nikada nije veća od 128 (piksela), tako da možemo uštedjeti prostor pomoću 8 -bitnih ints (što ima maksimalnu vrijednost od 255) */

void setup ()

{kašnjenje (100); // daje ekranu itd. vrijeme za uključivanje display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // ovo je za inicijalizaciju prikaza display.clearDisplay (); // počnite s praznim ekranom}

/* imajte na umu da ne morate upisivati ove komentare jer su oni za referencu …………..

naredba na koju ćemo se fokusirati je display.drawBitmap, ovo je ono što privlači naš splash screen. (bmpX, je vrijednost osi X na ekranu gdje će biti točka sidra X bitmape, a bmpX i bmpY su vrijednosti koje nas zanimaju za kretanje (bmpY, je vrijednost osi Y na ekranu gdje je sidro Y točka bitmape bit će to što ćemo dobiti referentna imena onako kako smo ih definirali u logo.c (LOGOPIC, je naziv bitmape u #included datoteci logo.c (LOGOWIDTH, koliko je piksela preko (X) za iscrtavanje bitmapa sa tačke sidrenja (LOGOHEIGHT, je koliko piksela prema dolje (Y) za iscrtavanje bitmape sa tačke sidrenja X i Y piksela preko puta mogu se unijeti ručno, ali jednostavno je lakše koristiti unaprijed definirane nego zapamtiti sve (1, posljednja vrijednost je boja jer je ekran mono 0 crna 1 bijela. u redu počnite kucati iz sljedećeg retka: ¬D lol*/ void loop () {display.clearDisplay (); // prazan ekran // bitmapa izvučena iz gore lijevo, x, y, naziv bitmape, širina X, visina Y, prikaz u boji.drawBitmap (bmpX, bmpY, LOGOPIC, LOGOWIDTH, LOGOHEIGHT, 1); display.display (); // ovo zapravo privlači bafer na ekran ikada}

otpremite kôd na arduino i potvrdite da radi (pic3).

Korak 5: Premještanje Sprite bitmape

Image
Image
Premještanje spite bitmape
Premještanje spite bitmape
Premještanje spite bitmape
Premještanje spite bitmape

koristeći ranije upute, koristite paint.net i napravite novu datoteku dimenzija 30x15 piksela (pic1) i nacrtajte grubi automobil koji naš mladi dizajner prvo započinje s vjetrobranom (slike 2 i 3).

ponovo ga spremite kao Windows bmp datoteku (kao u koraku 2), pretvorite u C bitmapu (korak 3) i postavite datoteku car.c (ili šta god da odlučite) u istu mapu kao novostvoreni arduino ino (skica) file.

(p.s. ne zaboravite dodati liniju #include u automobilu. c ovo nas je često zateklo)

Prvo povežite svoj ekvivalent automobila.c

#include

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

Adafruit_SSD1306 ekran (128, 64); // postavljanje rezolucije ekrana

/* bmpX/bmpY trebaju nam ove varijable kao mijenjanje ovih vrijednosti i ponovno iscrtavanje

na ekranu stvaramo efekt animacije pokreta. hitSide i hitTop je način na koji zadržavamo sprite na ekranu */ uint8_t bmpX, bmpY = 0; // rezervisanje memorije za 2 8 bitna inta (0-255) ne treba nam veće 128 će biti najveći broj koji se koristi bool hitSide = 0; bool hitTop = 0;

void setup ()

{kašnjenje (100); // daje ekranu itd. vrijeme za uključivanje display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // ovo je za inicijalizaciju prikaza display.clearDisplay (); // započinjemo s praznim ekranom

}

void loop ()

{display.clearDisplay (); // prazni ekran // bitmapa izvučena s gornje lijeve strane, x, y, naziv bitmape, širina X, visina Y, prikaz u boji.drawBitmap (bmpX, bmpY, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // display.display (); // ovo zapravo privlači bafer na ekran ikad/ * ovako pratimo ivice ekrana i odlučujemo da li da dodamo piksel pomjeranje odozgo prema dolje) ili uklonimo piksel (pomaknemo odozdo prema gore) */ prekidač (hitSide) // ovo bira smjer automobila na temelju boole {case 0: bmpX ++; break;

slučaj 1:

bmpX--; break; } // ove 2 if naredbe postavljaju bool na true ili false if (bmpX == 0) {hitSide = 0; } if (bmpX == 96) // širina ekrana minus automobil {hitSide = 1; } // isto kao gore za Y os ako (bmpY == 0) {hitTop = 0; } if (bmpY == 49) // visina ekrana minus visina automobila {hitTop = 1; } switch (hitTop) {case 0: bmpY ++; break; slučaj 1: bmpY--; break; }

}

možete vidjeti kako program radi u priloženom videu

Korak 6: Kreiranje igre vožnje

Image
Image

Prvo počinjemo crtanjem nekoliko različitih automobila ili prepreka kao u ranijim fazama vodiča čineći ih 30x15 piksela. Zatim ih pretvaramo u c bitmape i povezujemo u kodu.

#include // ove će se staze morati promijeniti zavisno

// na mjestu gdje skladištite datoteke // edit: upravo sam saznao ako zamijenite // sa "" ne trebate punu putanju // sa vlastitim bibliotekama #include

#include

#include #include

#include

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

Adafruit_SSD1306 ekran (128, 64); // definiramo parametre prikaza

definirati varijable i fiksne vrijednosti

// definirajte ulazne pinove ovo su pinovi na arduinu koje se nikada ne mijenjaju pa #define #definirajte INTPIN 3 // samo pinovi 2 i 3 mogu biti prekinuti pinovi na UNO #define UPPIN 4 // ovo su pinovi povezani tp relevantnim prekidačem #define DWNPIN 5 #define LFTPIN 6 #define RHTPIN 7 #define SND 9 // definirajte smjernice

#define DIRUP 1 // ove zmije gledaju kako bi odlučile-

#define DIRDOWN 2 // smjer kojim će zmija putovati #define DIRLEFT 3 #define DIRRIGHT 4

uint8_t dirPressed = 0; // vrijednost za registriranje smjera za pomicanje na koji pin je išao visoko

// booleans store čiji je pin bio visok

bool BUTUP = 0; bool BUTDWN = 0; bool BUTLFT = 0; bool BUTRHT = 0; // varijable za poziciju automobila uint8_t carPosX = 1; uint8_t carPosY = {0, 16, 32, 48}; // treba vrijednost za kahniranje niza

uint8_t lanePosArr = {0, 16, 32, 48}; // niz za spremanje gdje se nalazi svaka traka

uint8_t carPosYCnt = 0; uint8_t carYTmp = 0; // varijable za linije na cesti uint8_t roadLineX1 = 51; // oni su unaprijed definirani, a zatim linije izgledaju besprijekorno uint8_t roadLineX2 = 102; uint8_t roadLineX3 = 153; uint8_t roadLineX4 = 254; uint8_t roadLineX5 = 200;

// ovo je koliko se piksela područje za igru pomiče odjednom

uint8_t drawSpeed = 4;

// varijase za neprijatelja0

uint8_t neprijateljski0PosX = 255; uint8_t neprijatelj0PosY = 0; uint8_t neprijatelj1PosX = 255; uint8_t neprijatelj1PosY = 0; uint8_t neprijateljski2PosX = 255; uint8_t neprijateljski2PosY = 0;

// varijabla za nasumično dodjeljivanje broja trake preprekama

uint8_t laneGen = 0;

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

// brojač rezultata

duga ocjena = 0; // ovo je rezultat:/ lol long compare = 0; // ovo pohranjuje rezultat na zadnjoj razini za usporedbu s dugim highScore = 25; uint8_t metreCnt = 0;

tu započinjemo funkcije

// ovo je skup naredbi ako je prekid aktiviran void interruptressed () {delay (150); updateDirection (); } // ažurirati vrijednost koja je u smjeru var provjerom DIR boolova // -------------------------- UPDATE DIRECTION (player)- ------------------------- void updateDirection () {//Serial.println("updateDirection Called "); BUTUP = digitalno čitanje (UPPIN); BUTDWN = digitalno čitanje (DWNPIN); BUTLFT = digitalno čitanje (LFTPIN); BUTRHT = digitalno čitanje (RHTPIN); if (BUTUP == true) {dirPressed = DIRUP; } if (BUTDWN == true) {dirPressed = DIRDOWN; } if (BUTLFT == true) {dirPressed = DIRLEFT; } if (BUTRHT == true) {dirPressed = DIRRIGHT; }

}

// ------------------------------- POKRENI AUTOMOBIL --------------- -------------------------

// ovo će ažurirati ekran pokretača automobila sprite

void moveCar ()

{switch (dirPressed) {case DIRUP: carPosYCnt--; carPosY [carPosYCnt]; ton (SND, 100, 100); if (carPosYCnt == 255) {carPosYCnt = 0; } carYTmp = carPosY [carPosYCnt]; dirPressed = 0; // Serial.println ("carPosY up"); // Serial.println (carPosYCnt); break; slučaj DIRDOWN: carPosYCnt ++; ton (SND, 100, 100); if (carPosYCnt == 4) {carPosYCnt = 3; } // Serial.println ("carPosY"); // Serial.println (carPosYCnt); carYTmp = carPosY [carPosYCnt]; dirPressed = 0; break; // komentiran automobil koji se može kretati lijevo i desno Otkrivanje sudara još nije dobro /* slučaj DIRLEFT: carPosX--; if (carPosX == 0) {carPosX = 1; } // Serial.println ("carPosX"); // Serial.println (carPosX); dirPressed = 0; break; */ case DIRRIGHT: // samo za zabavu ako pritisnete desno igra će proizvesti zvuk (SND, 100, 50); // carPosX ++; // if (carPosX == 128) // {// carPosX = 127; //} // Serial.println ("carPosX"); // Serial.println (carPosX); // dirPressed = 0; break; } updateDisplay (); }

// -------------------------- SLUČAJNO POS X ------------------- -----------

uint8_t randomPosX () // ove 2 rutine samo generiraju slučajnu poziciju za prepreke

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

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

uint8_t randomPosY ()

{uint8_t laneVal = 0; laneVal = slučajno (0, 4); // dodajemo dodatnu traku za nasumičnost, tj. nema objekata na ekranu dok smo na toj traci //Serial.println("RandomY "); //Serial.println(lanePosArr[laneVal]); return (lanePosArr [laneVal]); }// ------------------------------- SET BRZINA IGRE -------------- -------------- void setGameSpeed () // ovo zaustavlja nivo koji ide iznad 20 čineći igru neigrivom {if (drawSpeed <21) {drawSpeed = drawSpeed+2; }}// ------------------------------------ DETECT CRASH ---------- ----------------------- void detectionCrash () {

ako (neprijatelj0PosX = 0 && neprijatelj0PosY == automobilYTmp)

{// Serial.println ("Igra preko CRAASSSSHHHHHHEEEEDDD u promet 0"); gameOver (); } if (neprijatelj1PosX = 0 && neprijatelj1PosY == automobilYTmp) {//Serial.println("Igra preko CRAASSSSHHHHHHEEEDDD u saobraćaj 1 "); gameOver (); } if (neprijatelj2PosX = 0 && neprijatelj2PosY == automobilYTmp) {//Serial.println("Igra preko CRAASSSSHHHHHHEEEEDDD u promet 2 "); gameOver (); }}

ovo su rutine koje crtaju prikaz.

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

roadLineX1 = roadLineX1-drawSpeed;

roadLineX2 = roadLineX2-drawSpeed; roadLineX3 = roadLineX3-drawSpeed; roadLineX4 = roadLineX4-drawSpeed; roadLineX5 = roadLineX5-drawSpeed; display.display (); } // ----------------------------------------- NACRTAJ neprijatelje ---- --------------------------------------- void neprijateljDraw () {// X, Y, bmp naziv, širina, visina, prikaz u boji.drawBitmap (neprijatelj0PosX, neprijatelj0PosY, ENEMY0, ENEMY0_WIDTH, ENEMY0_HEIGHT, 1); neprijatelj0PosX = neprijatelj0PosX-drawSpeed; display.drawBitmap (neprijatelj1PosX, neprijatelj1PosY, ENEMY1, ENEMY1_WIDTH, ENEMY1_HEIGHT, 1); neprijatelj1PosX = neprijatelj1PosX-drawSpeed; display.drawBitmap (neprijatelj2PosX, neprijatelj2PosY, ENEMY2, ENEMY2_WIDTH, ENEMY2_HEIGHT, 1); neprijatelj2PosX = neprijatelj2PosX-drawSpeed; display.display (); if (neprijatelj0PosX> 231 && neprijatelj0PosX231 && neprijatelj1PosX <255) {neprijatelj1PosX = randomPosX (); neprijateljPosY = randomPosY (); checkDuplicate (); }

if (neprijatelj2PosX> 231 && neprijatelj2PosX <255) {neprijatelj2PosX = randomPosX (); neprijatelj2PosY = randomPosY (); }} // ------------------------------------ AŽURIRAJ EKRAN -------- ---------------------------------------- void updateDisplay () {display.clearDisplay (); display.drawBitmap (carPosX, carPosY [carPosYCnt], CARSPRITE, 30, 15, 1); display.fillRect (100, 0, 28, 10, CRNO); display.setCursor (100, 0); display.setTextColor (BIJELO, CRNO); display.println (rezultat); display.display ();

}

// ------------------------- pričekajte petlju za štampu ------------------- ------

// ovo je kod početnog ekrana void waitForPress () {splashScreen (); bool čekanje = 0; // petlja se završava kada je ovo istina display.clearDisplay (); while (čekanje == 0) {

display.fillRect (19, 20, 90, 32, CRNO); // prazna pozadina za tekst

display.setTextColor (BIJELO); display.setCursor (23, 24); display.setTextSize (0); display.println ("Nepromiš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, BIJELO); // ivica Snake display.drawRect (19, 20, 90, 33, BIJELO); // rubni okvir - 3 display.setCursor (25, 43); display.setTextSize (0); // font natrag na normalni display.println ("pritisnite bilo koji taster"); display.fillRect (0, 0, 127, 8, CRNO); display.setCursor (10, 0); display.print ("Visoka ocjena:"); // prikazuje high display display.print (highScore); display.display (); čekanje = digitalno čitanje (INTPIN); // provjeravamo hoće li se pritisnuti taster na čekanju promijeniti u 1 koji završava dok je dirPressed = 0; // dugme za resetiranje pritisnite u bilo kojem smjeru}} // -------------------------------------- ----- IGRA AŽURIRANJA ----------------------------------------- void updateGame () {moveCar (); drawRoad (); neprijateljDraw (); // neprijatelj1Draw (); // neprijatelj2Draw (); metreCnt ++; detectionCrash (); if (metreCnt == 5) // dodaje bod za svakih 10 ciklusa kako bi se povećao rezultat {metreCnt = 0; rezultat ++; } if (rezultat == uporedi+5) // ubrzava igru svakih 5 poena do maksimalnih 20 brzina {compare = score; setGameSpeed (); } noTone (SND); updateDisplay ();

}

// ------------------------------ IGRA PREKO ---------------- ------------------------------

// ova rutina povlači linije oko mrtvog automobila heroja i prikazuje igru preko ekrana

void gameOver ()

{ton (SND, 200, 200); // reproduciranje zvuka uint8_t linePosX, linePosY, pixwidth, pixheight = 0; // postavljanje varijacija za crtanje okvira oko linije automobilaPosX = carPosY; linePosY = carYTmp; pixwidth = 30; pixheight = 15; display.drawRect (linePosX, linePosY, pixwidth, pixheight, BIJELO); display.display (); for (int i = 0; i <= 26; i ++) // ovo okružuje automobil u pravokutnicima koji simuliraju eksploziju {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, BIJELO); display.display (); ton (SND, i*20, 50); kašnjenje (10); } display.setTextSize (2); display.setTextColor (BIJELO, CRNO); display.setCursor (10, 23); ton (SND, 50, 500); display.print ("IGRA"); display.display (); kašnjenje (500); ton (SND, 40, 500); display.print ("OVER"); display.setTextSize (0); display.display (); kašnjenje (3000); restartGame (); waitForPress (); }

// ----------------------------------------- IGRA ZA PONOVNI POGON ----- -------------------------------------------------- -----

void restartGame () // ovo kopira visoku ocjenu i poništava sve statističke podatke te generira nasumične pozicije

{if (score> = highScore) // provjerite je li rezultat veći od visokog rezultata {highScore = score; // singl if statment to update high score}

rezultat = 0;

drawSpeed = 4; metreCnt = 0; carPosYCnt = 0; neprijateljPosX = randomPosX (); neprijateljPosY = randomPosY (); neprijatelj1PosX = slučajniPosX (); neprijateljPosY = randomPosY (); neprijatelj2PosX = slučajniPosX (); neprijatelj2PosY = randomPosY (); noTone (SND);

checkDuplicate ();

}

// ------------------------------------------------ -PROVJERITE DUPLIKACIJU ----------------------------------------------- ------ void checkDuplicate () // ove provjere provjeravaju da li prepreke zauzimaju isti prostor za igru {// Serial.println ("duplicirano provjereno"); if (neprijatelj2PosX> 230 && neprijatelj2PosX <255) {dok (neprijatelj2PosY == neprijatelj1PosY || neprijatelj2PosY == neprijatelj0PosY) {neprijatelj2PosY = randomPosY (); }}

ako (neprijatelj0PosX> 230 && neprijatelj0PosX230 && neprijatelj2PosXenemy1PosX && neprijatelj2PosX230 && neprijatelj0PosXenemy1PosX && neprijatelj0PosX

// ------------------------------------------- EKRAN ZA PROBLEM --- --------------------------------

void splashScreen ()

{display.clearDisplay (); display.drawBitmap (0, 0, CRASH, CRASHWIDTH, CRASHHEIGHT, 1); display.display (); kašnjenje (2000); } // ----------------------------------------------- POSTAVITI ------------------------------------------------- ----------- void setup () {delay (100); // neka se stvari pokrenu // Serial.begin (9600); // raskomentirajte ovaj i sav serijski broj. naredbe za prikaz dijagnostike grešaka.begin (SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay (); display.setTextColor (BIJELO, CRNO); display.setTextWrap (false); display.dim (0); pinMode (INTPIN, INPUT); pinMode (UPPIN, INPUT); pinMode (DWNPIN, INPUT); pinMode (LFTPIN, INPUT); pinMode (RHTPIN, INPUT);

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

// nasumično postavljanje prepreka neprijateljski0PosX = randomPosX (); neprijateljPosY = randomPosY (); neprijatelj1PosX = slučajniPosX (); neprijateljPosY = randomPosY (); neprijatelj2PosX = slučajniPosX (); neprijatelj2PosY = randomPosY (); checkDuplicate (); // provjeravamo ima li duplikata lokacija // Serial.println ("postavljanje dovršeno"); splashScreen (); waitForPress (); } // ----------------------------------------------- ----- PETLJA -------------------------------------------- ----------

void loop ()

{updateGame (); }

i to je otprilike to, sve izmjene i povratne informacije će biti dobrodošle. Problemi koje moramo riješiti treperenjem ekrana moramo razmotriti kako ga smanjiti, a neprijateljski automobili i dalje mogu zauzeti isti prostor.

Preporučuje se: