Reckless Racer Arduino OLED Game, AdafruitGFX at Mga Pangunahing Kaalaman sa Bitmaps: 6 na Hakbang
Reckless Racer Arduino OLED Game, AdafruitGFX at Mga Pangunahing Kaalaman sa Bitmaps: 6 na Hakbang
Anonim
Reckless Racer Arduino OLED Game, Pangunahing Kaalaman sa AdafruitGFX at Bitmaps
Reckless Racer Arduino OLED Game, Pangunahing Kaalaman sa AdafruitGFX at Bitmaps
Reckless Racer Arduino OLED Game, Pangunahing Kaalaman sa AdafruitGFX at Bitmaps
Reckless Racer Arduino OLED Game, Pangunahing Kaalaman sa AdafruitGFX at Bitmaps

Sa tutorial na ito titingnan namin kung paano gamitin ang mga bitmap gamit ang Adafruit_GFX.c library bilang isang uri ng mga sprite sa isang laro. Ang pinakasimpleng laro na maaari naming naisip ay isang pag-scroll sa linya ng pagbabago ng laro ng kotse, sa huli ang aming beta tester at katulong na coder ay nagpasya sa "Reckless Racer" bilang isang pangalan, dahil medyo walang ingat na magmaneho ng maling paraan pababa ng motorway !!.

Ang Disenyo ng aming circuit ay nasa mga larawan na kasama sa itaas at detalyado sa aming huling proyekto / tutorial dito Mga Instruction ng Snake na naglalarawan kung paano gumagana ang circuit.

kakailanganin namin

Adafruit_GFX

Paint.net

Arduino IDE windowslinux

at mangyaring tingnan ang tutorial ng Ahas para sa natitirang kagamitan.

Mga gamit

Laro ng Ahas

Hakbang 1: Pag-install ng Paint.net

Pag-install ng Paint.net
Pag-install ng Paint.net
Pag-install ng Paint.net
Pag-install ng Paint.net
Pag-install ng Paint.net
Pag-install ng Paint.net

Gumagamit kami ng paint.net dahil ang software ay libre kaya ganap na malayang gamitin maaari mong i-download ang Paint. Net dito.

Upang mai-install ang paint.net dobleng pag-click sa na-download na programa at positibong sagutin tulad ng susunod, oo, ok, sumasang-ayon ako at ang mga larawan sa itaas ay magbibigay sa iyo ng mga direksyon.

Hakbang 2: Pagguhit ng isang Simple Splash Screen

Pagguhit ng isang Simple Splash Screen
Pagguhit ng isang Simple Splash Screen
Pagguhit ng isang Simple Splash Screen
Pagguhit ng isang Simple Splash Screen
Pagguhit ng isang Simple Splash Screen
Pagguhit ng isang Simple Splash Screen

Kapag nasa paint.net ka lumikha ng isang bagong imahe sa pamamagitan ng pag-click sa File pagkatapos bago, itakda ang laki ng imahe sa 1260x620 (tingnan ang unang larawan) i-click ang ok kapag mayroon kang bagong pahina na gumuhit ng isang splash screen gamit lamang ang 2 kulay na itim at puti gamit ang lapis tool (pic2), kapag nagdrawing ka (o na-paste) ang iyong imahe ng splash screen, mag-click sa imahe pagkatapos baguhin ang laki (image4), sa pop up baguhin ang laki mula 1260x620 hanggang 126x62 (2 pixel na mas maliit kaysa sa iyong display) (pic5) Mag-click OK.

Susunod na pag-click sa menu ng File pagkatapos ay i-save bilang (pic6).

kapag ang pop up apears sa drop-down na menu ng uri ng file piliin ang BMP (bitmap). (pic7), i-type ang isang pangalan ng file at i-click ang save, kapag lumitaw ang pop up itakda ang pagbaba sa 0 at itakda sa 8 bit, i-click ang ok (pic8).

Hakbang 3: Pag-convert ng BMP sa C Bitmap File

Pag-convert ng BMP sa C Bitmap File
Pag-convert ng BMP sa C Bitmap File
Pag-convert ng BMP sa C Bitmap File
Pag-convert ng BMP sa C Bitmap File
Pag-convert ng BMP sa C Bitmap File
Pag-convert ng BMP sa C Bitmap File
Pag-convert ng BMP sa C Bitmap File
Pag-convert ng BMP sa C Bitmap File

