- Plán hry:
- Schéma zapojenia:
- Predpoklady:
- Programovanie Arduina pre hru Space Race:
- Arduino Space Racer Game pracuje:
Programovanie bolo vždy zábavné a s vývojovými platformami ako Arduino sa to oveľa zlepšilo. Takmer každý programátor tu by sa pokúsil vyvinúť nejaký druh hry pomocou jazyka, ktorý sa učí / precvičuje. To im pomáha zábavným, ale produktívnym spôsobom vyladiť svoje programovacie schopnosti. Bol som veľkým fanúšikom Arduina od chvíle, keď som sa s ním zoznámil, a vždy som s ním chcel vyskúšať niečo super, keď som zistil, aké chladné to môže byť s grafickým LCD displejom, ako je Nokia 5110, spolu s Arduinom, mojou myšlienkou vyvinúť hru bol nakopnutý. Bol to zaujímavý spôsob, ako vyladiť niekoľko programátorských schopností a zároveň sa baviť, takže aj vy by ste mohli mať záujem o vývoj svojej hry. Preto sa v tomto tutoriále dozvieme, ako môžeme vytvoriť Decentnú hru pomocou Arduina a grafických LCD.
Túto staromódnu hru Snake sme už vytvorili pomocou Arduina, takže tentokrát skúšame niečo nové a túto hru sme nazvali Space Race Game, kde musíte pomocou joysticku udržať svoju loď pred nepriateľskými loďami.
Plán hry:
Než začneme, je veľmi dôležité naplánovať si, ako by vaša hra skutočne fungovala. Pri výbere hardvéru som použil grafický LCD displej Nokia5110 a joystick. V tomto návode predpokladám, že ste si vybrali to isté. Pretože Nokia 5110 nemá veľa priestoru, naplánovali sme si celú našu hru do rozlíšenia 84 * 48 pixelov nášho displeja. Už sme vytvorili návody, ako prepojiť Nokiu 5110 LCD s Arduinom a Joystick s Arduinom.
V tomto priestore musíme pevne zapadnúť do hernej oblasti a do oblasti s výsledkami, ktoré budú zobrazovať veci ako skóre a podobne. Je veľmi dôležité poznať umiestnenie pixelov, kam umiestňujete veci, aby ste mali prehľad o umiestnení pixelov a aktualizovali ich na obrazovke.
Len čo sa rozhodne o vzhľade hernej obrazovky, musíme rozhodnúť o postavách v našej hre. Pre moju hru máme iba dve, hráčsku postavu, ktorá je vesmírnou loďou, a nepriateľskú postavu, ktorá by mala vyzerať ako mimozemská vesmírna loď. LCD Nokia dokáže zobraziť bitmapové obrázky, a tak som sa rozhodol využiť túto možnosť na zobrazenie svojej vesmírnej lode a nepriateľov.
Takže budeme mať vesmírnu loď, ktorá sa preháňa cez mimozemské kozmické lode, táto kozmická loď bude mať tri pruhy na zmeny, aby sa zabránilo zásahu mimozemšťanmi. Cudzinci môžu vždy obsadiť iba dve dráhy a hráč by mal byť schopný prejsť cez voľnú dráhu. Len čo sa tieto nápady uzavrú, môžeme pokračovať v hardvéri a potom v programovaní.
Schéma zapojenia:
Obvod pre túto hru Arduino je veľmi jednoduchý; musíme len prepojiť LCD modul Nokia 5110 a joystick s Arduino. Kompletná schéma zapojenia je uvedená nižšie
LCD displej Nokia 5110 pracuje s napätím 3,3 V a modul Joystick pracuje so napätím 5 V, preto pripojte LCD iba s napätím 3,3 V, pretože 5 V ho môže trvale poškodiť. Displej LCD komunikuje s Arduinom prostredníctvom protokolu SPI a joystick iba číta ADC, aby prečítal zmenu napätia. Nižšie bude vyzerať nastavenie pripojenia asi takto
Predpoklady:
Predtým, ako sa ponoríme do programovacej časti, je dôležité, aby ste pre ľudí boli pohodlní s modulom displeja a joystickom, takže pomocou nasledujúcich návodov získate ďalšie informácie a potom sa vráťte sem, aby ste sa uistili, že veci fungujú tak, ako fungujeme. potrebujem to!
- Nokia 5110 LCD prepojenie s Arduino
- Modul joysticku prepojený s Arduino
Programovanie Arduina pre hru Space Race:
Kompletný program pre hru možno nájsť na konci tejto stránky; môžete ho použiť priamo na vašom Arduino IDE a nahrať ho na vašu nástenku. Ak však chcete vedieť, čo sa vlastne v kóde deje, prečítajte si ďalej.
Ako vždy začneme náš program pridaním našich hlavičkových súborov knižnice, potrebujeme pre tento projekt tri knižnice, z ktorých je predvolene pridaná knižnica SPI do vášho IDE. Ďalšie dve knižnice si musíte stiahnuť zo stránky Adafruit Github. Ak si nie ste istí, ako pridať knižnicu, postupujte podľa návodu o prepojení LCD, ktorý je uvedený v časti predpoklady.
#include
Ak ste postupovali podľa návodu, mali by ste vedieť, že je možné zobraziť bitmapové obrázky na LCD displeji. Potrebujeme teda previesť požadovaný obrázok do bitmapového kódu pomocou softvéru uvedeného v tomto návode, môžete si vybrať akýkoľvek obrázok z internetu a použiť ho tak, že ho prevediete na bitmapový kód. Uistite sa, že je obrázok dostatočne jednoduchý na to, aby sa dal zobraziť na našej LCD obrazovke. Pred vlastným vyskúšaním na LCD obrazovke skontrolujte náhľad. V našom programe sme použili dva bitmapové znaky, jeden je kozmická loď a druhý je nepriateľská loď, bitmapový kód pre oba sa pridá do nášho kódu, ako je uvedené nižšie.
// bitmap Dáta pre kozmickej lode statické const unsigned char PROGMEM lodi = { B00000000, B00000000, B00000001, B00000000, B00000011, B10000000, B00000010, B10000000, B00000010, B11000000, B00000111, B11000000, B00001101, B11100000, B00011111, B11110000, B00111111, B11111000, B01111111, B11111100, B01111111, B11111100, B01111111, B11111100, B00011111, B11110000, B00000111, B11100000, B00000000, B00000000, }; // Bitmapové dáta pre nepriateľské statické konštantné nepodpísané znaky PROGMEM nepriateľ = { 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, };
Musíme určiť kolíky, ku ktorým je pripojený displej Nokia LCD 5110. Displej je komunikovaný pomocou SPI komunikácie, pokiaľ ste postupovali podľa schémy zapojenia vyššie, bude kód pre inicializáciu LCD nasledovný, nemusíte ho meniť.
Displej Adafruit_PCD8544 = Adafruit_PCD8544 (7, 6, 5, 4, 3); // Zadajte kolíky, ku ktorým je pripojený displej LCD
Vnútri nastavenie funkcie sme práve spustenie sériovej monitor 9600 prenosovou rýchlosťou, takže môžeme ladiť veci a potom inicializovať LCD displej. Musíme tiež nastaviť kontrast LCD displeja, každý displej bude fungovať najlepšie pri inej úrovni kontrastu, takže sa pohrajte s hodnotou a skontrolujte, ktorá vám najlepšie vyhovuje. Nakoniec tiež vyčistíme obrazovku, aby sme mohli začať znova.
void setup () { Serial.begin (9600); // Sériový monitor na ladenie display.begin (); // Začnite s LCD komunikačným displejom.setContrast (30); // Nastaví kontrast displeja display.clearDisplay (); // vymaže obrazovku a začne novú }
Akonáhle je obrazovka vyčistená, skočíme do funkcie slučky a tam zobrazíme obrazovku hry. Obrazovka hry nie je nič iné, ako iba to, čo zobrazuje základnú kostru hry spolu s úrovňou skóre a rýchlosti. Pomocou funkcie riadok sme nakreslili tri riadky ako hranice a vpravo zobrazujeme skóre textu a rýchlosť rovnako ako staré retro ručné herné zariadenia.
void gamescreen () { // Nakreslite orámovanie obrazovky ..drawLine (0, 0, 0, 47, ČIERNE); display.drawLine (50, 0, 50, 47, ČIERNA); display.drawLine (0, 47, 50, 47, ČIERNA); // Zadajte predvolené texty display.setTextSize (1); display.setTextColor (ČIERNA); display.setCursor (52,2); display.println ("Rýchlosť"); display.setCursor (54,12); display.println (hra_rychlost); display.setCursor (52,25); display.println ("Skóre"); display.setCursor (54,35); display.println (skóre); }
Ďalej musíme získať vstup od používateľa, aby sme mu umožnili ovládať vesmírnu loď. Vstup bude prijímaný z modulu Joystick, ktorý je pripojený k vývodu A1. Analógová hodnota zo snímača bude 512, ak sa ňou nebude pohybovať, a bude sa zvyšovať a znižovať, keď sa bude pohybovať pozdĺž osi X. Tieto hodnoty používame na určenie, či sa používateľ chce pohybovať doľava alebo doprava. Mali by ste si prečítať tutoriál o prepojení joysticku s Arduino, ktorý je uvedený v predbežných požiadavkách, ak je pre vás ťažké pochopiť program uvedený nižšie.
// Získanie vstupu od používateľa Joy_X = analogRead (A1); // Prečítajte si X vaue z Joysticku if (Joy_X <312 && POS! = 1 && control == true) // Ak sa joystick pohybuje doprava {POS--; control = false;} // Znížiť pozíciu vesmírnej lode else if (Joy_X> 712 && POS! = 3 && control == true) // Ak sa páčka joysticku pohybuje doprava {POS ++; control = false;} // Zvýši pozíciu kozmickej lode else if (Joy_X> 502 && Joy_X <522) // Ak joystick vráti do pôvodnej polohy control = true; // Pripravte ho na ďalší krok // Prijatý vstup od používateľa
Po získaní polohy vesmírnej lode od používateľa musíme vesmírnu loď umiestniť na konkrétne miesto. Použijeme nižšie uvedenú funkciu a odovzdáme hodnotu polohy ako parameter, potom sa na základe polohy vesmírna loď umiestni do svojej príslušnej stopy.
void player_car (char pos) // Umiestnite vesmírnu loď na základe polohy vybranej používateľom { if (pos == 1) display.drawBitmap (2, 32, ship, 15, 15, BLACK); if (pos == 2) display.drawBitmap (18, 32, ship, 15, 15, BLACK); if (pos == 3) display.drawBitmap (34, 32, ship, 15, 15, BLACK); }
Teraz, keď je naša vesmírna loď umiestnená na obrazovke a je pripravená na preteky, musíme predstaviť nepriateľské lode, ktoré budú súťažiť spolu s hráčom. Zakaždým, keď nepriateľská loď prešla cez obrazovku, predpokladáme, že je mŕtva, a keď je mŕtva, musíme vytvoriť novú vesmírnu loď. To isté robí aj funkcia nižšie. Vytvára novú pozíciu pre dve nepriateľské lode a umiestňuje ich do hornej časti obrazovky.
if (nepriateľ_mŕtvy) // Kontrola mŕtvych nepriateľských lodí {// Ak sú mŕtve nepriateľ_0_pos = POS; // vytvorí prvého nepriateľa nad vesmírnou loď nepriateľom_1_pos = random (0,4); // vytvorte druhého nepriateľa na inom náhodnom mieste nepriateľská_fáza = 0; // Prineste nepriateľa z vrchného nepriateľa_dead = false; // Nepriateľ je stvorený, takže už nie sú mŕtvi }
Po umiestnení nepriateľských lodí na hornú časť obrazovky ich musíme zraziť tak, aby kopírovali, akoby náš hráč uháňal hore, aby sme to mohli urobiť, musíme len zvýšiť fázu (miesto, kde sa zobrazuje obrázok), aby pomaly to klesá. To isté sa robí pre obe nepriateľské lode, ako je uvedené nižšie
nepriateľská_loď (nepriateľ_0_pos, nepriateľská_fáza); nepriateľská_fáza ++; // Umiestnite prvého nepriateľa na obrazovku a zničte ho nepriateľskou loďou (nepriateľ_1_pos, nepriateľská_fáza); nepriateľská_fáza ++; // Umiestnite druhotného nepriateľa na obrazovku a zrazte ho
Funkcia nepriateľská_loď je zobrazená nižšie, je veľmi podobná funkcii prehrávača, ale tu máme dva parametre. Jeden slúži na umiestnenie nepriateľa na dráhu a druhý na presun nepriateľa smerom dnu.
void nepriatel_loď (int miesto, int fáza) // Umiestnite nepriateľskú loď na nové miesto a fázu { if (miesto == 1) display.drawBitmap (2, fáza, nepriateľ, 15, 15, ČIERNA); if (place == 2) display.drawBitmap (18, fáza, nepriateľ, 15, 15, ČIERNA); if (place == 3) display.drawBitmap (34, fáza, nepriateľ, 15, 15, ČIERNA); }
Ďalšia časť kódu by mala skontrolovať, či sa vesmírna loď vyhla nepriateľskej lodi. Aby sme to skontrolovali, musíme poznať polohu nepriateľských lodí a vesmírnu loď hráča. Pretože vieme všetko, musíme len skontrolovať, či je pozícia vesmírnej lode rovnaká ako v prípade nepriateľskej lode. Toto skontrolujeme, iba ak sa nepriateľská loď dostala do blízkosti vesmírnej lode. Ak sa hráč nevyhol nepriateľom, znamená to koniec hry.
if (nepriateľská_fáza> 22 && ((nepriateľ_0_pos == POS) - (nepriateľ_1_pos == POS))) // Ak sa kozmická loď dotkne niektorého z nepriateľov game_over (); // Zobraziť koniec hry
Pokiaľ sa hráč úspešne vyhnúť nepriateľom, mali by sme nepriateľa zabiť a dať mu bod. Za týmto účelom iba skontrolujeme, či sa nepriateľ dostal do dolnej časti obrazovky a či ho zabije, pomocou nižšie uvedeného kódu
if (nepriateľská_fáza> 40) // Ak vesmírna loď unikne pred nepriateľmi { nepriateľ_dead = pravda; skóre ++;} // Zvýšte skóre a zabite nepriateľov
Aká by to bola zábava, keby sme nezvyšovali náročnosť hry, keď dosahujeme vysoké skóre. Používame teda inú funkciu, ktorá potom sleduje skóre hráča a na základe skóre zvýši rýchlosť hry. Rýchlosť sa v skutočnosti riadi pomocou funkcie oneskorenia, ktorá riadi interval obnovenia hry, čím sa zrýchľuje alebo spomaľuje.
void Level_Controller () // Zvýšte rýchlosť hry na základe skóre. { if (skóre> = 0 && skóre <= 10) // Ak skóre 0-10 { game_speed = 0; oneskorenie (80); // spomaliť hru o 80ms } if (skóre> 10 && skóre <= 20) // ak skóre 10-40 { game_speed = 1; oneskorenie (70); // spomaliť hru o 70ms } if (skóre> 20 && skóre <= 30) // ak skóre 20-40 { game_speed = 2; oneskorenie (60); // spomaliť hru o 60ms } if (skóre> 30 && skóre <= 40) // ak skóre 30-40 { game_speed = 3; oneskorenie (50); // spomaliť hru o 50ms } }
Arduino Space Racer Game pracuje:
Po skontrolovaní hardvéru a programu stačí zostaviť obvod a nahrať kód na dosku Arduino. Mali by ste si všimnúť, že hra začína, ako je uvedené nižšie
Pomocou joysticku uniknite z nepriateľskej lode pohybom doľava alebo doprava. Ak sa vyhnete každému nepriateľovi, skóre sa zvýši o jedného. Keď skóre stúpne, zvýši sa aj rýchlosť hry, to znamená zvýšenie rýchlosti o 10 ms za každých 10 bodov, ktoré získate. Môžete pokračovať a stavať na tejto hre, aby ste predstavili nové úrovne alebo vykonali nejaké hardvérové zmeny, ktoré ju ovládajú pohybom pomocou akcelerometra. Kreativita je jediný limit. Ako referenciu sa tu naučíte používať akcelerometer s Arduinom.
Dúfam, že ste pochopili projekt a páčilo sa vám jeho zostavenie. Ak ste pri zavádzaní tohto modulu narazili na akýkoľvek problém, neváhajte ho uverejniť v sekcii komentárov nižšie alebo použite technickú pomoc na fórach. Šťastné hranie !!
Skontrolujte kompletný kód a ukážkové video nižšie.