- Spill plan:
- Kretsdiagram:
- Forutsetninger:
- Programmering Arduino for Space Race Game:
- Arduino Space Racer Game fungerer:
Programmering har alltid vært morsomt, og det ble bare mye bedre med utviklingsplattformer som Arduino. Nesten hver programmerer her ute ville ha prøvd å utvikle et slags spill ved hjelp av språket de lærte / praktiserte. Dette hjelper dem med å stille programmeringsferdighetene sine på en morsom, men produktiv måte. Jeg har vært en stor fan av Arduino helt siden jeg ble introdusert for det og alltid ønsket å prøve noe kult med det, da jeg fant ut hvor kult det kan bli med en grafisk LCD som Nokia 5110 sammen med Arduino, ideen min om å utvikle et spill sparket inn. Det var en interessant måte å tilpasse noen programmeringsferdigheter og ha det gøy på samme tid, så selv om dere kanskje også er interessert i å utvikle spillet. Derfor vil vi i denne veiledningen lære hvordan vi kan lage anstendig spill ved hjelp av Arduino og grafiske LCD-skjermer.
Vi har allerede bygget det gammeldags Snake-spillet ved hjelp av Arduino, så denne gangen prøver vi noe nytt, og vi kalte dette spillet som Space Race Game der du trenger å holde skipet ditt trygt fra fiendens skip ved hjelp av styrespaken.
Spill plan:
Før vi starter, er det veldig viktig å planlegge hvordan spillet ditt faktisk vil fungere. Jeg fulgte med Nokia5110 grafisk LCD og joystick for maskinvarevalget mitt. Jeg antar i denne veiledningen at du også har valgt det samme. Siden Nokia 5110 ikke har mye plass, har vi planlagt hele spillet vårt i skjermens 84 * 48 piksler. Vi har allerede laget veiledninger om hvordan du kan grensesnitt Nokia 5110 LCD med Arduino og Joystick med Arduino.
Innenfor dette rommet må vi passe godt inn i spillområdet og poengsumområdet som viser ting som poengsum og sånt. Det er veldig viktig å vite pikselplasseringen der du plasserer ting for å holde oversikt over pikselstedene og oppdatere dem på skjermen.
Når spillskjermutseendet er bestemt, må vi bestemme tegnene i spillet vårt. For mitt spill har vi bare to, spillerkarakteren som er et romskip og en fiendtlig karakter som liksom skal se ut som et fremmed romskip. Nokia LCD kan vise bitmapbilder, så jeg bestemte meg for å bruke det alternativet til å vise romskipet mitt og fiendene.
Så vi vil ha et romskip som kjører gjennom romvesenets romskip, dette romskipet vil ha tre baner til endringer for å unngå et treff med romvesenene. Hele tiden kan romvesenene bare okkupere to spor, og spilleren skal kunne kjøre gjennom gratissporet. Når disse ideene er avsluttet, kan vi fortsette med maskinvaren og deretter programmeringen.
Kretsdiagram:
Kretsen for dette Arduino-spillet er veldig enkel; vi må bare grensesnitt Nokia 5110 LCD-modulen og styrespaken med Arduino. Hele kretsskjemaet er vist nedenfor
Nokia 5110 LCD fungerer med 3.3V og styrespakmodulen fungerer son 5V, så sørg for at du bare kobler LCD med 3.3V, fordi 5V kan skade den permanent. LCD-en kommuniserer med Arduino gjennom SPI-protokollen, og styrespaken leser bare ADC for å lese spenningsendringen. Tilkoblingsoppsettet vil se omtrent slik ut nedenfor
Forutsetninger:
Før vi dykker ned i programmeringsdelen er det viktig for deg å være praktisk med skjermmodulen og styrespaken, slik at du kan bruke følgende veiledninger for å vite mer om dem og deretter komme tilbake hit for å sikre at ting fungerer slik vi trenger det!
- Nokia 5110 LCD-grensesnitt med Arduino
- Joystick-modul som grensesnitt med Arduino
Programmering Arduino for Space Race Game:
Det komplette programmet for spillet finner du på slutten av denne siden; du kan bruke den direkte på din Arduino IDE og laste den opp til styret. Men hvis du vil vite hva som faktisk skjer inne i koden, så les videre.
Som alltid starter vi programmet med å legge til bibliotekets headerfiler, vi trenger tre biblioteker for dette prosjektet, hvorav SPI-biblioteket er lagt til IDE som standard. De to andre biblioteket må lastes ned fra Adafruit Github-siden. Følg LCD-grensesnittveiledningen som er nevnt i delen for forutsetninger hvis du ikke er sikker på hvordan du legger til biblioteket.
#inkludere
Hvis du har fulgt veiledningen, bør du vite at det er mulig å vise bitmapbildene i LCD-skjermen. Så vi må konvertere det nødvendige bildet til bitmapkode ved hjelp av programvaren som er nevnt i opplæringen, du kan velge hvilket som helst bilde fra internett og bruke det ved å konvertere dem til bitmapkode. Forsikre deg om at bildet er enkelt nok til å vises på LCD-skjermen, sjekk forhåndsvisningen før du faktisk prøver på LCD-skjermen. I vårt program har vi brukt to bitmap-tegn, det ene er romskipet og det andre er fiendeskipet, bitmap-koden for begge er lagt til i koden vår som vist nedenfor.
// bitmap Data for Spaceship statisk const unsigned char PROGMEM skip = { 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, }; // Bitmap Data for enemyship static const unsigned char PROGMEM fiende = { 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, };
Vi må spesifisere pinnene som Nokia LCD 5110-skjermen er koblet til. Skjermen kommuniseres med SPI-kommunikasjonen. Hvis du har fulgt kretsskjemaet ovenfor, vil koden for å initialisere LCD være som følger. Du trenger ikke å endre den.
Adafruit_PCD8544 display = Adafruit_PCD8544 (7, 6, 5, 4, 3); // Spesifiser pinnene som LCD-skjermen er koblet til
Inne i oppsettfunksjonen starter vi bare seriell skjerm med 9600 baudrate, slik at vi kan feilsøke ting og deretter initialisere LCD-skjermen. Vi må også stille inn kontrasten på LCD-skjermen, hver skjerm fungerer best i et annet kontrastnivå, så spill med verdien for å sjekke hvilken som passer best for deg. Til slutt tømmer vi også skjermen for å starte fersk.
ugyldig oppsett () { Serial.begin (9600); // Seriell skjerm for feilsøking display.begin (); // Begynn LCD-kommunikasjonsskjermen. SetContrast (30); // Still kontrasten til skjermen. ClearDisplay (); // tømmer skjermen og begynner nytt }
Så snart skjermen er ryddet hopper vi inn i loop- funksjonen og der viser vi spillskjermen. Spillskjermen er bare noe som viser et grunnleggende skjelett for spillet sammen med poengsummen og hastighetsnivået. Vi har brukt linjefunksjonen til å tegne tre linjer som grenser, og til høyre viser vi tekstpoeng og hastighet akkurat som de gamle retro-spillene.
void gamescreen () { // Draw the Border for Screen display.drawLine (0, 0, 0, 47, BLACK); display.drawLine (50, 0, 50, 47, SVART); display.drawLine (0, 47, 50, 47, SVART); // Skriv inn standardtekster display.setTextSize (1); display.setTextColor (SVART); display.setCursor (52,2); display.println ("Speed"); display.setCursor (54,12); display.println (game_speed); display.setCursor (52,25); display.println ("Score"); display.setCursor (54,35); display.println (score); }
Deretter må vi få innspill fra brukeren for å tillate ham / henne å kontrollere romskipet. Inngangen vil bli mottatt fra joystick-modulen som er koblet til pin A1. Den analoge verdien fra sensoren vil være 512 hvis den ikke beveges og vil øke og redusere når den beveges langs X-aksen. Vi bruker disse verdiene for å avgjøre om brukeren vil flytte til venstre eller til høyre. Du bør lese Joystick-grensesnittet med Arduino-opplæringen som er nevnt i forutsetningene, hvis du synes det er vanskelig å forstå programmet nedenfor.
// Få innspill fra bruker Joy_X = analogRead (A1); // Les X-vaue fra Joystick if (Joy_X <312 && POS! = 1 && control == true) // Hvis joystick beveger seg til høyre {POS--; control = false;} // Redusere plassering av romskip ellers hvis (Joy_X> 712 && POS! = 3 && control == true) // Hvis joystick beveger seg til høyre {POS ++; control = false;} // Øk posisjon av romskip ellers hvis (Joy_X> 502 && Joy_X <522) // Hvis joystick tilbake til startposisjonskontroll = true; // Forbered det for neste trekk // Inngang fra mottatt bruker
Etter å ha fått plass til romskipet fra brukeren, må vi plassere romskipet på det aktuelle stedet. Vi bruker funksjonen nedenfor og sender verdien til posisjonen som en parameter, og deretter basert på posisjonen romskipet er plassert i sitt respektive spor.
void player_car (char pos) // Plasser romskipet basert på den valgte brukerposisjonen { if (pos == 1) display.drawBitmap (2, 32, ship, 15, 15, BLACK); hvis (pos == 2) display.drawBitmap (18, 32, skip, 15, 15, SVART); hvis (pos == 3) display.drawBitmap (34, 32, skip, 15, 15, SVART); }
Nå som romskipet vårt er plassert på skjermen og er klart for racing, må vi introdusere fiendeskipene som skal konkurrere sammen med spilleren. Hver gang et fiendeskip har krysset skjermen antar vi at han er død, og når han er død, må vi lage et nytt romskip. Funksjonen nedenfor gjør akkurat det samme. Det skaper en ny posisjon for to fiendtlige skip og plasserer dem på toppen av skjermen.
hvis (fiende_død) // Kontroll av fiendens skip er døde {// Hvis de er døde fiende_0_pos = POS; // skape første fiende over romskipet enemy_1_pos = tilfeldig (0,4); // opprette sekundær fiende på et annet tilfeldig sted . // Ta med fienden fra den øverste fienden_døden = falsk; // Fienden er opprettet slik at de ikke er døde lenger }
Etter å ha plassert fiendeskipene på toppen av skjermen, må vi bringe den ned slik at den spydes som om spilleren vår løper oppover. For å gjøre det må vi bare øke fasen (stedet der bildet vises) slik at det kommer sakte ned. Det samme gjøres for begge fiendeskipene som vist nedenfor
fiende_skip (fiende_0_pos, fiende_fase); fiende_fase ++; // Plasser den første fienden på skjermen og kjør ham ned fiendeskip (fiend_1_pos, fiendefase); fiende_fase ++; // Plasser den hemmelige fienden på skjermen og kjør ham ned
Funksjonen fiendeskip er vist nedenfor, den ligner veldig på bilens funksjon, men her har vi to parametere. Den ene er for å plassere fienden på et spor og den andre for å flytte fienden mot bunnen.
ugyldig fiendeskip (int sted, int fase) // Plasser fiendeskipet på det nye stedet og fasen { if (sted == 1) display.drawBitmap (2, fase, fiende, 15, 15, SVART); hvis (sted == 2) display.drawBitmap (18, fase, fiende, 15, 15, SVART); hvis (sted == 3) display.drawBitmap (34, fase, fiende, 15, 15, SVART); }
Neste kode skal sjekke om romskipet har unngått fiendens skip. For å sjekke dette må vi vite posisjonen til fiendens skip og spillerens romskip. Siden vi vet alt om, må vi bare sjekke om romskipets posisjon er den samme som fiendens skip. Vi sjekker dette bare hvis fiendeskipet har nådd nær romskipet. Hvis spilleren ikke har unngått fienden, betyr det spillet over.
if (fiende_fase> 22 && ((fiende_0_pos == POS) - (fiende_1_pos == POS))) // Hvis romskipet berører en av fiendens game_over (); // Vis spillet over
Hvis spilleren har unngått fienden med hell, bør vi drepe fienden og gi spilleren et poeng. For å gjøre dette, sjekker vi bare om fienden har nådd til bunnen av skjermen, og hvis det gjør det, dreper vi det ved hjelp av koden nedenfor
hvis (fiendefase> 40) // Hvis romskipet unnslipper fiendene {fiend_død = sant; score ++;} // Øk poengsummen og drep fiendene
For morsomt det ville vært, hvis vi ikke øker vanskeligheten med spillet når vi får høye poengsummer. Så vi bruker en annen funksjon som deretter overvåker poengsummen til spilleren, og basert på poengsummen vil det øke hastigheten på spillet. Hastigheten styres faktisk ved å bruke forsinkelsesfunksjonen, dette vil kontrollere oppdateringsintervallet til spillet og dermed gjøre det raskt eller sakte.
ugyldig Level_Controller () // Øk hastigheten på spillet basert på poengsummen. { if (score> = 0 && score <= 10) // Hvis score 0-10 { game_speed = 0; forsinkelse (80); // senk spillet med 80ms } hvis (score> 10 && score <= 20) // Hvis score 10-40 { game_speed = 1; forsinkelse (70); // senk spillet med 70 ms } hvis (score> 20 && score <= 30) // Hvis score 20-40 { game_speed = 2; forsinkelse (60); // senk spillet med 60 ms } hvis (score> 30 && score <= 40) // Hvis score 30-40 { game_speed = 3; forsinkelse (50); // senk spillet med 50 ms } }
Arduino Space Racer Game fungerer:
Etter å ha forsikret deg om at maskinvaren og programmet er forstått, er det bare å bygge kretsen og laste opp koden til Arduino Board. Du bør legge merke til at spillet kommer i gang som vist nedenfor
Bruk styrespaken for å unnslippe fiendens skip ved å bevege deg til venstre eller høyre. For å unngå hver fiende vil du få poengsummen din økt med en. Når poengsummen blir høy, vil også hastigheten på spillet øke, det vil si hastighetsøkningen med 10 ms for hvert 10 poeng du scorer. Du kan fortsette og bygge videre på dette spillet for å introdusere nye nivåer eller gjøre noen maskinvareendringer for å kontrollere det gjennom bevegelse ved hjelp av et akselerometer. Kreativitet er den eneste grensen. For din referanse lærer du å bruke akselerometer med Arduino her.
Håper du forsto prosjektet og likte å bygge det. Hvis du har hatt problemer med å få dette til å fungere, kan du gjerne legge problemet ut i kommentarseksjonen nedenfor eller bruke forumene for teknisk hjelp. Godt spill !!
Sjekk den fullstendige koden og demonstrasjonsvideoen nedenfor.