Ngayon kailangan naming i-convert ang aming imahe sa isang format na maaaring maunawaan ng arduino na maraming mga tool na magagamit upang gawin ito ngunit ang aking "pumunta sa" ilagay ang marlin webs site bitmap converter tool …

marlinfw.org/tools/u8glib/converter.html

Kaya't sinisimulan namin ang seksyong ito sa pamamagitan ng paggamit ng link sa itaas upang buksan ang website na ipinakita sa pic1

mag-click sa pumili ng file at piliin ang bitmap na nilikha mo nang mas maaga (pic2)

marlin bitmap converter ay awtomatikong i-convert ang iyong imahe sa c code pakaliwa i-double click ang code na dapat i-highlight ang code, pagkatapos ay i-right click at i-click ang kopya (pic3)

susunod na Lumilikha kami ng tamang pag-click at lumikha ng isang bagong dokumento sa teksto (pic4)

i-double click ang bagong dokumento, kapag binuksan ang tamang pag-click at i-paste ang code (pic5)

Susunod na kailangan nating idagdag ang linya malapit sa tuktok ng code # isama ito ay nagbibigay-daan sa amin upang i-save ang data ng bitmap sa flash memory sa arduino, pagkatapos ay palitan namin ang pangalan ng # tuktok ng lapad, taas at pangalan sa isang bagay na mas madaling gamitin ang mga ito ay naka-highlight sa larawan 6, pinalitan namin ang pangalan ng mga ito mula sa sapalarang bumuo ng mga character na pinalitan namin ng pangalan ang mga ito sa may salungguhit na halimbawa sa ibaba

# tukuyin ang LOGOWIDTH

# tukuyin ang LOGOHEIGHT

const unsigned char LOGOPIC PROGMEM

Susunod na pag-click sa file pagkatapos ay i-save bilang, i-save ang file bilang logo.c isara ang notepad, mag-right click sa logo.c at i-click ang kopya.

Hakbang 4: Nagpapakita ng isang LOGO Gamit ang DrawBitmap

Nagpapakita ng isang LOGO Gamit ang DrawBitmap
Nagpapakita ng isang LOGO Gamit ang DrawBitmap
Nagpapakita ng isang LOGO Gamit ang DrawBitmap
Nagpapakita ng isang LOGO Gamit ang DrawBitmap
Nagpapakita ng isang LOGO Gamit ang DrawBitmap
Nagpapakita ng isang LOGO Gamit ang DrawBitmap

Ngayon ay nilo-load namin ang arduino IDE at lumikha ng bagong sketch at nai-save ito na pinangalanan bilang logoexample.ino, kasunod bilang isang cheat sa arduino ide i-click ang menu ng file pagkatapos ay i-save bilang, bumalik sa folder ng proyekto i-right click at i-paste sa.c file (pic2) pagkatapos ay i-click ang kanselahin, nai-save ka nito na kinakailangang mag-browse sa folder upang i-paste sa file.

i-type ang sumusunod na code sa arduino IDE o i-download sa ino.

(inirerekumenda namin ang pag-type sa halip na kopyahin at i-paste o gamitin ang mga file sa ibaba nito ang pinakamahusay na paraan upang malaman)

#include / * mag-iiba ito depende sa kung saan ka nag-iimbak

ang ino ay karaniwang nasa folder na C: / Users / ~ username / Documents / Arduino / project ~ pangalan

at ito ang paraan ng pag-link sa aming bitmap * /

# isama

# isama

uint8_t bmpX, bmpY = 0; / * reserbang memorya para sa 2 X 8 bit integers, 8 bit ints lang ang kailangan namin

dahil ang halaga ay hindi kailanman mas mataas kaysa sa 128 (mga pixel) upang makatipid tayo ng puwang gamit ang 8 bit ints (na may maximum na halaga na 255) * /

walang bisa ang pag-setup ()

