Reckless Racer Arduino OLED Game, AdafruitGFX ja Bitmaps Basics: 6 vaihetta
Reckless Racer Arduino OLED Game, AdafruitGFX ja Bitmaps Basics: 6 vaihetta
Anonim
Holtiton Racer Arduino OLED -peli, AdafruitGFX ja Bitmaps Basics
Holtiton Racer Arduino OLED -peli, AdafruitGFX ja Bitmaps Basics
Holtiton Racer Arduino OLED -peli, AdafruitGFX ja Bitmaps Basics
Holtiton Racer Arduino OLED -peli, AdafruitGFX ja Bitmaps Basics

Tässä opetusohjelmassa tarkastelemme kuinka käyttää bittikarttoja käyttämällä Adafruit_GFX.c -kirjastoa eräänlaisena spriteinä pelissä. Yksinkertaisin peli, jota voisimme ajatella, on vieritys kaistaa vaihtava autopeli, lopulta betatestaajamme ja apukooderimme päättivät nimellä "Reckless Racer", koska on melko holtitonta ajaa väärää tietä moottoritietä pitkin !!.

Piirimme suunnittelu on yllä olevissa kuvissa, ja se on kuvattu yksityiskohtaisesti viimeisessä projektissamme/opetusohjelmassa täällä Snake Instructables, joka kuvaa piirin toimintaa.

me vaadimme

Adafruit_GFX

Paint.net

Arduino IDE windowslinux

ja katsokaa muiden laitteiden Snake -opetusohjelmaa.

Tarvikkeet

Käärme peli

Vaihe 1: Asenna Paint.net

Paint.netin asentaminen
Paint.netin asentaminen
Paint.netin asentaminen
Paint.netin asentaminen
Paint.netin asentaminen
Paint.netin asentaminen

Käytämme paint.netiä, koska ohjelmisto on ilmainen, joten voit ladata Paint. Netin täältä ilmaiseksi.

Asenna paint.net kaksoisnapsauttamalla ladattua ohjelmaa ja vastaamalla seuraavaan myönteisesti, kyllä, ok, olen samaa mieltä ja yllä olevat kuvat antavat sinulle ohjeet.

Vaihe 2: Yksinkertaisen aloitusnäytön piirtäminen

Yksinkertaisen aloitusnäytön piirtäminen
Yksinkertaisen aloitusnäytön piirtäminen
Yksinkertaisen aloitusnäytön piirtäminen
Yksinkertaisen aloitusnäytön piirtäminen
Yksinkertaisen aloitusnäytön piirtäminen
Yksinkertaisen aloitusnäytön piirtäminen

Kun olet paint.net -sivustossa, luo uusi kuva napsauttamalla Tiedosto ja sitten uusi, aseta kuvakoko 1260x620 (katso ensimmäinen kuva) napsauta OK, kun olet uusi sivu, piirrä aloitusnäyttö käyttämällä vain kahta väriä, mustavalkoista kynällä työkalu (kuva 2), kun olet piirtänyt (tai liittänyt) aloitusnäytön kuvan, napsauta kuvaa ja muuta sen kokoa (kuva4), muuta ponnahdusikkunassa kokoa 1260x620 - 126x62 (2 pikseliä pienempi kuin näyttösi) (kuva5) Napsauta OK.

napsauta seuraavaksi Tiedosto -valikkoa ja tallenna nimellä (kuva 6).

kun ponnahdusikkuna tulee näkyviin tiedostotyypin pudotusvalikosta, valitse BMP (bittikartta). (kuva 7), kirjoita tiedoston nimi ja napsauta Tallenna. Kun ponnahdusikkuna tulee näkyviin, valitse 0 ja 8 bitti, napsauta ok (kuva 8).

Vaihe 3: BMP: n muuntaminen C -bittikarttatiedostoksi

BMP: n muuntaminen C -bittikarttatiedostoksi
BMP: n muuntaminen C -bittikarttatiedostoksi
BMP: n muuntaminen C -bittikarttatiedostoksi
BMP: n muuntaminen C -bittikarttatiedostoksi
BMP: n muuntaminen C -bittikarttatiedostoksi
BMP: n muuntaminen C -bittikarttatiedostoksi
BMP: n muuntaminen C -bittikarttatiedostoksi
BMP: n muuntaminen C -bittikarttatiedostoksi

Nyt meidän on muutettava kuvasi muotoon, jonka arduino voi ymmärtää, että tähän on paljon työkaluja, mutta "mene" -paikkaani on is marlin -verkkosivuston bittikarttatyökalu …

marlinfw.org/tools/u8glib/converter.html

Joten aloitamme tämän osion käyttämällä yllä olevaa linkkiä avataksesi kuvan 1 verkkosivuston

napsauta Valitse tiedosto ja valitse aiemmin luomasi bittikartta (kuva 2)

marlin -bittikarttamuunnin muuntaa kuvan automaattisesti c -koodiksi vasemmalle kaksoisnapsauttamalla koodia, jonka pitäisi korostaa koodi, napsauta sitten hiiren kakkospainikkeella ja napsauta kopiota (kuva 3)

seuraava Luo hiiren kakkospainike ja luo uusi tekstiasiakirja (kuva 4)

kaksoisnapsauta uutta asiakirjaa, kun se avataan, napsauta hiiren kakkospainikkeella ja liitä koodi (kuva 5)

seuraavaksi meidän on lisättävä rivi koodin yläreunan lähelle #sisällytä tämä antaa meille mahdollisuuden tallentaa bittikarttatiedot arduinon flash -muistiin, sitten nimeämme #define leveys, korkeus ja nimi johonkin helpompaan käyttää näitä korostetaan kuvassa 6, Nimeämme ne uudelleen satunnaisesti luoduista merkeistä ja nimeämme ne alla alleviivattuun esimerkkiin

#määrittele LOGOWIDTH

#määrittele LOGOHEIGHT

const unsigned char LOGOPIC OHJELMA

napsauta seuraavaksi tiedostoa ja tallenna nimellä, tallenna tiedosto logolla. c sulje muistio, napsauta hiiren kakkospainikkeella logoa. c ja napsauta kopioi.

Vaihe 4: LOGON näyttäminen DrawBitmapin avulla

LOGON näyttäminen DrawBitmapin avulla
LOGON näyttäminen DrawBitmapin avulla
LOGON näyttäminen DrawBitmapin avulla
LOGON näyttäminen DrawBitmapin avulla
LOGON näyttäminen DrawBitmapin avulla
LOGON näyttäminen DrawBitmapin avulla

Nyt lataamme arduino IDE: n ja luomme uuden luonnoksen ja tallennamme sen nimeltä logoexample.ino, seuraavaksi huijareina arduino ideassa napsauta tiedostovalikkoa ja tallenna nimellä, palaa projektikansioon hiiren kakkospainikkeella ja liitä.c -tiedostoon (kuva 2) ja napsauta sitten Peruuta. Tämä säästää sinun selaamisen kansioon, jonka haluat liittää tiedostoon.

kirjoita seuraava koodi arduino IDE: hen tai lataa ino.

(suosittelemme kirjoittamista sen sijaan, että kopioit ja liitä tai käytät alla olevia tiedostoja, sillä se on paras tapa oppia)

#include /* tämä vaihtelee sen mukaan, missä tallennat

ino yleensä kansiossa C: / Users / ~ käyttäjänimi / Documents / Arduino / project ~ name

ja näin linkitämme bittikarttaamme */

#sisältää

#sisältää

uint8_t bmpX, bmpY = 0; /* varaa muisti 2 x 8 -bittisille kokonaisluvuille, tarvitsemme vain 8 -bittisiä intejä

koska arvo ei ole koskaan suurempi kuin 128 (pikseliä), joten voimme säästää tilaa käyttämällä 8 -bittisiä intejä (joiden enimmäisarvo on 255) */

mitätön asennus ()

