- Načrt igre:
- Shema vezja:
- Predpogoji:
- Programiranje Arduina za vesoljske dirke:
- Igra Arduino Space Racer:
Programiranje je bilo vedno zabavno in z razvojnimi platformami, kot je Arduino, je postalo veliko boljše. Skoraj vsak programer tukaj bi poskušal razviti nekakšno igro z uporabo jezika, ki se ga uči / vadi. To jim pomaga, da svoje spretnosti programiranja prilagodijo na zabaven, a produktiven način. Odkar sem se z njim seznanil, sem velik oboževalec Arduina in sem si vedno želel preizkusiti nekaj zanimivega, ko sem ugotovil, kako kul lahko postane z grafičnim LCD-jem, kot je Nokia 5110, skupaj z Arduinom - svojo idejo o razvoju igre To je bil zanimiv način, da si izpopolnite nekaj spretnosti programiranja in se hkrati zabavate, čeprav vas morda zanima tudi razvoj vaše igre. Zato bomo v tej vadnici izvedeli, kako lahko z Arduino in grafičnimi LCD-ji ustvarimo dostojno igro.
To staromodno igro Snake smo že zgradili z uporabo Arduina, zato tokrat poskušamo nekaj novega in to igro smo poimenovali Space Game Race Game, kjer morate svojo ladjo zaščititi pred sovražnimi ladjami s pomočjo krmilne palice.
Načrt igre:
Preden začnemo, je zelo pomembno, da načrtujemo, kako bi igra dejansko delovala. Za izbiro strojne opreme sem se odločil za grafični LCD in igralno palico Nokia5110. V tej vadnici predvidevam, da ste tudi vi izbrali isto. Ker Nokia 5110 nima veliko prostora, smo celotno igro načrtovali znotraj ločljivosti 84 * 48 slikovnih pik našega zaslona. Izdelali smo že vadnice o tem, kako povezati LCD Nokia 5110 z Arduino in Joystick z Arduino.
Znotraj tega prostora se moramo tesno prilegati igralnemu prostoru in območju tablice, kjer bodo prikazane stvari, kot so partiture in stvari. Zelo pomembno je vedeti lokacijo slikovnih pik, kamor postavljate stvari, da si lahko sledite njihovim lokacijam in jih posodobite na zaslonu.
Ko se odločimo za videz zaslona igre, se moramo odločiti za like v naši igri. Za mojo igro imamo samo dva, lik igralca, ki je vesoljska ladja, in lik sovražnika, ki bi moral nekako izgledati kot vesoljska ladja. LCD Nokia lahko prikazuje bitne slike, zato sem se odločil, da to možnost uporabim za prikaz svoje vesoljske ladje in sovražnikov.
Tako bomo imeli vesoljsko ladjo, ki dirka skozi vesoljske ladje nezemljanov, ta vesoljska ladja bo imela tri pasove za spreminjanje, da se izogne zadetku z nezemljani. Ves čas lahko tujci zasedejo samo dve progi in igralec bi moral imeti možnost vožnje po prosti progi. Ko so te ideje zaključene, lahko nadaljujemo s strojno opremo in nato s programiranjem.
Shema vezja:
Vezje za to igro Arduino je zelo preprosto; moramo le povezati modul LCD Nokia 5110 in igralno palico z Arduino. Celoten diagram vezja je prikazan spodaj
LCD Nokia 5110 deluje s 3,3 V, modul Joystick pa 5 V, zato poskrbite, da ga LCD priključite samo na 3,3 V, saj ga lahko 5 V trajno poškoduje. LCD komunicira z Arduinom prek protokola SPI, igralna palica pa bere ADC samo za odčitavanje spremembe napetosti. Nastavitev povezave bo spodaj videti približno tako
Predpogoji:
Preden se potopimo v programski del, je za vas pomembno, da ste priročni z modulom Display in igralno palico, zato lahko z naslednjimi vadnicami izvedete več o njih, nato pa se vrnete sem in se prepričate, da stvari delujejo tako, kot mi potrebujejo!
- Nokia 5110 LCD vmesnik z Arduino
- Modul igralne palice povezuje Arduino
Programiranje Arduina za vesoljske dirke:
Celoten program za igro lahko najdete na koncu te strani; lahko ga uporabite neposredno na vašem Arduino IDE in ga naložite na svojo ploščo. Če pa želite vedeti, kaj se dejansko dogaja v kodi, preberite naprej.
Kot vedno začnemo program z dodajanjem datotek z glavo knjižnice, za ta projekt potrebujemo tri knjižnice, od katerih je knjižnica SPI privzeto dodana v vaš IDE. Preostali dve knjižnici je treba prenesti s strani Adafruit Github. Če niste prepričani, kako dodati knjižnico, sledite vadnici o povezovanju LCD, omenjeni v razdelku s predpogoji.
#include
Če ste upoštevali vadnico, morate vedeti, da je možno bitne slike prikazati na LCD-prikazovalniku. Torej moramo sliko pretvoriti v bitno kodo s pomočjo programske opreme, omenjene v vadnici. Iz interneta lahko izberete katero koli sliko in jo uporabite tako, da jih pretvorite v bitno kodo. Poskrbite, da bo slika dovolj preprosta za prikaz na našem LCD zaslonu, pred dejanskim poskusom na LCD zaslonu preverite predogled. V našem programu smo uporabili dva bitna znaka, eden je vesoljska ladja, drugi pa sovražna ladja, bitna koda za oba je dodana v našo kodo, kot je prikazano spodaj.
// Bitmap podatki za SpaceShip static const unsigned char PROGMEM ship = { B00000000, B00000000, B00000001, B00000000, B00000011, B10000000, B00000010, B10000000, B00000010, B11000000, B00000111, B11000000, B00001101, B11100000, B0001111, B111111, B11 B01111111, B11111100, B01111111, B11111100, B01111111, B11111100, B00011111, B11110000, B00000111, B11100000, B00000000, B00000000, }; // Bitmap podatki za sovražnika static const unsigned char PROGMEM sovražnik = { B00000101, B11000000, B00001011, B11100000, B00000011, B11100000, B00110011, B11111000, B01111111, B11111100, B10111111, B11111010, B01110111, B11011100, B01111110, B11111100, B00111111, B11111100, B11101111, B11101110, B11000001, B00000110, B10000001, B00000010, B10000000, B00000010, B00000000, B00000000, };
Navesti moramo nožice, na katere je povezan zaslon Nokia LCD 5110. Zaslon se komunicira s pomočjo komunikacije SPI, če ste sledili zgornjemu vezju, bo koda za inicializiranje LCD-ja naslednja, ni je treba spremeniti.
Zaslon Adafruit_PCD8544 = Adafruit_PCD8544 (7, 6, 5, 4, 3); // Navedite nožice, na katere je povezan LCD
Znotraj nastavitvene funkcije zaženemo serijski monitor s hitrostjo 9600 baudov, tako da lahko odpravimo napake in nato inicializiramo LCD zaslon. Nastaviti moramo tudi kontrast LCD zaslona, vsak zaslon bo najbolje deloval v drugačni ravni kontrasta, zato se poigrajte z vrednostjo in preverite, katera vam najbolj ustreza. Na koncu očistimo tudi zaslon, da se začne na novo.
void setup () { Serial.begin (9600); // Serijski monitor za odpravljanje napak display.begin (); // Začnite komunikacijski zaslon LCD.setContrast (30); // Nastavimo kontrast zaslona display.clearDisplay (); // počisti zaslon in zažene novo }
Takoj ko se zaslon počisti, skočimo v funkcijo zanke in tam prikažemo zaslon igre. Zaslon igre ni nič drugega kot prikaz osnovnega okostja igre skupaj z rezultatom in stopnjo hitrosti. Funkcijo črt smo uporabili za risanje treh črt kot robov, na desni pa prikazujemo rezultat besedila in hitrost, tako kot stare retro ročne igralne naprave.
void gamescreen () { // Nariši mejo za prikaz zaslona.drawLine (0, 0, 0, 47, BLACK); display.drawLine (50, 0, 50, 47, ČRNA); display.drawLine (0, 47, 50, 47, ČRNA); // Vnesite privzeta besedila display.setTextSize (1); display.setTextColor (ČRNA); display.setCursor (52,2); display.println ("Hitrost"); display.setCursor (54,12); display.println (hitrost_igre); display.setCursor (52,25); display.println ("Ocena"); display.setCursor (54,35); display.println (rezultat); }
Nato moramo od uporabnika dobiti podatke, ki mu omogočajo nadzor nad vesoljsko ladjo. Vhod bo prejel modul Joystick, ki je povezan z zatičem A1. Analogna vrednost senzorja bo 512, če ga ne premaknete in se bo po premikanju vzdolž osi X povečevala in zmanjševala. Te vrednosti uporabljamo za ugotavljanje, ali se uporabnik želi pomakniti v levo ali v desno. Če težko razumete spodnji program, preberite vadnico Joystick za povezovanje z Arduinom, omenjeno v predpogojih.
// Pridobite podatke uporabnika Joy_X = analogRead (A1); // Preberite X-vrednost iz igralne palice if (Joy_X <312 && POS! = 1 && control == true) // Če se igralna palica premakne desno {POS--; control = false;} // Zmanjšaj položaj vesoljske ladje else if (Joy_X> 712 && POS! = 3 && control == true) // Če se igralna palica premakne desno {POS ++; control = false;} // Povečaj položaj vesoljske ladje else if (Joy_X> 502 && Joy_X <522) // Če se krmilna palica vrne v začetni položaj control = true; // Pripravite ga za naslednji korak // Vnos uporabnika je prejet
Potem ko uporabnik dobi položaj vesoljske ladje, moramo vesoljsko ladjo postaviti na to mesto. Uporabljamo spodnjo funkcijo in kot parameter posredujemo vrednost položaja, nato pa na podlagi položaja vesoljska ladja postavimo na svojo progo.
void player_car (char pos) // Vesoljsko ladjo postavite glede na izbrani položaj uporabnika { if (pos == 1) display.drawBitmap (2, 32, ladja, 15, 15, ČRNA); if (pos == 2) display.drawBitmap (18, 32, ladja, 15, 15, ČRNA); if (pos == 3) display.drawBitmap (34, 32, ladja, 15, 15, ČRNA); }
Zdaj, ko je naša vesoljska ladja postavljena na zaslon in je pripravljena na dirke, moramo predstaviti sovražne ladje, ki bodo tekmovale skupaj z igralcem. Vsakič, ko sovražna ladja prečka zaslon, domnevamo, da je mrtev, in ko je mrtev, moramo ustvariti novo vesoljsko ladjo. Spodnja funkcija deluje povsem enako. Ustvari nov položaj za dve sovražni ladji in ju postavi na vrh zaslona.
if (sovražnik_dead) // Preverjanje sovražnikovih ladij je mrtvih {// Če so mrtve sovražnik_0_pos = POS; // ustvarimo prvega sovražnika nad vesoljsko ladjo sovražnik_1_pos = naključno (0,4); // ustvarimo odkritega sovražnika na drugem naključnem mestu sovražnik_faze = 0; // Prinesite sovražnika iz vrha neprijatelj_dead = false; // Sovražnik je ustvarjen, da niso več mrtvi }
Ko sovražnikove ladje postavimo na vrh zaslona, jih moramo spustiti, tako da se zabode, kot da bi naš igralec dirkal navzgor, za to pa moramo le stopnjo faze (kraj prikazane slike) povečati tako, da počasi se spušča. Enako se naredi za obe sovražnikovi ladji, kot je prikazano spodaj
sovražnikovo ladje (sovražnik_0_pos, sovražna_faza); sovražna_faza ++; // postavimo prvega sovražnika na zaslon in ga spustimo navzdol (cura__1), sovražnik_faza) sovražna_faza ++; // Postavite zasedenega sovražnika na zaslon in ga spustite
Spodaj je prikazana funkcija sovražnika_potovanja , ki je zelo podobna funkciji igralca avtomobila, vendar imamo tukaj dva parametra. Eno je za postavitev sovražnika na progo, drugo pa za premikanje sovražnika proti dnu.
void sovražnik_čip (int mesto, int faza) // Postavite sovražnik_čip na novo mesto in fazo { if (mesto == 1) display.drawBitmap (2, faza, sovražnik, 15, 15, ČRNA); if (place == 2) display.drawBitmap (18, faza, sovražnik, 15, 15, ČRNA); if (place == 3) display.drawBitmap (34, faza, sovražnik, 15, 15, ČRNA); }
Naslednji del kode mora preveriti, ali se je vesoljska ladja izognila sovražni ladji. Da bi to preverili, moramo poznati položaj sovražnikovih ladij in igralčevo vesoljsko ladjo. Ker vemo vse, moramo le preveriti, ali je položaj vesoljske ladje enak sovražnikovi. To preverimo le, če je sovražna ladja prišla blizu vesoljske ladje. Če se igralec ni izognil sovražniku, pomeni, da je igra končana.
if (sovražna_faza> 22 && ((sovražnik_0_pos == POS) - (sovražnik__pos == POS))) // // če se vesoljska ladja dotakne katerega od sovražnikovih game_over (); // Prikaži igro konec
Če se je igralec sovražniku uspešno izognil, ga moramo ubiti in mu dati točko. Če želite to narediti, samo preverimo, ali je sovražnik dosegel dno zaslona, in če ga ubijemo, ga ubijemo s spodnjo kodo
if (sovražna_faza> 40) // Če vesoljska ladja pobegne sovražnikom { sovražnik_dead = res; score ++;} // Povečajte rezultat in ubijte sovražnike
Kako zabavno bi bilo, če ne bomo povečali težavnosti igre, ko bomo dosegali visoke ocene. Torej uporabimo drugo funkcijo, ki nato spremlja rezultat igralca in na podlagi rezultata poveča hitrost igre. Hitrost dejansko nadziramo s funkcijo zakasnitve, ki bo nadzorovala interval osveževanja igre, s čimer bo hitra ali počasna.
void Level_Controller () // Povečajte hitrost igre glede na rezultat. { if (rezultat> = 0 && rezultat <= 10) // Če je rezultat 0-10 { game_speed = 0; zamuda (80); // upočasnimo igro za 80ms } če (rezultat> 10 && rezultat <= 20) // Če rezultat 10-40 { game_speed = 1; zamuda (70); // igro upočasnimo za 70ms } če (rezultat> 20 && rezultat <= 30) // Če rezultat 20-40 { game_speed = 2; zamuda (60); // igro upočasnimo za 60ms } če (rezultat> 30 && rezultat <= 40) // Če rezultat 30-40 { game_speed = 3; zamuda (50); // upočasnimo igro za 50ms } }
Igra Arduino Space Racer:
Ko se prepričate, da se strojna oprema in program razumeta, samo sestavite vezje in naložite kodo na ploščo Arduino. Opazili boste, da se igra začne, kot je prikazano spodaj
S krmilno palčko pobegnite sovražni ladji s premikanjem levo ali desno. Če se želite izogniti vsakemu sovražniku, boste rezultat povečali za enega. Ko bo rezultat visok, se bo povečala tudi hitrost igre, to je povečanje hitrosti za 10 ms za vsakih 10 točk, ki jih dosežete. Lahko nadaljujete in nadgradite to igro, da uvedete nove ravni ali naredite nekaj sprememb v strojni opremi, da jo nadzirate s pomočjo merilnika pospeška. Ustvarjalnost je edina meja. Za referenco se tukaj naučite uporabljati merilnik pospeška z Arduinom.
Upam, da ste projekt razumeli in ste ga radi zgradili. Če ste naleteli na kakršno koli težavo pri tem, da to deluje, vas prosimo, da težavo objavite v spodnjem oddelku za komentarje ali uporabite tehnično forume. Srečno igranje !!
Preverite celotno kodo in predstavitveni video spodaj.