{pagkaantala (100); // bigyan ang oras ng pagpapakita atbp sa lakas sa display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // ito ay upang simulan ang display display.clearDisplay (); // magsimula sa isang blangkong screen}

/ * mangyaring tandaan na hindi mo kailangang i-type ang mga komentong ito sa mga ito para sa sanggunian …………..

ang utos na ating pagtuunan ng pansin ay ang display.drawBitmap, ito ang kumukuha ng aming splash screen. (bmpX, ay ang halaga ng X axis sa screen kung saan ang X anchor point ng bitmap ay magiging at bmpX at bmpY ang mga halagang interesado kami upang lumikha ng kilusan (bmpY, ay ang halaga ng axis Y sa screen kung saan ang Y anchor ang punto ng bitmap ay makukuha natin ang mga pangalan ng sanggunian tulad ng tinukoy namin sa logo.c (LOGOPIC, ay ang pangalan ng bitmap sa #included file logo.c (LOGOWIDTH, ay kung gaano karaming mga pixel ang umuugnay (X) upang iguhit ang bitmap mula sa anchor point (LOGOHEIGHT, ay kung gaano karaming mga pixel pababa (Y) upang iguhit ang bitmap mula sa anchor point ang X at Y pixel na accross ay maaaring maipasok nang manu-mano ngunit mas madaling gamitin ang mga naunang natukoy kaysa alalahanin silang lahat (1, ang huling halaga ay ang kulay habang ang screen ay mono 0 itim na 1 puti. okay simulan ang pag-type mula sa susunod na linya: ¬D lol * / void loop () {display.clearDisplay (); // blangko ang screen // bitmap na iginuhit mula sa kaliwang tuktok, x, y, nameof bitmap, lapad X, taas Y, display ng kulay.drawBitmap (bmpX, bmpY, LOGOPIC, LOGOWIDTH, LOGOHEIGHT, 1); display.display (); // ito talaga ang kumukuha ng buffer sa display kailanman}

i-upload ang code mo arduino at kumpirmahing gumagana ito (pic3).

Hakbang 5: Paglipat ng isang Bitmap Sprite

Image
Image
Paglipat ng isang Bitmap Sprite
Paglipat ng isang Bitmap Sprite
Paglipat ng isang Bitmap Sprite
Paglipat ng isang Bitmap Sprite

gamit ang mas naunang mga tagubilin gumamit ng paint.net at gumawa ng isang bagong file gawin itong 30x15 pixel (pic1) at gumuhit ng isang magaspang na kotse ang aming batang taga-disenyo ay nagsisimula muna sa windscreen (mga larawan 2 at 3).

muling i-save ito bilang isang windows bmp file (tulad ng sa step2), i-convert sa isang C bitmap (step3) at ilagay ang file ng car.c (o kung ano ang napagpasyahan mo) sa parehong folder bilang isang bagong nilikha na arduino ino (sketch) file

(p.s. tandaan na idagdag ang # isama ang linya sa kotse.c na ginamit ito upang madalas kaming mailabas)

Una i-link ang iyong katumbas ng kotse.c

# isama

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

Pagpapakita ng Adafruit_SSD1306 (128, 64); // itakda ang resolusyon ng display

/ * bmpX / bmpY kailangan namin ang mga ito upang maging variable habang binabago ang mga halagang ito at muling pagdidraw

ang screen ay kung paano namin lilikha ng kilusan na epekto ng animation. Ang hitSide at hitTop ay kung paano namin panatilihin ang sprite sa screen * / uint8_t bmpX, bmpY = 0; // reserve memory for 2 8 bit ints (0-255) hindi namin kailangan ng mas malaking 128 ang magiging pinakamalaking bilang na ginamit na bool hitSide = 0; bool hitTop = 0;

walang bisa ang pag-setup ()

{pagkaantala (100); // bigyan ang oras ng pagpapakita atbp sa lakas sa display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // ito ay upang simulan ang display display.clearDisplay (); // magsimula sa isang blangkong screen

}

walang bisa loop ()

{display.clearDisplay (); // blangko ang screen // bitmap na iginuhit mula sa kaliwang tuktok, x, y, pangalan ng bitmap, lapad X, taas Y, pagpapakita ng kulay.drawBitmap (bmpX, bmpY, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // display.display (); / / Ito talaga ang kumukuha ng buffer sa display kailanman / * ganito namin susubaybayan ang gilid ng screen at magpapasya kung magdagdag ng isang paglipat ng pixel sa itaas) o alisin ang isang pixel (ilipat ang ibaba sa itaas) * / switch (hitSide) // pipiliin ito ng direksyon ng kotse batay sa boole {case 0: bmpX ++; pahinga;

kaso 1:

bmpX--; pahinga; } // itong 2 kung ang mga pahayag ay nagtatakda ng bool sa totoo o hindi kung (bmpX == 0) {hitSide = 0; } kung (bmpX == 96) // ang lapad ng screen na minus ang kotse {hitSide = 1; } // kapareho sa itaas para sa Y axis kung (bmpY == 0) {hitTop = 0; } kung (bmpY == 49) // taas ng screen na minus ang taas ng kotse {hitTop = 1; } switch (hitTop) {case 0: bmpY ++; pahinga; kaso 1: bmpY--; pahinga; }

}

maaari mong makita ang programa na gumagana sa kalakip na video

Hakbang 6: Paggawa ng Laro sa Pagmamaneho

Image
Image

Una Nagsisimula kami sa pamamagitan ng pagguhit ng ilang magkakaibang mga kotse o hadlang tulad ng sa mga naunang yugto ng tutorial na ginagawa silang 30x15 pixel. Pagkatapos ay i-convert namin ang mga ito sa c bitmaps at i-link sa code.

# isama // // ang mga landas na ito ay kailangang baguhin ang umaasa

// sa kung saan mo iniimbak ang mga file // edit: ngayon ko lang nalaman kung papalitan mo ng // ng "" hindi mo kailangan ng buong landas // sa iyong sariling mga aklatan # isama

# isama

# isama ang # isama

# isama

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

Pagpapakita ng Adafruit_SSD1306 (128, 64); // tukuyin ang mga parameter ng pagpapakita

tukuyin ang mga variable at nakapirming halaga

// tukuyin ang mga input pin na ito ang mga pin sa arduino na hindi nila binabago kaya # tukuyin # tukuyin ang INTPIN 3 // ang mga pin lamang na 2 at 3 ay maaaring maging interupt pin sa UNO # tukuyin ang UPPIN 4 // ang mga ito ay konektado sa mga pin tp kaugnay na switch #define DWNPIN 5 # tukuyin ang LFTPIN 6 # tukuyin ang RHTPIN 7 # tukuyin ang SND 9 // tukuyin ang mga direksyon

#define DIRUP 1 // ang mga halagang ito ang tinitingnan ng "ahas" upang magpasya-

#define DIRDOWN 2 // ang direksyon na bibiyahe ng ahas # tukuyin ang DIRLEFT 3 #define DIRRIGHT 4

uint8_t dirPressed = 0; // halaga upang magrehistro ng direksyon upang lumipat sa kung aling pin ang naging mataas

// store ng booleans kung aling pin ang tumaas

bool BUTUP = 0; bool BUTDWN = 0; bool BUTLFT = 0; bool BUTRHT = 0; // vars para sa posisyon ng kotse uint8_t carPosX = 1; uint8_t carPosY = {0, 16, 32, 48}; // pangangailangan ng halaga cahnging ang array

uint8_t lanePosArr = {0, 16, 32, 48}; // array upang maiimbak kung nasaan ang bawat linya

uint8_t carPosYCnt = 0; uint8_t carYTmp = 0; // variable para sa mga linya sa kalsada uint8_t roadLineX1 = 51; // ang mga ito ay paunang natukoy sa simula pagkatapos ng mga linya ay lilitaw seamless uint8_t roadLineX2 = 102; uint8_t roadLineX3 = 153; uint8_t roadLineX4 = 254; uint8_t roadLineX5 = 200;

// ito ay kung gaano karaming mga pixel ang lugar ng pag-play na gumagalaw nang paisa-isa

uint8_t drawSpeed = 4;

// vars para sa kaaway0

uint8_t kaaway0PosX = 255; uint8_t kaaway0PosY = 0; uint8_t kaaway1PosX = 255; uint8_t kaaway1PosY = 0; uint8_t kaaway2PosX = 255; uint8_t kaaway2PosY = 0;

// varialble to random magtalaga ng isang linya sa mga hadlang

uint8_t laneGen = 0;

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

// counter ng iskor

mahabang iskor = 0; // this is the score: / lol mahabang ihambing = 0; // iniimbak nito ang iskor sa huling antas hanggang sa ihambing pabalik sa mahabang highScore = 25; uint8_t metreCnt = 0;

dito namin sinisimulan ang mga pagpapaandar

// ito ang hanay ng mga utos kung ang nakakagambala ay naaktibo na walang bisa na nagambala () {pagkaantala (150); updateDirection (); } // i-update kung aling halaga ang nasa direksyon var sa pamamagitan ng pag-check sa DIR bools // -----------------UPDATE DIRECTION (player) - ----------------- void updateDirection () {//Serial.println("updateDirection Called "); BUTUP = digitalRead (UPPIN); BUTDWN = digitalRead (DWNPIN); BUTLFT = digitalRead (LFTPIN); BUTRHT = digitalRead (RHTPIN); kung (BUTUP == totoo) {dirPressed = DIRUP; } kung (BUTDWN == totoo) {dirPressed = DIRDOWN; } kung (BUTLFT == totoo) {dirPressed = DIRLEFT; } kung (BUTRHT == totoo) {dirPressed = DIRRIGHT; }

}

// ------------------------------- MOVE CAR ------------ -----------------

// maa-update ang screen ang mover ng sprite ng kotse

walang bisa moveCar ()

{switch (dirPressed) {case DIRUP: carPosYCnt--; carPosY [carPosYCnt]; tono (SND, 100, 100); kung (carPosYCnt == 255) {carPosYCnt = 0; } carYTmp = carPosY [carPosYCnt]; naka-press = 0; // Serial.println ("carPosY up"); // Serial.println (carPosYCnt); pahinga; kaso DIRDOWN: carPosYCnt ++; tono (SND, 100, 100); kung (carPosYCnt == 4) {carPosYCnt = 3; } // Serial.println ("carPosY"); // Serial.println (carPosYCnt); carYTmp = carPosY [carPosYCnt]; naka-press = 0; pahinga; // nagkomento ng kotse na makagalaw sa kaliwa at kanang pagtuklas ng banggaan hindi pa ganon kahusay / * kaso DIRLEFT: carPosX--; kung (carPosX == 0) {carPosX = 1; } // Serial.println ("carPosX"); // Serial.println (carPosX); naka-press = 0; pahinga; * / case DIRRIGHT: // para lang sa kasiyahan kung pinindot mo ang tama ang laro ay gagawa ng isang tone ng ingay (SND, 100, 50); // carPosX ++; // if (carPosX == 128) // {// carPosX = 127; //} // Serial.println ("carPosX"); // Serial.println (carPosX); // dirPressed = 0; pahinga; } updateDisplay (); }

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

uint8_t randomPosX () // ang 2 gawain na ito ay bumubuo lamang ng random na posisyon para sa mga hadlang

{uint8_t posValTmp = 0; posValTmp = random (129, 230); //Serial.println("random x "); //Serial.println(posValTmp); bumalik (posValTmp); }

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

uint8_t randomPosY ()

{uint8_t laneVal = 0; laneVal = random (0, 4); // magdagdag ng dagdag na linya para sa pagiging random ibig sabihin walang object sa screen habang nasa linya na iyon //Serial.println("RandomY "); //Serial.println(lanePosArr[laneVal]); bumalik (lanePosArr [laneVal]); }// ------------------------------- SET GAME SPEED ------------ ------------ void setGameSpeed () // ihihinto nito ang antas na mas mataas sa 20 na ginagawang hindi mapaglaruan ang laro {kung (drawSpeed <21) {drawSpeed = drawSpeed + 2; }}// ------------------------------------ DETECT CRASH ---------- ----------------

kung (kaaway0PosX = 0 && kaaway0PosY == carYTmp)

{// Serial.println ("Game Over CRAASSSSHHHHHHHEEEEDDD into Traffic 0"); tapos na ang laro(); } kung (kaaway1PosX = 0 && kaaway1PosY == carYTmp) {//Serial.println("Game Over CRAASSSSHHHHHHHEEEEDDD sa trapiko 1 "); tapos na ang laro(); } kung (kaaway2PosX = 0 && kaaway2PosY == carYTmp) {//Serial.println("Game Over CRAASSSSHHHHHHHEEEEDDD sa trapiko 2 "); tapos na ang laro(); }}

ito ang mga gawain na gumuhit ng display.

// ------------------------------- DRAW ROAD ------------- --------------------- walang bisa drawRoad () // X, Y, haba, lapad {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 (); } // ---- --------------------------------------- void enemysDraw () {// X, Y, pangalan ng bmp, lapad, taas, display ng kulay.drawBitmap (kaaway0PosX, kaaway0PosY, ENEMY0, ENEMY0_WIDTH, ENEMY0_HEIGHT, 1); kaaway0PosX = kaaway0PosX-drawSpeed; display.drawBitmap (kaaway1PosX, kaaway1PosY, ENEMY1, ENEMY1_WIDTH, ENEMY1_HEIGHT, 1); kaaway1PosX = kaaway1PosX-drawSpeed; display.drawBitmap (kaaway2PosX, kaaway2PosY, ENEMY2, ENEMY2_WIDTH, ENEMY2_HEIGHT, 1); kaaway2PosX = kaaway2PosX-drawSpeed; display.display (); kung (kaaway0PosX> 231 && kaaway0PosX231 && kaaway1PosX <255) {kaaway1PosX = randomPosX (); kaaway1PosY = randomPosY (); checkDuplicate (); }

kung (kaaway2PosX> 231 && kaaway2PosX <255) {kaaway2PosX = randomPosX (); kaaway2PosY = randomPosY (); }} // ------------------------------------ UPDATE DISPLAY -------- --------------------------------------- void updateDisplay () {display.clearDisplay (); display.drawBitmap (carPosX, carPosY [carPosYCnt], CARSPRITE, 30, 15, 1); display.fillRect (100, 0, 28, 10, BLACK); display.setCursor (100, 0); display.setTextColor (PUTI, BLACK); display.println (puntos); display.display ();

}

// ----------------- maghintay para sa presss loop ------------------- ------

// ito ang home screen code na walang bisa waitForPress () {splashScreen (); naghihintay ang bool = 0; // loop natatapos kapag ito ay tunay na display.clearDisplay (); habang (naghihintay == 0) {

display.fillRect (19, 20, 90, 32, BLACK); // blangko background para sa teksto

display.setTextColor (PUTI); display.setCursor (23, 24); display.setTextSize (0); display.println ("Reckless"); 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, WHITE); // border Snake display.drawRect (19, 20, 90, 33, WHITE); // border box - 3 display.setCursor (25, 43); display.setTextSize (0); // font bumalik sa normal na display.println ("pindutin ang anumang key"); display.fillRect (0, 0, 127, 8, BLACK); display.setCursor (10, 0); display.print ("Mataas na Kalidad:"); // display the high score display.print (highScore); display.display (); naghihintay = digitalRead (INTPIN); // check to see kung ang key na pinindot ang paghihintay ay magbabago sa 1 pagtatapos habang dirPressed = 0; // reset button pindutin nang walang direksyon}} // ----------------- ----- I-UPDATE ANG LARO --------------------------------------- walang bisa ang updateGame () {moveCar (); drawRoad (); enemysDraw (); // kaaway1Draw (); // kaaway2Draw (); metreCnt ++; detectCrash (); kung ang (metreCnt == 5) // ay nagdaragdag ng isang puntos para sa bawat 10 na pag-ikot upang mai-iskor ang iskor na {metreCnt = 0; puntos ++; } kung (puntos == ihambing + 5) // pinapabilis ang laro bawat 5 puntos sa maximum na 20 bilis {ihambing = iskor; setGameSpeed (); } noTone (SND); updateDisplay ();

}

// ------------------------------ TAPOS NA ANG LARO---------------- ----------------------------

// ang nakagawian na ito ay gumuhit ng mga linya sa paligid ng patay na kotse ng bayani pagkatapos ay ipinapakita ang laro sa paglipas ng screen

void gameOver ()

{tone (SND, 200, 200); // play sound uint8_t linePosX, linePosY, pixwidth, pixheight = 0; // set vars to draw box around car linePosX = carPosY; linePosY = carYTmp; pixwidth = 30; pixheight = 15; display.drawRect (linePosX, linePosY, pixwidth, pixheight, WHITE); display.display (); para sa (int i = 0; i <= 26; i ++) // pumapaligid ito sa kotse sa mga parihaba na tumutulad sa pagsabog {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, WHITE); display.display (); tono (SND, i * 20, 50); antala (10); } display.setTextSize (2); display.setTextColor (PUTI, BLACK); display.setCursor (10, 23); tono (SND, 50, 500); display.print ("GAME"); display.display (); pagkaantala (500); tono (SND, 40, 500); display.print ("OVER"); display.setTextSize (0); display.display (); pagkaantala (3000); restartGame (); waitForPress (); }

// --------------------------------------- RESTART GAME ----- ---- -----

void restartGame () // kinopya nito ang mataas na iskor at i-reset ang lahat ng mga istatistika at bumubuo ng mga random na posisyon

{if (score> = highScore) // suriin upang makita kung mas mataas ang iskor kaysa sa mataas na marka {highScore = iskor; // single kung statment upang mag-update ng mataas na marka}

puntos = 0;

drawSpeed = 4; metreCnt = 0; carPosYCnt = 0; kaaway0PosX = randomPosX (); kaaway0PosY = randomPosY (); kaaway1PosX = randomPosX (); kaaway1PosY = randomPosY (); kaaway2PosX = randomPosX (); kaaway2PosY = randomPosY (); noTone (SND);

checkDuplicate ();

}

// ----------------- - Suriin ang DUPLICATE ---------------------------------------------- ------ void checkDuplicate () // mga tsek na ito upang makita kung ang mga hadlang ay sumakop sa parehong puwang ng laro {// Serial.println ("naka-check na duplicate"); kung (kaaway2PosX> 230 && kaaway2PosX <255) {habang (kaaway2PosY == kaaway1PosY || kaaway2PosY == kaaway0PosY) {kaaway2PosY = randomPosY (); }}

kung (kaaway0PosX> 230 && kaaway0PosX230 && kaaway2PosXenemy1PosX && kaaway2PosX230 && kaaway0PosXenemy1PosX && kaaway0PosX

// ------------------------------------------- SPLASH SCREEN --- ----

walang bisa splashScreen ()

{display.clearDisplay (); display.drawBitmap (0, 0, CRASH, CRASHWIDTH, CRASHHEIGHT, 1); display.display (); pagkaantala (2000); } // -------------------------------------------- I-SETUP ----------- void setup () {pagkaantala (100); // hayaan ang mga bagay na magsimula // Serial.begin (9600); // i-kompromiso ito at lahat ng Serial. utos para sa fault diag display.begin (SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay (); display.setTextColor (PUTI, BLACK); display.setTextWrap (false); display.dim (0); pinMode (INTPIN, INPUT); pinMode (UPPIN, INPUT); pinMode (DWNPIN, INPUT); pinMode (LFTPIN, INPUT); pinMode (RHTPIN, INPUT);

attachInterrupt (digitalPinToInterrupt (INTPIN), naantala

// randomly place obstructions kaaway0PosX = randomPosX (); kaaway0PosY = randomPosY (); kaaway1PosX = randomPosX (); kaaway1PosY = randomPosY (); kaaway2PosX = randomPosX (); kaaway2PosY = randomPosY (); checkDuplicate (); // check for duplicate location // Serial.println ("Kumpleto na ang pag-set up"); splashScreen (); waitForPress (); } // -------------------------------------------- ----- LOOP -------------------------------------------- ----------

walang bisa loop ()

{updateGame (); }

at iyan ay halos lahat, ang anumang mga pagbabago at puna ay malugod na tinatanggap. Mga isyu na kailangan namin upang matugunan ang flicker ng screen na kailangan namin upang tingnan kung paano ito babawasan at ang mga kotse ng kaaway ay maaari pa ring sakupin ang parehong puwang.

Inirerekumendang: