- Planul jocului:
- Diagrama circuitului:
- Cerințe prealabile:
- Programarea jocului Arduino pentru Space Race:
- Jocul Arduino Space Racer funcționează:
Programarea a fost întotdeauna distractivă și tocmai s-a îmbunătățit mult cu platforme de dezvoltare precum Arduino. Aproape fiecare programator de aici ar fi încercat să dezvolte un fel de joc folosind limbajul pe care îl învață / practică. Acest lucru îi ajută să-și regleze abilitățile de programare într-un mod distractiv, dar productiv. Am fost un mare fan al Arduino de când m-am prezentat la el și am vrut mereu să încerc ceva interesant cu el, când am aflat cât de cool se poate obține cu un LCD grafic precum Nokia 5110 împreună cu Arduino ideea mea de a dezvolta un joc A fost o modalitate interesantă de a regla puține abilități de programare și de a te distra în același timp, așa că, deși voi ar putea fi interesați să vă dezvoltați și jocul. Prin urmare, în acest tutorial vom învăța cum putem crea un joc decent folosind LCD-urile Arduino și grafice.
Am construit deja acel joc de șarpe de modă veche folosind Arduino, așa că de data aceasta încercăm ceva nou și am denumit acest joc drept Space Race Game, unde trebuie să vă păstrați nava în siguranță de navele inamice folosind joystick-ul.
Planul jocului:
Înainte de a începe, este foarte important să planificăm modul în care jocul dvs. ar funcționa efectiv. Am fost cu ecranul LCD grafic Nokia5110 și Joystick pentru selecția mea hardware. Presupun în acest tutorial că și voi ați selectat același lucru. Deoarece Nokia 5110 nu vine cu mult spațiu, ne-am planificat întregul joc în interiorul rezoluției de 84 * 48 pixeli a ecranului nostru. Am făcut deja tutoriale despre cum să interfațăm Nokia 5110 LCD cu Arduino și Joystick cu Arduino.
În acest spațiu trebuie să ne încadrăm strâns în zona de jocuri și în zona tabloului de scor, care va afișa lucruri precum scor și altele. Este foarte important să cunoașteți locația pixelilor în care plasați lucruri pentru a urmări locațiile pixelilor și a le actualiza pe ecran.
Odată ce aspectul ecranului jocului este decis, trebuie să decidem personajele din jocul nostru. Pentru jocul meu avem doar două, personajul jucător care este o navă spațială și un personaj inamic care ar trebui să arate ca o navă spațială extraterestră. LCD-ul Nokia poate afișa imagini bitmap, așa că am decis să folosesc această opțiune pentru a afișa nava mea spațială și inamicii.
Deci, vom avea o navă spațială care curge prin navele spațiale ale extratereștrilor, această navă spațială va avea trei benzi spre schimbări pentru a evita o lovitură cu extratereștrii. În orice moment, extratereștrii pot ocupa doar două piste, iar jucătorul ar trebui să poată conduce prin piesa liberă. Odată încheiate aceste idei, putem continua cu hardware-ul și apoi cu programarea.
Diagrama circuitului:
Circuitul acestui joc Arduino este foarte simplu; trebuie doar să interfațăm modulul LCD Nokia 5110 și joystick-ul cu Arduino. Schema completă a circuitului este prezentată mai jos
LCD-ul Nokia 5110 funcționează cu 3,3 V, iar modulul Joystick funcționează cu 5 V, deci asigurați-vă că conectați LCD-ul doar cu 3,3 V, deoarece 5 V îl pot deteriora permanent. Ecranul LCD comunică cu Arduino prin protocolul SPI, iar Joystick-ul citește ADC doar pentru a citi schimbarea tensiunii. Configurarea conexiunii va arăta cam așa mai jos
Cerințe prealabile:
Înainte de a ne arunca cu capul în partea de programare, este important pentru voi să fiți convenabili cu modulul Display și Joystick, astfel încât să puteți folosi următoarele tutoriale pentru a afla mai multe despre ele și apoi să reveniți aici pentru a vă asigura că lucrurile funcționează așa cum am nevoie de asta!
- Interfață LCD Nokia 5110 cu Arduino
- Interfață cu modulul Joystick cu Arduino
Programarea jocului Arduino pentru Space Race:
Programul complet pentru joc poate fi găsit la sfârșitul acestei pagini; îl puteți folosi direct pe IDE-ul dvs. Arduino și îl puteți încărca pe Board. Dar dacă doriți să știți ce se întâmplă de fapt în interiorul codului, citiți mai departe.
Ca întotdeauna, începem programul prin adăugarea fișierelor antet bibliotecii, avem nevoie de trei biblioteci pentru acest proiect, din care biblioteca SPI este adăugată în mod implicit la IDE. Celelalte două biblioteci trebuie descărcate de pe pagina Adafruit Github. Urmați tutorialul de interfață LCD menționat în secțiunea de cerințe prealabile dacă nu sunteți sigur cum să adăugați biblioteca.
#include
Dacă ați urmat tutorialul, trebuie să știți că este posibil să afișați imaginile bitmap pe LCD. Deci, trebuie să convertim imaginea necesară în cod bitmap utilizând software-ul menționat în tutorial, puteți selecta orice imagine de pe internet și o puteți utiliza convertindu-le în cod bitmap. Asigurați-vă că imaginea este suficient de simplă pentru a fi afișată pe ecranul nostru LCD, verificați previzualizarea înainte de a încerca efectiv pe ecranul LCD. În programul nostru am folosit două caractere bitmap, una este nava spațială și cealaltă este nava inamică, codul bitmap pentru ambele este adăugat în codul nostru, așa cum se arată mai jos.
// Date bitmap pentru SpaceShip static const unsigned char PROGMEM ship = { B00000000, B00000000, B00000001, B00000000, B00000011, B10000000, B00000010, B10000000, B00000010, B11000000, B00000111, B11000000, B00001, B11, B11, B11, B11, B11, B11 B01111111, B11111100, B01111111, B11111100, B01111111, B11111100, B00011111, B11110000, B00000111, B11100000, B00000000, B00000000, }; // Date bitmap pentru enemyship static const unsigned char PROGMEM inamic = { 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, };
Trebuie să specificăm pinii la care este conectat ecranul Nokia LCD 5110. Afișajul este comunicat cu ajutorul comunicării SPI, dacă ați urmat schema de circuit de mai sus, codul pentru inițializarea ecranului LCD va fi după cum urmează, nu este necesar să îl modificați.
Adafruit_PCD8544 display = Adafruit_PCD8544 (7, 6, 5, 4, 3); // Specificați pinii la care este conectat ecranul LCD
În interiorul configurare funcția pe care tocmai începe monitorul serial la 9600 rata de transfer, astfel încât să putem depana lucruri și apoi inițializa ecranul LCD. De asemenea, trebuie să setăm contrastul afișajului LCD, fiecare afișaj va funcționa cel mai bine într-un nivel de contrast diferit, așa că jucați cu valoarea pentru a verifica care se potrivește cel mai bine pentru dvs. În cele din urmă, ștergem și ecranul de afișare pentru a începe din nou.
void setup () { Serial.begin (9600); // Monitor serial pentru depanare display.begin (); // Începeți afișarea comunicării LCD.setContrast (30); // Setați contrastul afișajului display.clearDisplay (); // șterge ecranul și începe nou }
De îndată ce ecranul este șters, sărim în funcția de buclă și acolo afișăm ecranul jocului. Ecranul jocului nu este altceva decât care afișează un schelet de bază pentru joc, împreună cu scorul și nivelul de viteză. Am folosit funcția de linie pentru a trasa trei linii ca margini și în dreapta afișăm scorul și viteza textului, la fel ca vechile dispozitive de joc retro de mână.
void gamescreen () { // Draw the Border for Screen display.drawLine (0, 0, 0, 47, BLACK); display.drawLine (50, 0, 50, 47, NEGRU); display.drawLine (0, 47, 50, 47, NEGRU); // Introduceți textele implicite display.setTextSize (1); display.setTextColor (NEGRU); display.setCursor (52,2); display.println ("Viteză"); display.setCursor (54,12); display.println (game_speed); display.setCursor (52,25); display.println ("Scor"); display.setCursor (54,35); display.println (scor); }
Apoi, trebuie să obținem datele de la utilizator pentru a-i permite să controleze nava spațială. Intrarea va fi primită de la modulul Joystick care este conectat la pinul A1. Valoarea analogică a senzorului va fi 512 dacă nu este mișcat și va crește și scădea atunci când este deplasat de-a lungul axei X. Folosim aceste valori pentru a determina dacă utilizatorul dorește să se deplaseze la stânga sau la dreapta. Ar trebui să citiți interfața Joystick cu tutorialul Arduino menționat în cerințe prealabile dacă vă este greu să înțelegeți programul de mai jos.
// Obțineți intrări de la utilizatorul Joy_X = analogRead (A1); // Citiți X vaue de la Joystick dacă (Joy_X <312 && POS! = 1 && control == true) // Dacă joystick se mișcă spre dreapta {POS--; control = false;} // Decrementează poziția navei spațiale altceva dacă (Joy_X> 712 && POS! = 3 && control == true) // Dacă joystick se mișcă spre dreapta {POS ++; control = false;} // Incrementează poziția navei spațiale altceva dacă (Joy_X> 502 && Joy_X <522) // Dacă joystick-ul revine la poziția inițială control = true; // Pregătiți-l pentru următoarea mutare // Intrare de la utilizator primit
După ce am obținut poziția navei spațiale de la utilizator, trebuie să plasăm nava spațială în acel loc anume. Folosim funcția de mai jos și trecem valoarea poziției ca parametru, apoi pe baza poziției navei spațiale este plasată în pista respectivă.
void player_car (char pos) // Plasați nava spațială pe baza poziției selectate de utilizator { 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); }
Acum, când nava noastră spațială este plasată pe ecran și este pregătită pentru curse, trebuie să introducem navele inamice care vor concura împreună cu jucătorul. De fiecare dată când o navă inamică a trecut ecranul, presupunem că este mort și când este mort, trebuie să creăm o nouă navă spațială. Funcția de mai jos face la fel. Creează o nouă poziție pentru două nave inamice și le plasează în partea de sus a ecranului.
if (inamic_dead) // Verificarea dacă navele inamice sunt moarte {// If they are dead malamic_0_pos = POS; // creați primul inamic deasupra navei spațiale inamic_1_pos = aleatoriu (0,4); // creați un inamic secret într-un alt loc aleatoriu faza_inamic = 0; // Adu inamicul de sus inamicul_dead = false; // Inamicul este creat, așa că nu mai sunt morți }
După plasarea navelor inamice în partea de sus a ecranului, trebuie să o coborâm astfel încât să se arunce ca și cum jucătorul nostru ar alerga în sus, pentru a face acest lucru, trebuie doar să incrementăm faza (locul unde este afișată imaginea), astfel încât coboară încet. Același lucru se face pentru ambele nave inamice, așa cum se arată mai jos
nava_inamic (inamic_0_pos, inamic_faza); faza_inamic ++; // Așezați primul inamic pe ecran și conduceți-l în jos pe navă_inamic (inamic_1_pos, inamic_faza); faza_inamic ++; // Puneți dușmanul secund pe ecran și conduceți-l în jos
Funcția enemic_ship este prezentată mai jos, este foarte asemănătoare cu funcția mașinii player, dar aici avem doi parametri. Una este pentru plasarea inamicului pe o pistă, iar cealaltă este pentru deplasarea inamicului spre fund.
void malamic_ship (int place, int phase) // Plasa malamic_ship în noul loc și faza { if (place == 1) display.drawBitmap (2, fază, inamic, 15, 15, BLACK); if (place == 2) display.drawBitmap (18, fază, inamic, 15, 15, NEGRU); if (place == 3) display.drawBitmap (34, fază, inamic, 15, 15, NEGRU); }
Următoarea bucată de cod ar trebui să verifice dacă nava spațială a evitat nava inamică. Pentru a verifica acest lucru, trebuie să cunoaștem poziția navelor inamice și a navei spațiale a jucătorului. Deoarece știm toate acestea, trebuie doar să verificăm dacă poziția navei spațiale este la fel ca și nava inamică. Verificăm acest lucru numai dacă nava inamică a ajuns în apropierea navei spațiale. Dacă jucătorul nu a evitat inamicul înseamnă că jocul s-a încheiat.
if (enemic_phase> 22 && ((enemic_0_pos == POS) - (enemic_1_pos == POS))) // Dacă nava spațială atinge oricare dintre inamic game_over (); // Afișați jocul terminat
Dacă jucătorul a evitat cu succes inamicul, atunci ar trebui să-l ucidem și să-i dăm un punct. Pentru a face acest lucru, trebuie doar să verificăm dacă inamicul a ajuns în partea de jos a ecranului și dacă o face, îl ucidem folosind codul de mai jos
if (faza_inamic> 40) // Dacă nava spațială scapă de inamici {inamic_muritor = adevărat; scor ++;} // Măriți scorul și ucideți dușmanii
Ce distracție ar fi dacă nu creștem dificultatea jocului pe măsură ce obținem scoruri mari. Deci, folosim o altă funcție care apoi monitorizează scorul jucătorului și pe baza scorului va crește viteza jocului. Viteza este de fapt controlată prin utilizarea funcției de întârziere, aceasta va controla intervalul de reîmprospătare a jocului, făcându-l astfel rapid sau lent.
void Level_Controller () // Creșteți viteza jocului pe baza scorului. { if (scor> = 0 && scor <= 10) // Dacă scor 0-10 { game_speed = 0; întârziere (80); // încetiniți jocul cu 80 ms } dacă (scor> 10 && scor <= 20) // Dacă scor 10-40 { game_speed = 1; întârziere (70); // încetiniți jocul cu 70 ms } dacă (scor> 20 && scor <= 30) // Dacă scor 20-40 { game_speed = 2; întârziere (60); // încetiniți jocul cu 60 ms } dacă (scor> 30 && scor <= 40) // Dacă scor 30-40 { game_speed = 3; întârziere (50); // încetini jocul cu 50 ms } }
Jocul Arduino Space Racer funcționează:
După ce vă asigurați că hardware-ul și programul sunt înțelese, construiți circuitul și încărcați codul pe placa Arduino. Ar trebui să observați că jocul începe, așa cum se arată mai jos
Folosiți joystick-ul pentru a scăpa de nava inamică deplasându-vă la stânga sau la dreapta. Pentru evitarea fiecărui inamic, veți obține scorul dvs. crescut cu unul. Când scorul crește, viteza jocului va crește, de asemenea, creșterea vitezei cu 10 ms pentru fiecare 10 puncte pe care le înscrieți. Puteți merge mai departe și construi pe acest joc pentru a introduce noi niveluri sau pentru a face fiecare schimbare hardware pentru a-l controla prin mișcare folosind un accelerometru. Creativitatea este singura limită. Pentru referință, învățați să folosiți Accelerometer cu Arduino aici.
Sper că ați înțeles proiectul și v-a plăcut să îl construiți. Dacă v-ați confruntat cu orice problemă pentru a face acest lucru să funcționeze, vă rugăm să nu ezitați să postați problema în secțiunea de comentarii de mai jos sau să folosiți forumurile pentru ajutor tehnic. Jocuri fericite !!
Verificați codul complet și videoclipul demonstrativ de mai jos.