Leren code schrijven kan een lange reis zijn. Je moet niet alleen bronnen vinden om je te helpen leren, maar je moet ook spannende projectideeën vinden die je opleiding op het goede spoor houden.
Videogames bieden een geweldige kans om iets te programmeren waarvan u kunt genieten. En ze kunnen je ook de basis leren die je nodig hebt om een goede programmeur te zijn. Dit artikel onderzoekt een DIY handheld Arduino-videogameproject om u op weg te helpen.
Wat maken we en waarom?
Voordat we in het gidsgedeelte van dit artikel duiken, is het logisch om te onderzoeken wat we maken en waarom we het voor dit project hebben gekozen. Verschillende uitdagingen komen met het maken van games voor apparaten zoals Arduinos.
- Opslagruimte: de meeste Arduino-borden worden geleverd met zeer weinig RAM- of flashgeheugen. Dit legt niet alleen een limiet op de hoeveelheid code die ze kunnen uitvoeren, maar het biedt ook uitdagingen als het gaat om het werken met variabelen.
- Verwerkingskracht: de Arduino die we gebruikten heeft een energiezuinige CPU, dus het is onmogelijk om er applicaties voor te maken die veel resources nodig hebben.
- Beperkte componenten: Arduino's hebben veel pinnen beschikbaar, maar veel componenten hebben er meer dan één nodig. Dit beperkt ons als het gaat om bedieningselementen en weergave-uitgangen.
Met deze uitdagingen in het achterhoofd hebben we besloten om een handheld-apparaat te maken waarop een heel eenvoudig, op reacties gebaseerd spel kan worden uitgevoerd. Je zou gemakkelijk andere spellen kunnen maken voor de hardware waarmee we werken, en we moedigen je aan om creatief te zijn.
Het spel zelf is heel eenvoudig. Er verschijnen drie blokken op het scherm, twee omlijnd en één gevuld, elk met een bijbehorende fysieke knop eronder. De speler moet elke ronde op de juiste knop drukken om verder te spelen, en als hij of zij op de verkeerde knop drukt of de tijd op is, is het spel afgelopen. Elke succesvolle druk op de knop levert punten op. Het spel verhoogt langzaam zijn moeilijkheidsgraad door de beschikbare reactietijd te verminderen.
Bedrading van het OLED-scherm, Arduino en knoppen
Het aansluiten van je handheld-game is de eerste stap in dit proces. Zoals je in het bovenstaande schakelschema kunt zien, hoef je niet veel verbindingen te maken om te beginnen, en je kunt zelfs een breadboard gebruiken voor dit project.
We hebben al een gids gepubliceerd om u te helpen om bedraad drukknoppen op een Arduino. Ons Arduino Aquarium Monitor-project laat zien hoe je een OLED-scherm gebruikt met een microcontroller als deze. Daarom zullen we ons in de rest van dit artikel concentreren op de code voor dit project.
Arduino Handheld-spelcode
Een goede opmaak en opgeruimde bestandsstructuren zijn erg belangrijk voor zowel beginnende als ervaren programmeurs. Je zult jezelf dankbaar zijn dat je de tijd hebt genomen om je code netjes te ordenen als je er ooit nog eens doorheen moet.
De code gebruikt een INO-hoofdbestand om de basis van ons project te vormen. Er is ook een C++-bestand om ons scherm te besturen, een C++-bestand om de hoofdspelcode uit te voeren en een Arduino-bibliotheekbestand om alles met elkaar te verbinden.
We zullen hieronder dieper op deze code ingaan, maar we raden u aan om de becommentarieerde code in onze. te bekijken Arduino Handheld Game-project op GitHub. Het zal u helpen om ernaar te verwijzen naast dit artikel.
Het bibliotheekbestand (library.h)
Ons bibliotheekbestand speelt een cruciale rol en verbindt onze andere projectbestanden met elkaar zodat ze als één applicatie kunnen werken. Dit bestand bevat verklaringen om de Arduino.h-bibliotheek en alle functies in onze spelcode op te nemen die tussen onze bestanden moeten werken. Zonder dit zou onze code gewoon niet werken.
Het hoofd INO-bestand (main.ino)
Zoals veel Arduino-projecten, begon deze met de standaardsjabloon van de Arduino IDE. Dat sjabloon geeft het opstelling en lus functies die we gebruiken om functies in onze andere bestanden aan te roepen. Dit bestand heeft ook een verklaring om het bestand library.h op te nemen.
De setup-functie is ideaal voor het initialiseren van onze display en knoppen, omdat deze maar één keer wordt uitgevoerd wanneer de Arduino wordt gereset of ingeschakeld. Hiervoor noemen we de functie disSetup() in ons weergavebestand en de functie butSetup() in ons spelbestand.
Onze loop()-functie is zelfs eenvoudiger dan de setup()-functie, met slechts een enkele aanroep van de gameState()-functie in ons spelbestand. We zullen dit later in het artikel in meer detail onderzoeken.
Het weergavecodebestand (display.cpp)
We gebruiken een SSD1306 OLED-display voor dit project, hoewel u een ander type display kunt gebruiken als u de code dienovereenkomstig bewerkt. Dit bestand begint met het opnemen van het bibliotheekbestand, bibliotheek.h. Het bevat vervolgens declaraties voor de bibliotheken SPI, Wire, Adafruit_GX en Adafruit_SSD1306. Daarna definieert het enkele constanten om instellingen voor de weergave te bieden.
De eerste functie, disSetup, initialiseert het scherm en toont een welkomstscherm met logo. Vervolgens wordt het display gewist na ongeveer 2 seconden te hebben gewacht. Ons hoofdbestand, main.ino, roept disSetup aan in zijn opstelling functie.
De rest van de functies in dit bestand, met uitzondering van timerBar(), vormen de verschillende schermen die in het spel te zien zijn. Het spelbestand, game.cpp, roept elk van deze functies aan.
- startGame(): Deze functie bestuurt het eerste scherm dat de speler ziet. Het vraagt gewoon of ze klaar zijn tijdens het bellen naar de switchInstance functie gevonden in het spelbestand.
- startsGame(): Zodra de speler het spel start, toont dit scherm een korte aftelling. Vervolgens wordt de status van het spel aangepast.
- inGame(): Dit is de meest complexe van onze weergavefuncties, waarbij drie variabelen worden gebruikt om elke spelronde te laden. Het begint met een if-statement dat bepaalt welke van de drie tegels moet worden gevuld, gevolgd door het weergeven van de tegels en het niveau en de score van de speler.
- timerBar(): Deze functie gebruikt een variabele om een timerbalk onder aan het scherm weer te geven. Het laat de speler zien hoeveel tijd hij heeft voor elke ronde.
- successScreen(): Dit is een eenvoudige functie die elke keer dat de speler een ronde met succes voltooit een bericht weergeeft.
- endGame(): Deze laatste functie geeft een game-over-scherm weer met de score van de speler en de optie om het spel opnieuw te starten.
Het spelcodebestand (game.cpp)
Eindelijk, als het laatste bestand om te verkennen, is het tijd om naar de spelcode te kijken. Dit bestand begint, net als de andere, met het opnemen van het bestand library.h. Het bevat ook een lange lijst met verschillende integervariabelen die we tijdens het spel gebruiken.
U zult de functie butSetup() voor alles vinden. De functie setup() in ons hoofdbestand roept butSetup aan. Deze functie gebruikt variabelen om onze knoppen in te stellen als invoer die we later kunnen lezen.
- switchInstance(): Deze functie schakelt tussen instanties van het spel, van het startscherm naar het spel en game over-schermen. Het ontvangt een variabele om te vertellen naar welke spelstatus het moet overschakelen. Een if-statement wacht op een druk op de knop om het spel te starten vanuit de startGame()-status. Een ander if-statement start het spel opnieuw vanuit de endGame()-status.
- gameState(): Deze functie stelt de moeilijkheidsgraad van het spel in op basis van de score van de speler en roept de juiste functie aan, afhankelijk van de staat van het spel. Het begint met een reeks if-statements die variabelen instellen op basis van de score van de speler, gevolgd door meer if-statements om de huidige instantie te controleren.
- tileSelector(): Deze functie genereert een willekeurig getal tussen 0 en 2 dat het spel vertelt welke van de drie tegels op een bepaald moment moet worden gevuld.
- theGame(): Deze functie is misschien wel de belangrijkste van allemaal. Het noemt de tegelkiezer en in het spel functies, een nieuwe tegel kiezen en deze op het scherm weergeven. Hierna vindt u een for-lus die fungeert als een timer voor elke ronde. Het bevat een reeks if-statements die het indrukken van knoppen oppikken en bepalen of ze correct zijn.
Je eigen handheld Arduino-spel bouwen
Dit artikel is een aanvulling op de projectcode op GitHub. U kunt meer informatie vinden over de specifieke coderegels die we hebben gebruikt in de opmerkingen in die bestanden. Maar je bent ook welkom om het gewoon op je Arduino te laden en te genieten van het plezier.
Creativiteit is de sleutel in de wereld van game-ontwikkeling, en we moedigen je aan om naast deze ook aan je eigen game-ideeën te werken.
De 10 beste Arduino-radioprojecten
Lees volgende
Gerelateerde onderwerpen
- Programmeren
- doe-het-zelf
- Ideeën voor doe-het-zelfprojecten
- Zelfstudies voor doe-het-zelfprojecten
- Arduino
- Programmeren
Over de auteur
Samuel is een in het Verenigd Koninkrijk gevestigde technologieschrijver met een passie voor alles wat met doe-het-zelf te maken heeft. Met het starten van bedrijven op het gebied van webontwikkeling en 3D-printen, en vele jaren als schrijver werken, biedt Samuel een uniek inzicht in de wereld van technologie. Hij richt zich voornamelijk op doe-het-zelf technische projecten en doet niets liever dan leuke en opwindende ideeën delen die je thuis kunt uitproberen. Buiten het werk is Samuel meestal te vinden op fietsen, pc-videogames spelen of wanhopig proberen te communiceren met zijn krab.
Abonneer op onze nieuwsbrief
Word lid van onze nieuwsbrief voor technische tips, recensies, gratis e-boeken en exclusieve deals!
Klik hier om je te abonneren