- Spelplan:
- Kretsschema:
- Förutsättningar:
- Programmering av Arduino för rymdloppsspel:
- Arduino Space Racer Game fungerar:
Programmering har alltid varit kul och det blev bara mycket bättre med utvecklingsplattformar som Arduino. Nästan varje programmerare här ute skulle ha försökt att utveckla något slags spel med det språk de lär sig / övar. Detta hjälper dem att ställa in sina programmeringsfärdigheter på ett roligt men ändå produktivt sätt. Jag har varit ett stort fan av Arduino ända sedan jag blev presenterad för det och ville alltid prova något coolt med det, när jag fick reda på hur cool det kan bli med en grafisk LCD som Nokia 5110 tillsammans med Arduino min idé att utveckla ett spel sparkade in. Det var ett intressant sätt att anpassa några programmeringsfärdigheter och ha kul samtidigt, även om ni kanske också är intresserade av att utveckla ditt spel. Därför kommer vi att lära oss hur vi kan skapa anständigt spel med Arduino och grafiska LCD-skärmar.
Vi har redan byggt det gammaldags ormspelet med Arduino, så den här gången försöker vi något nytt och vi heter det här spelet som Space Race Game där du behöver skydda ditt skepp från fiendens fartyg med hjälp av joystick.
Spelplan:
Innan vi startar är det mycket viktigt att planera hur ditt spel faktiskt skulle fungera. Jag följde med Nokia5110 grafisk LCD och joystick för mitt hårdvaruval. Jag antar i denna handledning att du också har valt samma. Eftersom Nokia 5110 inte har mycket utrymme har vi planerat hela vårt spel i 84 * 48 pixelupplösningen på vår skärm. Vi har redan gjort handledning om hur man gränssnitt Nokia 5110 LCD med Arduino och Joystick med Arduino.
Inom detta utrymme måste vi passa tätt in i spelområdet och poängbrädområdet som visar saker som poäng och så. Det är mycket viktigt att känna till pixelplatsen där du placerar saker för att hålla reda på pixelplatserna och uppdatera dem på skärmen.
När spelskärmens utseende har bestämts måste vi bestämma karaktärerna i vårt spel. För mitt spel har vi bara två, spelarkaraktären som är ett rymdskepp och en fiendekaraktär som borde se ut som ett främmande rymdskepp. Nokia LCD kan visa bitmappsbilder, så jag bestämde mig för att använda det alternativet för att visa mitt rymdskepp och fienderna.
Så vi kommer att ha ett rymdskepp som tävlar genom utomjordingarna rymdskepp, detta rymdskepp kommer att ha tre banor för att förändras för att undvika en träff med utomjordingarna. Utlänningarna kan alltid ockupera två spår och spelaren ska kunna köra genom det fria spåret. När dessa idéer är klara kan vi fortsätta med hårdvaran och sedan programmeringen.
Kretsschema:
Kretsen för detta Arduino-spel är väldigt enkel; vi måste bara ansluta Nokia 5110 LCD-modulen och joysticken med Arduino. Det fullständiga kretsschemat visas nedan
Nokia 5110 LCD fungerar med 3.3V och joystickmodulen fungerar son 5V, så se till att du bara ansluter LCD med 3.3V, eftersom 5V kan skada den permanent. LCD: n kommunicerar med Arduino via SPI-protokollet och joysticken läser bara ADC för att läsa spänningsförändringen. Anslutningsuppsättningen ser ungefär så här ut nedan
Förutsättningar:
Innan vi dyker in i programmeringsdelen är det viktigt för dig att vara bekväm med Display-modulen och joysticken, så att du kan använda följande handledning för att få veta mer om dem och sedan komma tillbaka hit för att se till att saker fungerar som vi behöver det!
- Nokia 5110 LCD-gränssnitt med Arduino
- Joystick-modul som gränssnitt med Arduino
Programmering av Arduino för rymdloppsspel:
Det kompletta programmet för spelet hittar du i slutet av denna sida; du kan använda den direkt på din Arduino IDE och ladda upp den till din styrelse. Men om du vill veta vad som faktiskt händer i koden, läs vidare.
Som alltid startar vi vårt program med att lägga till våra biblioteksrubrikfiler, vi behöver tre bibliotek för detta projekt, varav SPI-biblioteket läggs till i din IDE som standard. De andra två biblioteket måste laddas ner från Adafruit Github-sidan. Följ LCD-gränssnittshandledningen som nämns i avsnittet förutsättningar om du inte är säker på hur du lägger till biblioteket.
#omfatta
Om du har följt handledningen bör du veta att det är möjligt att visa bitmappsbilder på LCD-skärmen. Så vi måste konvertera den bild som krävs till bitmappskod med hjälp av programvaran som nämns i handledningen, du kan välja vilken bild som helst från internet och använda den genom att konvertera dem till bitmappskod. Se till att bilden är tillräckligt enkel för att visas på vår LCD-skärm, kontrollera förhandsgranskningen innan du faktiskt försöker på LCD-skärmen. I vårt program har vi använt två bitmappstecken, det ena är rymdskeppet och det andra är fiendens fartyg, bitmappskoden för båda läggs till i vår kod som visas nedan.
// Bitmapdata för SpaceShip statisk const osignerad char PROGMEM ship = { B00000000, B00000000, B00000001, B00000000, B00000011, B10000000, B00000010, B10000000, B00000010, B11000000, B00000111, B11000000, B00001101, B11100000, B11111111, B1111111, B01111111, B11111100, B01111111, B11111100, B01111111, B11111100, B00011111, B11110000, B00000111, B11100000, B00000000, B00000000, }; // Bitmapdata för fiendskap statisk const osignerad 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åste ange stiften som Nokia LCD 5110-skärmen är ansluten till. Displayen kommuniceras med hjälp av SPI-kommunikationen. Om du har följt kretsschemat ovan kommer koden för att initialisera LCD-skärmen vara följande, du behöver inte ändra den.
Adafruit_PCD8544 display = Adafruit_PCD8544 (7, 6, 5, 4, 3); // Ange stiften som LCD-skärmen är ansluten till
Inuti installationsfunktionen startar vi bara seriell bildskärm med 9600 baudhastighet så att vi kan felsöka saker och sedan initiera LCD-skärmen. Vi måste också ställa in LCD-skärmens kontrast, varje skärm fungerar bäst i en annan kontrastnivå, så spela med värdet för att kontrollera vilka som passar bäst för dig. Slutligen rensar vi också skärmen för att börja färskt.
ogiltig installation () { Serial.begin (9600); // Seriell bildskärm för felsökning display.begin (); // Börja LCD-kommunikationsdisplayen. SetContrast (30); // Ställ in kontrasten på displayen. ClearDisplay (); // rensar skärmen och startar nytt }
Så snart skärmen är rensad hoppar vi in i loopfunktionen och där visar vi spelskärmen. Spelskärmen är inget annat än som visar ett grundläggande skelett för spelet tillsammans med poäng och hastighetsnivå. Vi har använt linjefunktionen för att rita tre linjer som gränser och till höger visar vi textpoäng och hastighet precis som de gamla retrohandhållna spelenheterna.
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); // Ange standardtexter display.setTextSize (1); display.setTextColor (SVART); display.setCursor (52,2); display.println ("Hastighet"); display.setCursor (54,12); display.println (spelhastighet); display.setCursor (52,25); display.println ("Poäng"); display.setCursor (54,35); display.println (poäng); }
Därefter måste vi få inmatningen från användaren så att han / hon kan styra rymdskeppet. Ingången kommer att tas emot från joystickmodulen som är ansluten till stift A1. Det analoga värdet från sensorn blir 512 om den inte flyttas och kommer att öka och minska när den flyttas längs X-axeln. Vi använder dessa värden för att avgöra om användaren vill flytta till vänster eller till höger. Du bör läsa Joystick-gränssnittet med Arduino-handledning som nämns i förutsättningarna om du har svårt att förstå nedanstående program.
// Få inmatning från användaren Joy_X = analogRead (A1); // Läs X-vaue från Joystick if (Joy_X <312 && POS! = 1 && control == true) // Om joystick rör sig åt höger {POS--; control = false;} // Minska positionen för rymdskepp annars om (Joy_X> 712 && POS! = 3 && control == true) // Om joystick rör sig åt höger {POS ++; control = false;} // Öka positionen för rymdskeppet annat om (Joy_X> 502 && Joy_X <522) // Om joysticken tillbaka till initial positionskontroll = true; // Förbered det för nästa drag // Ingång från mottagen användare
Efter att ha fått rymdskeppets position från användaren måste vi placera rymdskeppet på just den platsen. Vi använder nedanstående funktion och skickar positionens värde som en parameter, sedan baserat på positionen som rymdskeppet placeras i respektive spår.
void player_car (char pos) // Placera rymdskeppet baserat på användarens valda position { 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); }
Nu när vårt rymdskepp placeras på skärmen och är klart för racing måste vi presentera fiendens fartyg som kommer att tävla tillsammans med spelaren. Varje gång ett fiendefartyg har passerat skärmen antar vi att han är död och när han är död måste vi skapa ett nytt rymdskepp. Funktionen nedan gör precis samma sak. Det skapar en ny position för två fiendefartyg och placerar dem högst upp på skärmen.
if (fiendens_död) // Kontroll av fiendens fartyg är döda {// Om de är döda fienden_0_pos = POS; // skapa första fiende ovanför rymdskeppet enemy_1_pos = slumpmässig (0,4); // skapa en avskild fiende på någon annan slumpmässig plats . // Ta med fienden från topp fienden_död = falsk; // Fiende skapas så att de inte är döda längre }
Efter att ha placerat fiendens fartyg på toppen av skärmen måste vi ta ner det så att det spjutar som om vår spelare tävlar uppåt, för att göra det måste vi bara öka fasen (platsen där bilden visas) så att det kommer långsamt ner. Samma sak görs för båda fiendens fartyg som visas nedan
fiendeskip (fiend_0_pos, fiendefas); fiendefas ++; // Placera den första fienden på skärmen och köra honom ner fiendens fartyg (fiende_1_pos, fiendefas); fiendefas ++; // Placera den andra fienden på skärmen och kör ner honom
Funktionen fiende_ship visas nedan, den liknar spelarens bilfunktion men här har vi två parametrar. Den ena är för att placera fienden på ett spår och den andra är för att flytta fienden mot botten.
ogiltig fiendeskip (int plats, int fas) // Placera fiendens skepp på den nya platsen och fas { if (plats == 1) display.drawBitmap (2, fas, fiende, 15, 15, SVART); om (plats == 2) display.drawBitmap (18, fas, fiende, 15, 15, SVART); om (plats == 3) display.drawBitmap (34, fas, fiende, 15, 15, SVART); }
Nästa kod ska kontrollera om rymdskeppet har undvikit fiendens fartyg. För att kontrollera detta måste vi veta positionen för fiendens fartyg och spelarens rymdskepp. Eftersom vi vet allt måste vi bara kontrollera om rymdskeppspositionen är samma som fiendens fartyg. Vi kontrollerar detta endast om fiendens fartyg har nått nära rymdskeppet. Om spelaren inte har undvikit fienden betyder det att spelet är slut.
if (fiende_fas> 22 && ((fiende_0_pos == POS) - (fiende_1_pos == POS)) // Om rymdskeppet berör någon av fiendens game_over (); // Visa spelet över
Om spelaren har undvikit fienden framgångsrikt bör vi döda fienden och ge spelaren en poäng. För att göra detta kontrollerar vi bara om fienden har nått botten på skärmen och om det gör det dödar vi det med koden nedan
om (fiendefas> 40) // Om rymdskeppet flyr fienderna {fiend_död = sant; poäng ++;} // Öka poängen och döda fienderna
Vilket roligt det skulle vara om vi inte ökar spelets svårighet när vi får höga poäng. Så vi använder en annan funktion som sedan övervakar spelarens poäng och baserat på poängen kommer det att öka spelets hastighet. Hastigheten styrs faktiskt genom att använda fördröjningsfunktionen, detta kommer att styra uppdateringsintervallet för spelet, vilket gör det snabbt eller långsamt.
ogiltigt Level_Controller () // Öka spelets hastighet baserat på poängen. { if (poäng> = 0 && poäng <= 10) // Om poäng 0-10 { game_speed = 0; fördröjning (80); // sakta spelet med 80 ms } om (poäng> 10 && poäng <= 20) // Om poäng 10-40 { game_speed = 1; fördröjning (70); // sakta spelet med 70 ms } om (poäng> 20 && poäng <= 30) // Om poäng 20-40 { game_speed = 2; fördröjning (60); // sakta spelet med 60 ms } om (poäng> 30 && poäng <= 40) // Om poäng 30-40 { game_speed = 3; fördröjning (50); // sakta spelet med 50 ms } }
Arduino Space Racer Game fungerar:
Efter att ha sett till att hårdvaran och programmet är förstått, bygg bara kretsen och ladda upp koden till Arduino Board. Du bör märka att spelet kommer igång enligt nedan
Använd joysticken för att fly fiendens fartyg genom att flytta åt vänster eller höger. För att undvika varje fiende får du din poäng ökad med en. När poängen blir hög ökar spelets hastighet, det vill säga hastighetsökningen med 10 ms för varje 10 poäng du får. Du kan gå vidare och bygga vidare på det här spelet för att introducera nya nivåer eller göra några hårdvaruändringar för att kontrollera det genom rörelse med hjälp av en accelerometer. Kreativitet är den enda gränsen. För din referens lär du dig att använda Accelerometer med Arduino här.
Hoppas att du förstod projektet och gillade att bygga det. Om du har haft problem med att få detta att fungera är du välkommen att lägga upp problemet i kommentarsektionen nedan eller använda forumen för teknisk hjälp. Lyckligt spel !!
Kontrollera hela koden och demonstrationsvideon nedan.