{viive (100); // anna näytölle jne. aika näytön käynnistämiseen.begin (SSD1306_SWITCHCAPVCC, 0x3C); // tämä alustaa näytön näytön.clearDisplay (); // aloita tyhjästä näytöstä}

/* Huomaa, että sinun ei tarvitse kirjoittaa näitä kommentteja viitteellisinä …………..

komento, johon aiomme keskittyä, on display.drawBitmap, tämä piirtää aloitusnäytön. (bmpX, on X -akselin arvo näytöllä, jossa bittikartan X -ankkuripiste on ja bmpX ja bmpY ovat arvot, joista olemme kiinnostuneita luomaan liikettä (bmpY, on Y -akselin arvo näytöllä, jossa Y -ankkuri bittikartan piste on, että saamme viitenimet sellaisina kuin ne on määritelty logossa. c (LOGOPIC, on bittikartan nimi #included -tiedoston logossa. c (LOGOWIDTH, kuinka monta pikseliä (X) piirtää bittikartta ankkuripisteestä (LOGOHEIGHT, kuinka monta pikseliä alaspäin (Y) vedetään bittikartta ankkuripisteestä X- ja Y -pikselit voidaan syöttää manuaalisesti, mutta on vain helpompaa käyttää ennalta määritettyjä kuin muistaa ne kaikki (1, viimeinen arvo on väri, koska näyttö on mono 0 musta 1 valkoinen. okei aloita kirjoittaminen seuraavasta rivistä: ¬D lol*/ void loop () {display.clearDisplay (); // tyhjennä näyttö // bittikartta vasen yläkulma, x, y, bittikartan nimi, leveys X, korkeus Y, värinäyttö.drawBitmap (bmpX, bmpY, LOGOPIC, LOGOWIDTH, LOGOHEIGHT, 1); display.display (); // tämä todella vetää puskurin näyttöön koskaan}

Lataa koodisi arduino ja vahvista, että se toimii (kuva 3).

Vaihe 5: Bitmap Spriten siirtäminen

Image
Image
Bitmap Spriten siirtäminen
Bitmap Spriten siirtäminen
Bitmap Spriten siirtäminen
Bitmap Spriten siirtäminen

käytä aikaisempia ohjeita käyttämällä paint.net ja tee uusi tiedosto, tee siitä 30x15 pikseliä (kuva 1) ja piirrä karkea auto, jonka nuori suunnittelijamme aloittaa ensin tuulilasilla (kuvat 2 ja 3).

Tallenna se uudelleen Windows bmp -tiedostona (kuten vaiheessa 2), muunna C -bittikarttaksi (vaihe 3) ja aseta car.c -tiedosto (tai mitä ikinä päätätkään) samaan kansioon kuin äskettäin luotu arduino ino (luonnos) tiedosto.

(p.s. muista lisätä #include -rivi autoon. c tämä tavoitti meidät usein)

Linkitä ensin vastaava autosi. C

#sisältää

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

Adafruit_SSD1306 -näyttö (128, 64); // aseta näytön tarkkuus

/* bmpX/bmpY tarvitsemme näiden muuttujien näiden arvojen muuttamiseksi ja uudelleen piirtämiseksi

näyttö luo liikeanimaatiotehosteen. hitSide ja hitTop pitävät sprite ruudulla */ uint8_t bmpX, bmpY = 0; // varaa muisti 2 8-bittiselle tuumalle (0-255), jota emme tarvitse suurempana 128 on suurin käytetty bool hitSide = 0; bool hitTop = 0;

mitätön asennus ()

{viive (100); // anna näytölle jne. aika näytön käynnistämiseen.begin (SSD1306_SWITCHCAPVCC, 0x3C); // tämä alustaa näytön näytön.clearDisplay (); // aloita tyhjästä näytöstä

}

tyhjä silmukka ()

{display.clearDisplay (); // tyhjennä näyttö // bittikartta, joka on piirretty vasemmasta yläkulmasta, x, y, bittikartan nimi, leveys X, korkeus Y, värinäyttö.drawBitmap (bmpX, bmpY, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // display.display (); // tämä itse asiassa vetää puskurin näyttöön koskaan) // tämä valitsee auton suunnan boole {case 0: bmpX ++; tauko;

tapaus 1:

bmpX--; tauko; } // nämä 2 if -lauseet asettavat boolin arvoksi true tai false, jos (bmpX == 0) {hitSide = 0; } if (bmpX == 96) // näytön leveys miinus auto {hitSide = 1; } // sama kuin edellä Y -akselille, jos (bmpY == 0) {hitTop = 0; } if (bmpY == 49) // näytön korkeus miinus auton korkeus {hitTop = 1; } kytkin (hitTop) {tapaus 0: bmpY ++; tauko; tapaus 1: bmpY--; tauko; }

}

näet ohjelman toimivan liitteenä olevalta videolta

Vaihe 6: Ajopelin tekeminen

Image
Image

Ensinnäkin piirrämme muutamia erilaisia autoja tai esteitä, kuten opetusohjelman aiemmissa vaiheissa, jolloin niistä tulee 30x15 pikseliä. Sitten muunnamme ne c -bittikarttoiksi ja linkitämme koodin.

#include // näiden polkujen on muututtava riippuen

// missä tallennat tiedostot // muokkaa: olen juuri huomannut, jos korvaat // //: lla, et tarvitse koko polkua // omilla kirjastoillasi #include

#sisältää

#Sisällytä #Sisällytä

#sisältää

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

Adafruit_SSD1306 -näyttö (128, 64); // määritä näyttöparametrit

määritellä muuttujat ja kiinteät arvot

// määrittele syöttönastat, nämä ovat arduinon nastat, joita ne eivät koskaan muuta, joten #define #define INTPIN 3 // vain nastat 2 ja 3 voivat olla katkaisunappeja UNO: ssa #define UPPIN 4 // nämä ovat nastat kytketty tp asiaankuuluva kytkin #define DWNPIN 5 #define LFTPIN 6 #define RHTPIN 7 #define SND 9 // ohjeiden määrittäminen

#define DIRUP 1 // näitä arvoja "käärme" katsoo päättääkseen-

#määrittele DIRDOWN 2 // käärmeen kulkusuunta #määritä DIRLEFT 3 #määritä DIRRIGHT 4

uint8_t dirPressed = 0; // arvo rekisteröidäksesi suunnan siirtyäksesi kullekin tapille

// booleans -myymälä, joka nasta meni korkealle

bool BUTUP = 0; bool BUTDWN = 0; bool BUTLFT = 0; bool BUTRHT = 0; // vars auton sijainnille uint8_t carPosX = 1; uint8_t carPosY = {0, 16, 32, 48}; // tarvitsee arvoa taulukon sisällä

uint8_t lanePosArr = {0, 16, 32, 48}; // array tallentaa jokaisen kaistan

uint8_t carPosYCnt = 0; uint8_t carYTmp = 0; // muuttujat tien linjoille uint8_t roadLineX1 = 51; // nämä on etukäteen määritelty, sitten rivit näkyvät saumattomina uint8_t roadLineX2 = 102; uint8_t roadLineX3 = 153; uint8_t roadLineX4 = 254; uint8_t roadLineX5 = 200;

// kuinka monta pikseliä pelialue liikkuu kerrallaan

uint8_t drawSpeed = 4;

// vars viholliselle0

uint8_t vihollinen0PosX = 255; uint8_t vihollinen0PosY = 0; uint8_t vihollinen1PosX = 255; uint8_t vihollinen1PosY = 0; uint8_t vihollinen2PosX = 255; uint8_t vihollinen2PosY = 0;

// muuttuva satunnaiseen antaa kaistanumeron esteille

uint8_t laneGen = 0;

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

// tuloslaskuri

pitkä tulos = 0; // tämä on pisteet:/ lol pitkä vertailu = 0; // tämä tallentaa pisteet viimeisellä tasolla ja vertaa takaisin pitkään huipputulokseen = 25; uint8_t metreCnt = 0;

tästä aloitamme toiminnot

// tämä on komentojoukko, jos keskeytys on aktivoitu void interruptressed () {delay (150); updateDirection (); } // päivitä, mikä arvo on var-suunnassa, tarkistamalla DIR-boolit // -------------------------- UPDATE DIRECTION (pelaaja)- ------------------------- void updateDirection () {//Serial.println("updateDirection Called "); BUTUP = digitalRead (UPPIN); BUTDWN = digitalRead (DWNPIN); BUTLFT = digitalRead (LFTPIN); BUTRHT = digitalRead (RHTPIN); jos (BUTUP == true) {dirPressed = DIRUP; } if (PAINIKKO == tosi) {dirPressed = DIRDOWN; } if (BUTLFT == true) {dirPressed = DIRLEFT; } if (BUTRHT == true) {dirPressed = DIRRIGHT; }

}

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

// tämä päivittää auton liikkeen näytön

void moveCar ()

{kytkin (dirPressed) {case DIRUP: carPosYCnt--; carPosY [carPosYCnt]; sävy (SND, 100, 100); jos (carPosYCnt == 255) {carPosYCnt = 0; } carYTmp = carPosY [carPosYCnt]; dirPressed = 0; // Serial.println ("carPosY up"); // Serial.println (carPosYCnt); tauko; tapaus DIRDOWN: carPosYCnt ++; sävy (SND, 100, 100); jos (carPosYCnt == 4) {carPosYCnt = 3; } // Serial.println ("carPosY"); // Serial.println (carPosYCnt); carYTmp = carPosY [carPosYCnt]; dirPressed = 0; tauko; // kommentoi autoa, joka pystyy liikkumaan vasemmalle ja oikealle törmäyksen havaitseminen ei ole vielä niin hyvä /* tapaus DIRLEFT: carPosX--; jos (carPosX == 0) {carPosX = 1; } // Serial.println ("carPosX"); // Sarja.println (carPosX); dirPressed = 0; tauko; */ kotelo DIRRIGHT: // vain huvin vuoksi, jos painat oikealle, peli antaa melun (SND, 100, 50); // carPosX ++; // jos (carPosX == 128) // {// carPosX = 127; //} // Serial.println ("carPosX"); // Sarja.println (carPosX); // dirPressed = 0; tauko; } updateDisplay (); }

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

uint8_t randomPosX () // nämä 2 rutiinia tuottavat vain satunnaisen sijainnin esteille

{uint8_t posValTmp = 0; posValTmp = satunnainen (129, 230); //Sarja.println ("satunnainen x"); //Serial.println(posValTmp); return (posValTmp); }

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

uint8_t randomPosY ()

{uint8_t laneVal = 0; laneVal = satunnainen (0, 4); // lisää ylimääräinen kaista satunnaisuutta varten, eli näytöllä ei ole kohdetta sillä kaistalla //Serial.println("RandomY "); //Serial.println(lanePosArr[laneVal]); return (lanePosArr [laneVal]); }// ------------------------------- PELIN NOPEUDEN ASETTAMINEN -------------- -------------- void setGameSpeed () // tämä estää tason nousemasta yli 20, mikä tekee pelistä pelaamattoman {if (drawSpeed <21) {drawSpeed = drawSpeed+2; }}// ------------------------------------ HÄLYTÄ CRASH ---------- ----------------------- mitätön detectCrash () {

jos (vihollinen0PosX = 0 && vihollinen0PosY == autoYTmp)

{// Serial.println ("Peli CRAASSSSHHHHHHEEEEDDD: stä liikenteeseen 0"); peli ohi(); } jos (vihollinen1PosX = 0 && vihollinen1PosY == autoYTmp) {//Serial.println("Game Over CRAASSSSHHHHHHEEEEDDD osaksi liikennettä 1 "); peli ohi(); } jos (vihollinen2PosX = 0 && vihollinen2PosY == autoYTmp) {//Serial.println("Game Over CRAASSSSHHHHHHEEEEDDD osaksi liikennettä 2 "); peli ohi(); }}

nämä ovat rutiineja, jotka piirtävät näytön.

// ------------------------------- DRAW ROAD --------------- --------------------- void drawRoad () // X, Y, pituus, leveys {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 (); } // ----------------------------------------- DRAW viholliset ---- --------------------------------------- tyhjät vihollisetDraw () {// X, Y, bmp nimi, leveys, korkeus, värinäyttö.drawBitmap (vihollinen0PosX, vihollinen0PosY, ENEMY0, ENEMY0_WIDTH, ENEMY0_HEIGHT, 1); vihollinen0PosX = vihollinen0PosX-drawSpeed; display.drawBitmap (vihollinen1PosX, vihollinen1PosY, ENEMY1, ENEMY1_WIDTH, ENEMY1_HEIGHT, 1); vihollinen1PosX = vihollinen1PosX-drawSpeed; display.drawBitmap (vihollinen2PosX, vihollinen2PosY, ENEMY2, ENEMY2_WIDTH, ENEMY2_HEIGHT, 1); vihollinen2PosX = vihollinen2PosX-drawSpeed; display.display (); if (vihollinen0PosX> 231 && vihollinen0PosX231 && vihollinen1PosX <255) {vihollinen1PosX = satunnainenPosX (); vihollinen1PosY = satunnainenPosY (); checkDuplicate (); }

if (vihollinen2PosX> 231 && vihollinen2PosX <255) {vihollinen2PosX = satunnainenPosX (); vihollinen2PosY = satunnainenPosY (); }} // ------------------------------------ PÄIVITYSNÄYTTÖ -------- ---------------------------------------- void updateDisplay () {display.clearDisplay (); display.drawBitmap (carPosX, carPosY [carPosYCnt], CARSPRITE, 30, 15, 1); display.fillRect (100, 0, 28, 10, MUSTA); display.setCursor (100, 0); display.setTextColor (VALKOINEN, MUSTA); display.println (pisteet); display.display ();

}

// ------------------------- odota painosilmukkaa ------------------- ------

// tämä on aloitusnäytön koodi void waitForPress () {splashScreen (); bool odottaa = 0; // silmukka päättyy, kun tämä on tosi display.clearDisplay (); odottaessasi (odottaen == 0) {

display.fillRect (19, 20, 90, 32, MUSTA); // tyhjä tausta tekstille

display.setTextColor (VALKOINEN); 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); // raja Snake display.drawRect (19, 20, 90, 33, WHITE); // reunuslaatikko - 3 display.setCursor (25, 43); display.setTextSize (0); // fontti takaisin normaalinäyttöön.println ("paina mitä tahansa näppäintä"); display.fillRect (0, 0, 127, 8, MUSTA); display.setCursor (10, 0); display.print ("High Score:"); // näyttää korkeat pisteet display.print (highScore); display.display (); odottaa = digitalRead (INTPIN); // tarkista, muuttuuko odottavan näppäimen painallus 1: ksi, kun dirPressed = 0; // nollauspainike paina mitään suuntaa}} // -------------------------------------- ----- PÄIVITYSPELI ----------------------------------------- mitätön päivityspeli () {moveCar (); drawRoad (); enemysDraw (); // vihollinen1Piirrä (); // vihollinen2Draw (); metreCnt ++; detectCrash (); if (metreCnt == 5) // lisää pisteen jokaista 10 sykliä kohti pisteiden {metreCnt = 0; pisteet ++; } if (pisteet == vertaa+5) // nopeuttaa peliä 5 pisteen välein enintään 20 nopeuteen {vertaa = pisteet; setGameSpeed (); } noTone (SND); updateDisplay ();

}

// ------------------------------ PELI OHI---------------- ------------------------------

// tämä rutiini piirtää viivat kuolleen sankariauton ympärille ja näyttää sitten pelin ruudulla

mitätön peliOver ()

{sävy (SND, 200, 200); // toista ääntä uint8_t linePosX, linePosY, pixwidth, pixheight = 0; // aseta vars piirtämään laatikot auton linjan ympärillePosX = carPosY; linePosY = carYTmp; pikselin leveys = 30; pikselin korkeus = 15; display.drawRect (linePosX, linePosY, pikselin leveys, pikselin korkeus, VALKOINEN); display.display (); for (int i = 0; i <= 26; i ++) // tämä ympäröi auton suorakulmioina, jotka simuloivat räjähdystä {linePosX = linePosX-2; linePosY = linePosY-2; pikselin leveys = pikselin leveys+4; pikselin korkeus = pikselin korkeus+4; display.drawRect (linePosX, linePosY, pikselin leveys, pikselin korkeus, MUSTA); display.drawRect (linePosX, linePosY, pikselin leveys, pikselin korkeus, VALKOINEN); display.display (); sävy (SND, i*20, 50); viive (10); } display.setTextSize (2); display.setTextColor (VALKOINEN, MUSTA); display.setCursor (10, 23); sävy (SND, 50, 500); display.print ("PELI"); display.display (); viive (500); sävy (SND, 40, 500); display.print ("OVER"); display.setTextSize (0); display.display (); viive (3000); restartGame (); waitForPress (); }

// ----------------------------------------- UUDelleenkäynnistyspeli ----- -------------------------------------------------- -----

void restartGame () // tämä kopioi korkeat pisteet ja nollaa kaikki tilastot ja luo satunnaisia sijainteja

{if (score> = highScore) // tarkista, onko pisteet korkeammat kuin {highScore = score; // single if statment to update high score}

pisteet = 0;

drawSpeed = 4; metreCnt = 0; carPosYCnt = 0; vihollinen0PosX = satunnainenPosX (); vihollinen0PosY = satunnainenPosY (); vihollinen1PosX = satunnainenPosX (); vihollinen1PosY = satunnainenPosY (); vihollinen2PosX = satunnainenPosX (); vihollinen2PosY = satunnainenPosY (); noTone (SND);

checkDuplicate ();

}

// ------------------------------------------------ -TARKISTA DUPLIKAATTI ----------------------------------------------- ------ void checkDuplicate () // nämä tarkistavat, ovatko esteet samassa pelitilassa {// Serial.println ("duplicate tarkistettu"); if (vihollinen2PosX> 230 && vihollinen2PosX <255) {while (vihollinen2PosY == vihollinen1PosY || vihollinen2PosY == vihollinen0PosY) {vihollinen2PosY = satunnainenPosY (); }}

if (vihollinen0PosX> 230 && vihollinen0PosX230 && vihollinen2PosXenemy1PosX && vihollinen2PosX230 && vihollinen0PosXenemy1PosX && vihollinen0PosX

//------------------------------------------- ALOITUSRUUTU --- --------------------------------

void splashScreen ()

{display.clearDisplay (); display.drawBitmap (0, 0, CRASH, CRASHWIDTH, CRASHHEIGHT, 1); display.display (); viive (2000); } // ----------------------------------------------- PERUSTAA ------------------------------------------------- ----------- mitätön asennus () {viive (100); // anna asioiden alkaa // Serial.begin (9600); // kommentoi tätä ja koko sarjaa. vianmäärityskomennot.begin (SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay (); display.setTextColor (VALKOINEN, MUSTA); display.setTextWrap (epätosi); display.dim (0); pinMode (INTPIN, INPUT); pinMode (UPPIN, INPUT); pinMode (DWNPIN, INPUT); pinMode (LFTPIN, INPUT); pinMode (RHTPIN, INPUT);

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

// satunnaisesti aseta esteet vihollinen0PosX = randomPosX (); vihollinen0PosY = satunnainenPosY (); vihollinen1PosX = satunnainenPosX (); vihollinen1PosY = satunnainenPosY (); vihollinen2PosX = satunnainenPosX (); vihollinen2PosY = satunnainenPosY (); checkDuplicate (); // Tarkista päällekkäiset sijainnit // Serial.println ("asennus valmis"); aloitusruutu(); waitForPress (); } // ----------------------------------------------- ----- LOOP -------------------------------------------- ----------

tyhjä silmukka ()

{updateGame (); }

ja siinä kaikki, kaikki muutokset ja palaute ovat tervetulleita. Ongelmia, joita meidän on käsiteltävä näytön välkkymistä, meidän on tutkittava, miten sitä voidaan vähentää, ja vihollisen autot voivat silti käyttää samaa tilaa.

Suositeltava: