Star Wars tema retro arkadspel (3 / 9 steg)
Steg 3: Spelmekanik
Detta spel skulle suga om du inte kunde interagera med den. Om du inte kunde dö, om det var för lätt eller om det var repetitiva skulle du tröttnar snabbt och dumpa det. Jag kommer att lista spel element i ordning jag genomfört dem.
Processuella nivå generation:
Spelet kommer att generera terrängen i farten. Eftersom detta är en stor del, förtjänar det eget steg.
Knappen
Upptäcka knapp klick är enkel. Vänta tills du trycker på knappen, vänta på knappen utgåvan, fortsätta med koden. Men vad händer om du vill animera saker medan du väntar på knappen utgåvan? Lite svårare men inte ett problem.
bool buttonReady = 1;
buttonif (buttonReady) {
om (! digitalRead(buttonPin)) {
y =! y;
buttonReady = 0;
lcd.setCursor(x,y);
LCD.write(ship);
lcd.setCursor(x,!y);
LCD.write(' ');
}
LCD.Clear();
}
annat {
om (digitalRead(buttonPin)) {
buttonReady = 1;
}
}
Som ni kan se i koden ovan, gjorde jag det genom att lägga till en buttonReady variabel. Namngivning kan inte vara bäst men funktionen förblir oförändrad. Medan buttonReady är 1 (sant), väntar programmet på att du trycker på knappen. När den upptäcker du trycker på knappen, buttonReady växlar mellan stat till 0 (falskt) och programmet startar väntar på knappen utgåvan. På knappen utgåvan rymdskepp flyttar och knappen klar sätts tillbaka till 1. Detta sätt spelet kan köra medan knappen trycks.
Kollision:
Om du vill kontrollera om du träffar något, måste du kontrollera om ett objekt är på samma plats som du är. Samma sak gäller för detta. Se kod nedan för att se hur detta fungerar.
kollision detectionif(y) {//bottom rowif ((b >> 15-x) %2) {
gå till bom;
}
}
annat {//top rowif ((en >> 15-x) %2) {
gå till bom;
}
}
Som du ser detta ske med hjälp av bitshift och modulooperatorn. Detta är en del av min "optimera koden" minigame jag spelade genom programmering det hela här. Vad bitshift gör är att det skiftar bitar av variabel lämnade eller precis vid viss. Detta gör det lätt att se om det finns en 1 på viss position eller inte. Efter bitshifting modulo (& 2) returnerar division resten och om som är lika med 1, det var en 1 i ange position annars var det 0.
Om du inte får bitshift operatör (oroa dig inte du ska få det någon dag), kan du använda matrisfunktioner istället (din data variabler måste vara matriser och du kommer att behöva göra en funktion för att flytta data).
Scoring
Spelet är inte ett spel om det inte visar du värdering du uppnått. Men hur man sådan poängrekord? Av mängden hinder dodged! Men betyder det att en pint bör läggas till varje gång du klickar på en knapp och inte dö? Som skulle underlätta nivåer med många hinder i skilda köer i tidiga spel orättvist och användaren kan fuska genom att klicka flera gånger när spelet startar och det finns inga hinder... Lägga till en punkt för varje block reste utan att träffa något är ett bättre sätt att få spelare. Jag kunde faktiskt namn den "tillryggalagd sträcka" men "poäng" låter bättre.
Eftersom rymdskepp börjar vid position 4 och terräng är alla tomma spelet startar, spelare startar med negativa 12 poäng. Detta sätt kommer han att ha 0 poäng om han träffar det första hindret.
Skalning svårigheter
Men även scoring hinner du sticka med spelet om det är alltför lätt. Du bli uttråkad och sluta spela den. Som standard skärm speluppdateringar var 0,7 sekunder (stepTime variabel). Det är bra att börja med men blir tråkigt ganska snart. Självklart måste det finnas vissa skalning svårigheter genomföras. Jag har beslutat att göra det genom att snabba upp spelet - genom att sänka variabeln stepTime. På varje steg minskas det med belopp som svårigheter. Jag hittade den svårigheten mellan 1 och 3 fungerar bäst. Om du sätta den högre, blir för hårt mycket snabbt. Om du vill större utmaning, rekommenderar jag att stepTime variabel lägre och lämnar svårigheten låg. Som får du roliga fartfyllda spelet.
Vi behöver inte bekymra dig om att begränsa stepTime för att alltid vara större än 0 som spelaren inte kan möjligen gå långt när han har att fatta beslut i tionde sekund som även knapptryckning tar längre tid.