- Žaidimo planas:
- Grandinės schema:
- Išankstinės sąlygos:
- „Arduino“ programavimas kosmoso lenktynių žaidimui:
- „Arduino Space Racer“ žaidimas veikia:
Programavimas visada buvo įdomus ir su tobulėjimo platformomis, tokiomis kaip „Arduino“, tiesiog tapo daug geriau. Beveik kiekvienas čia esantis programuotojas būtų bandęs sukurti kokį nors žaidimą naudodamas kalbą, kurios jie mokosi / praktikuoja. Tai jiems padeda smagiai, bet produktyviai suderinti savo programavimo įgūdžius. Nuo tada, kai susipažinau su juo, visada buvau didelis „Arduino“ gerbėjas ir visada norėjau išbandyti ką nors šaunaus, kai sužinojau, kaip šaunu jis gali būti su grafiniu LCD, kaip „Nokia 5110“, kartu su „Arduino“ mano idėja sukurti žaidimą Tai buvo įdomus būdas suderinti keletą programavimo įgūdžių ir linksmintis tuo pačiu metu, taigi, nors ir jūsų vaikinai gali būti suinteresuoti plėtoti savo žaidimą. Taigi šioje pamokoje sužinosime, kaip galime sukurti „ Padorų žaidimą“ naudodami „Arduino“ ir „Graphical LCD“.
Mes jau sukūrėme tą senamadišką „Snake“ žaidimą naudodami „Arduino“, todėl šį kartą bandome kažką naujo ir pavadinome šį žaidimą kaip „ Space Race Game“, kuriame reikia valdyti vairą, kad jūsų laivas būtų saugus nuo priešo laivų.
Žaidimo planas:
Prieš pradedant, labai svarbu suplanuoti, kaip jūsų žaidimas iš tikrųjų veiktų. Apsirinkdamas aparatinę įrangą, nuėjau su „Nokia5110 Graphical LCD“ ir vairasvirtę. Manau, kad šioje pamokoje jūs taip pat pasirinkote tą patį. Kadangi „Nokia 5110“ nėra daug vietos, visą savo žaidimą planuojame atsižvelgdami į savo ekrano raišką 84 * 48 pikselių. Mes jau parengėme instrukcijas, kaip sąsają su „Nokia 5110 LCD“ naudoti su „Arduino“, o „Joystick“ su „Arduino“.
Šioje erdvėje turime tvirtai įsilieti į žaidimų ir rezultatų lentos sritis, kuriose bus rodomi tokie dalykai kaip rezultatas ir kita. Labai svarbu žinoti taškų vietą, kur dedate daiktus, kad galėtumėte sekti taškų vietas ir atnaujinti jas ekrane.
Nusprendę žaidimo ekrano išvaizdą, turime nuspręsti, kokie yra žaidimo veikėjai. Mano žaidime turime tik du - žaidėjo personažą, kuris yra kosminis laivas, ir priešo personažą, kuris turėtų atrodyti kaip ateivių erdvėlaivis. „Nokia“ skystųjų kristalų ekranas gali rodyti taškinių žemėlapių vaizdus, todėl nusprendžiau naudoti šią parinktį norėdamas parodyti savo kosminį laivą ir priešus.
Taigi turėsime kosminį laivą, kuris lenktyniaus per ateivių erdvėlaivius. Šis erdvėlaivis turės tris eismo juostas, kad būtų išvengta smūgio su ateiviais. Visada užsieniečiai gali užimti tik dvi trasas, o žaidėjas turėtų galėti važiuoti per laisvą trasą. Baigę šias idėjas galime tęsti aparatinę įrangą ir tada programuoti.
Grandinės schema:
Šio „ Arduino“ žaidimo schema yra labai paprasta; mes tiesiog turime susieti „Nokia 5110“ LCD modulį ir „Joystick“ su „Arduino“. Visa grandinės schema parodyta žemiau
„Nokia 5110“ skystųjų kristalų ekranas veikia su 3.3V ir „Joystick“ modulio darbiniu sūnumi 5V, todėl nepamirškite prijungti LCD tik su 3.3V, nes 5V gali jį visam laikui sugadinti. Skystųjų kristalų ekranas su „Arduino“ bendrauja per SPI protokolą, o vairasvirtė nuskaito tik ADC, kad nuskaitytų įtampos pokyčius. Ryšio nustatymas atrodys maždaug taip žemiau
Išankstinės sąlygos:
Prieš pasinerdami į programavimo dalį, svarbu, kad jums, žmonėms, būtų patogu naudotis „Display“ moduliu ir vairasvirte, todėl galite naudoti šias mokomąsias programas, kad sužinotumėte daugiau apie jas, tada grįžkite čia, kad įsitikintumėte, jog viskas veikia taip, kaip mes to reikia!
- „Nokia 5110“ LCD sąsaja su „Arduino“
- Vairasvirtės modulio sąsaja su „Arduino“
„Arduino“ programavimas kosmoso lenktynių žaidimui:
Visą žaidimo programą rasite šio puslapio pabaigoje; galite naudoti jį tiesiogiai savo „Arduino IDE“ ir įkelti į savo valdybą. Bet jei norite sužinoti, kas iš tikrųjų vyksta kodo viduje, skaitykite toliau.
Kaip visada, mes pradedame savo programą pridėdami bibliotekos antraštės failus, mums reikia trijų šio projekto bibliotekų, iš kurių pagal numatytuosius nustatymus SPI biblioteka pridedama prie jūsų IDE. Kitas dvi bibliotekas reikia atsisiųsti iš „Adafruit Github“ puslapio. Jei nesate tikri, kaip pridėti biblioteką, vadovaukitės skystųjų kristalų sąsajos pamoka, nurodyta išankstinių reikalavimų skyriuje.
# įtraukti
Jei laikėtės mokymo programos, turėtumėte žinoti, kad LCD ekrane galima rodyti taškų atvaizdus. Taigi mes turime konvertuoti reikiamą vaizdą į bitmap kodą naudodami programinę įrangą, paminėtą pamokoje, galite pasirinkti bet kurį vaizdą iš interneto ir naudoti jį konvertuodami į bitmap kodą. Įsitikinkite, kad vaizdas yra pakankamai paprastas, kad būtų rodomas mūsų skystųjų kristalų ekrane, prieš bandydami LCD ekraną, patikrinkite peržiūrą. Savo programoje mes naudojome du bitų žemėlapio simbolius, vienas yra kosminis laivas, o kitas - priešo laivas. Abiejų bitų žemėlapių kodas pridedamas prie mūsų kodo, kaip parodyta žemiau.
// rastras duomenys SpaceShip statinis const unsigned char PROGMEM laivo = { 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, }; // Bitumo žemėlapio duomenys priešiškumui statinis const nepasirašytas simbolis PROGMEM priešas = { 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, };
Turime nurodyti kaiščius, prie kurių prijungtas „ Nokia LCD 5110“ ekranas. Su ekranu pranešama naudojant SPI ryšį. Jei laikotės pirmiau pateiktos grandinės schemos, LCD inicializavimo kodas bus toks, kurio nereikia keisti.
„Adafruit_PCD8544 display“ = „Adafruit_PCD8544“ (7, 6, 5, 4, 3); // Nurodykite kaiščius, prie kurių prijungtas LCD ekranas
Viduje sąrankos funkcijai mes tiesiog pradėti Serijos monitorius 9600 sparta taip, kad mes galime derinti stuff ir tada inicijuoti LCD ekranas. Mes taip pat turime nustatyti LCD ekrano kontrastą, kiekvienas ekranas veiks geriausiai, esant skirtingam kontrasto lygiui, todėl žaiskite su verte, kad patikrintumėte, kas jums labiausiai tinka. Galiausiai taip pat išvalome ekrano ekraną, kad galėtumėte pradėti iš naujo.
negaliojanti sąranka () { Serial.begin (9600); // Serijinis monitorius derinimui display.begin (); // Pradėkite LCD ryšio ekraną.setContrast (30); // Nustatykite ekrano ekrano kontrastą.clearDisplay (); // išvalo ekraną ir pradeda naują }
Kai tik ekranas bus išvalytas, mes pereisime prie ciklo funkcijos ir ten parodysime žaidimo ekraną. Žaidimo ekranas yra ne kas kita, o tai, kas rodo pagrindinį žaidimo skeletą, kartu su rezultatu ir greičio lygiu. Linijos funkciją naudojome norėdami nubrėžti tris linijas kaip kraštus, o dešinėje rodome teksto balą ir greitį, kaip ir senus retro rankinius žaidimų įrenginius.
void gamescreen () { // Nubrėžkite ekrano ekrano kraštinę.drawLine (0, 0, 0, 47, JUODA); display.drawLine (50, 0, 50, 47, JUODA); display.drawLine (0, 47, 50, 47, JUODA); // Įveskite numatytuosius tekstus display.setTextSize (1); display.setTextColor (JUODA); display.setCursor (52,2); display.println („Greitis“); display.setCursor (54,12); display.println (žaidimo greitis); display.setCursor (52,25); display.println ("Rezultatas"); display.setCursor (54,35); display.println (rezultatas); }
Toliau turime gauti vartotojo informaciją, kad jis galėtų valdyti kosminį laivą. Įvestis bus gaunama iš vairasvirtės modulio, prijungto prie A1 kaiščio. Analoginė jutiklio vertė bus 512, jei ji nebus judinama, o didės ir mažės, kai juda išilgai X ašies. Mes naudojame šias reikšmes norėdami nustatyti, ar vartotojas nori pereiti į kairę ar į dešinę. Jei jums sunku suprasti toliau pateiktą programą, turėtumėte perskaityti išankstinėse sąlygose paminėtą „Joystick“ sąsają su „Arduino“ pamoka.
// Gauti vartotojo įvestį Joy_X = analogRead (A1); // Perskaitykite X vaue iš kreiptuko, jei (Džiaugsmas_X <312 && POS! = 1 && kontrolė == true) // Jei džiaugsmo lazda juda dešinėn {POS--; kontrolė = klaidinga;} // Mažinti erdvėlaivio padėtį, jei (Džiaugsmas_X> 712 && POS! = 3 && kontrolė == tiesa) // Jei džiaugsmo lazda juda dešinėn {POS ++; kontrolė = klaidinga;} // Kosminio laivo padėties padidinimas dar kitaip, jei (Joy_X> 502 && Joy_X <522) // Jei kreiptukas grįžta į pradinę padėties kontrolę = true; // Paruoškite jį kitam žingsniui // Gauta vartotojo įvestis
Iš naudotojo gavę kosminio laivo padėtį, turime pastatyti kosminį laivą būtent toje vietoje. Mes naudojame žemiau pateiktą funkciją ir perduodame pozicijos vertę kaip parametrą, tada, atsižvelgdami į padėtį, kosminis laivas dedamas į atitinkamą kelią.
void player_car (char pos) // Padėkite erdvėlaivį pagal vartotojo pasirinktą padėtį { 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); }
Dabar, kai mūsų erdvėlaivis yra ekrane ir yra paruoštas lenktynėms, turime pristatyti priešo laivus, kurie varžysis kartu su žaidėju. Kiekvieną kartą, kai priešo laivas peržengia ekraną, mes manome, kad jis miręs, o kai jis miręs, turime sukurti naują kosminį laivą. Žemiau pateikta funkcija atlieka tą patį. Tai sukuria naują vietą dviem priešo laivams ir padeda juos ekrano viršuje.
if (priešo numirėlis) // Priešo laivų patikrinimas negyvas {// Jei jie mirę priešas_0_pos = POS; // sukurti pirmąjį priešą virš kosminio laivo priešas_1_pos = atsitiktinis (0,4); // sukurti atsiskyrusį priešą kitoje atsitiktinėje vietoje priešo_fazė = 0; // Atneškite priešo formą iš viršutinio priešo_negyvas = netikras; // Priešas yra sukurtas, todėl jie nebėra mirę }
Pastatę priešo laivus ekrano viršuje, mes turime jį nuleisti, kad jis drebėtų taip, lyg mūsų žaidėjas lenktyniautų į viršų. Norėdami tai padaryti, mes tiesiog turime padidinti fazę (vietą, kurioje rodomas vaizdas), kad jis lėtai nusileidžia. Tas pats daroma abiem priešo laivams, kaip parodyta žemiau
priešo laivas (priešo_0_pozicija, priešo_fazė); priešo_fazė ++; // Įdėkite pirmąjį priešą į ekraną ir nuvarykite jį priešo laivą (priešo_1_pozicija, priešo_fazė); priešo_fazė ++; // Padėkite atsiskyrusį priešą ekrane ir nuvarykite jį žemyn
Funkcija „ priešo laivas “ parodyta žemiau, ji labai panaši į žaidėjo automobilio funkciją, tačiau čia mes turime du parametrus. Vienas skirtas priešui pastatyti ant kelio, o kitas - priešui judėti link dugno.
negaliojantis priešo laivas (int vieta, int fazė) // Įdėkite priešo laivą į naują vietą ir fazę { if (vieta == 1) display.drawBitmap (2, fazė, priešas, 15, 15, JUODA); if (vieta == 2) display.drawBitmap (18, fazė, priešas, 15, 15, JUODA); if (vieta == 3) display.drawBitmap (34, fazė, priešas, 15, 15, JUODA); }
Kitas kodas turėtų patikrinti, ar kosminis laivas išvengė priešo laivo. Norėdami tai patikrinti, turime žinoti priešo laivų padėtį ir žaidėjo kosminį laivą. Kadangi mes viską žinome, turime tik patikrinti, ar kosminio laivo padėtis yra tokia pati kaip priešo laivo. Tai tikriname tik tuo atveju, jei priešo laivas pasiekė netoli kosminio laivo. Jei žaidėjas neišvengė priešo, tai reiškia, kad žaidimas baigtas.
if (priešo_fazė> 22 && ((priešo_0_pozicija == POS) - (priešo_1_pozicija == POS)))) // Jei Erdvėlaivis paliečia kurį nors iš priešo žaidimų_ viršų (); // Rodyti žaidimą
Jei žaidėjas sėkmingai išvengė priešo, turėtume nužudyti priešą ir suteikti žaidėjui tašką. Norėdami tai padaryti, mes tiesiog patikriname, ar priešas pasiekė ekrano apačią ir ar mes jį nužudome naudodamiesi toliau pateiktu kodu
if (priešo_fazė> 40) // Jei erdvėlaivis pabėgs nuo priešų {priešo_mirtis = tiesa; rezultatas ++;} // Padidinkite rezultatą ir nužudykite priešus
Kaip būtų smagu, jei mes nepadidinsime žaidimo sunkumų, kai gausime aukštus balus. Taigi mes naudojame kitą funkciją, kuri stebi žaidėjo rezultatą ir, atsižvelgiant į rezultatą, padidins žaidimo greitį. Greitis iš tikrųjų valdomas naudojant uždelsimo funkciją, kuri valdys žaidimo atnaujinimo intervalą, todėl jis bus greitas arba lėtas.
void Level_Controller () // Padidinkite žaidimo greitį pagal rezultatą. { if (score> = 0 && score <= 10) // Jei rezultatas 0-10 { game_speed = 0; vėlavimas (80); // sulėtinti žaidimą 80ms } if (rezultatas> 10 && rezultatas <= 20) // Jei rezultatas 10-40 { game_speed = 1; vėlavimas (70); // sulėtinti žaidimą 70ms } if (rezultatas> 20 && rezultatas <= 30) // Jei rezultatas 20-40 { game_speed = 2; vėlavimas (60); // sulėtinkite žaidimą 60ms } if (rezultatas> 30 && rezultatas <= 40) // Jei rezultatas 30-40 { game_speed = 3; vėlavimas (50); // sulėtinkite žaidimą 50ms } }
„Arduino Space Racer“ žaidimas veikia:
Įsitikinę, kad aparatinė įranga ir programa suprantama, tiesiog sukurkite grandinę ir įkelkite kodą į „Arduino“ plokštę. Turėtumėte pastebėti, kaip žaidimas pradedamas, kaip parodyta žemiau
Naudokite vairasvirtę, kad pabėgtumėte iš priešo laivo judėdami kairėn arba dešinėn. Norėdami išvengti kiekvieno priešo, gausite savo balą vienu. Kai rezultatas bus aukštas, padidės ir žaidimo greitis, ty greitis padidės 10ms už kiekvieną surinktą 10 taškų. Galite tęsti šį žaidimą, kad pristatytumėte naujus lygius, arba kiekvienas atlikite tam tikrus aparatūros pakeitimus, kad valdytumėte jį judėdami naudodami akselerometrą. Kūryba yra vienintelė riba. Čia galite išmokti naudoti akselerometrą su „Arduino“.
Tikiuosi, kad supratote projektą ir patiko jį kurti. Jei susidūrėte su bet kokia problema, kaip tai padaryti, nedvejodami paskelbkite problemą žemiau esančiame komentarų skyriuje arba naudokite forumus techninei pagalbai. Laimingo žaidimo !!
Patikrinkite visą kodą ir toliau pateiktą demonstracinį vaizdo įrašą.