Innehållsförteckning:

Space Invaders i Micropython på Micro: bit: 5 steg
Space Invaders i Micropython på Micro: bit: 5 steg

Video: Space Invaders i Micropython på Micro: bit: 5 steg

Video: Space Invaders i Micropython på Micro: bit: 5 steg
Video: Space Invaders in Micropython on Micro:bit 2024, Juli
Anonim
Image
Image

I våra tidigare artiklar har vi undersökt speltillverkning på GameGo, en bärbar retro spelkonsol utvecklad av TinkerGen education. Spelen som vi gjorde påminde om gamla Nintendo -spel. I dagens artikel kommer vi att ta ett steg tillbaka, till arkadspelens guldålder. Vi kommer att återskapa Space Invaders -spelet i Micropython på Micro: bit -mikrokontroller - och som en twist kommer vi också att använda BitPlayer Micro: bit -förlängning, vilket gör att vi kan spela mer bekvämt.

Eftersom denna handledning handlar om kodning av spelet i Micropython, i stället för traditionell steg-för-steg-sekvens som vi använde tidigare för grafiska programmeringsstudier, kommer vi att gå över koden block för block-gå igenom viktiga funktioner, klasser och huvudsakliga slinga. Du kan ladda ner hela koden i detta projekts GitHub -arkiv. Spänn ihop och låt oss börja!

Tillbehör

TinkerGen BitPlayer

BBC Micro: bit

Steg 1: Huvudslinga

Joystick
Joystick

I denna handledning kommer jag att använda ordet "metod" ganska ofta. En metod i python liknar en funktion, förutom att den är associerad med objekt/klasser. Så, för att förenkla, kan du läsa det som "en funktion inom klassen". Du kan läsa mer om metoder här.

Vi går in i huvudslingan med

medan inte game_over:

skick. Inuti får vi antalet inkräktare, chans att de dyker upp och antalet som behövs för att komma till nästa nivå från nivåer ordlista. Därefter söker vi efter vänster-högerrörelse med Listen_Dir-instansmetoder för klassinstans JoyStick. Om ett av villkoren utvärderas som sant, ökar/minskar vi x-värdet för vår spelbara karaktär. Vi begränsar det till [-2, 2] med två if-förhållanden. Sedan initierar vi en instans av DisplayBuffer -klassen och kontrollerar om knapparna trycks in "sköld" eller "eldkula". Vi använder metod DisplayBuffer.set () för att ställa in objekt för senare rendering. För att återge skölden använder vi DisplayBuffer.set () direkt, men för kulor och inkräktare lägger vi till dem i deras respektive lista och sätter () dem en efter en för loop med följande kod för senare rendering med DispBuffer.render ():

för b i kulor: b.render (dispBuf) för v in vaders: v.render (dispBuf)

Alla inkräktare, kulor och sköld återges på skärmen en gång varje huvudslinga iteration med

dispBuf.render ()

Före slutet av huvudslingan kontrollerar vi om någon av inkräktarnas kulor har nått slutet av skärmen, och om de är det tar vi bort dem från deras respektive listor.

Steg 2: Joystick

Joystick
Joystick

BitPlayer är lätt att hålla och använda, med en 2-axlig joystick som Gameboy eller PSP-styrenheter innehåller den också ytterligare 6 programmerbara knappar märkta som L, R, A, B, C och D. För en uppslukande och interaktiv upplevelse har BitPlayer själv har en summer, en vibrationsmotor och en Grove I2C -port för att ansluta ytterligare kringutrustning som en OLED -skärm.

Vi använder bara joystickens vänster-höger-vippare för det här spelet, för ett fullständigt exempel på användning av alla BitPlayer-knappar kan du titta på joystick_example.py i detta projekts GitHub-arkiv. När vi skapar instansen av JoyStick-klassen söker vi efter X-axelns standardavläsning och lagrar det värdet i self. Read_X. Sedan i funktionen Listen_Dir, kontrollerar vi om avvikelsen från det standardvärdet är högre än känslighetsvariabeln (försök att justera det själv, om du känner att JoyStick är för känslig) och returnerar True of False enligt detekterad riktning.

Låt oss titta på ett konkret exempel på hur detta fungerar:

Låt oss säga att vår standard X-axelavläsning är 0. Om vi sedan flyttar joysticken åt höger:

New_X = JoyStick_X.read_analog () #New_X = 200

Höger = New_X - self. Read_X #Right = 200 Vänster = self. Read_X - New_X #Left = -200

När vi sedan söker efter riktning:

Precision = 150if Right> Precision: #200> 150 True Get_Rocker = DIR ['R'] elif Left> Precision: #-200> 150 False Get_Rocker = DIR ['L'] else: Get_Rocker = DIR ['NONE'] if Dir == Get_Rocker: return True true: return False

Steg 3: Displaybuffert

Displaybuffert
Displaybuffert

DisplayBuf -klassen ansvarar för att styra LED -skärmen. Det görs med två metoder, set () och render (). set () -metoden ändrar värdena som motsvarar LED -skärmens pixlar. Du kanske kommer ihåg att pixlar på Micro: bit LED -skärm kan uttryckas som sträng eller en lista - "00000: 00000: 00000: 00000: 00000" är en tom skärm. "00000: 00000: 00000: 00000: 00100" är en skärm med svagt upplyst pixel i mitten av den nedre raden.

00000:

00000

:00000

:00000:

00100"

Denna notation kan vara lättare att bearbeta:)

Så det vi gör under huvudslingan är call set () -metoden för DisplayBuf för att ställa in alla våra objekt som måste visas på skärmen. Sedan använder vi render () -metoden för att faktiskt visa dem alla på skärmen samtidigt.

Steg 4: Invaders, Bullets och spelaren

Invaders, Bullets och spelaren
Invaders, Bullets och spelaren

Bullets och Invaders tillhör Mover -klassen. Flyttklassinstanser har sina x, y -platser och hastighet, samt ljusstyrka. Mover -klassen har två instansmetoder, set () och move (). set () -metoden kallar helt enkelt DisplayBuf set () -metoden med uppdaterade koordinater för att spara för senare återgivning på LED -matris. move () metoduppdateringar instanskoordinat enligt instanshastighet - det är användbart senare när vi behöver ändra inkräktarnas hastighet när nivåerna fortskrider.

Class Bullet och class Invader är underklasser av Mover -klassen. Här använder vi något som kallas arv. Funktionen för super () gör att vi kan anropa superklassens metoder i underklassen, utan att behöva upprepa koden.

Steg 5: Gör det till ditt eget

Gör det till ditt eget
Gör det till ditt eget

Grattis! Du har just återskapat det klassiska Space Invaders-spelet på Micro: bit med lite häftig spelhårdvara. Naturligtvis kan du förbättra spelkoden härifrån - till exempel, från och med nu har spelet bara en nivå - du kan lägga till mer utmanande. Som du kanske minns har det ursprungliga spelet stenar som flyter framför spelaren, vilket du också kan lägga till.

Om du gör en förbättrad version av spelet, dela det i kommentarerna nedan! För mer information om BitPlayer och annan hårdvara för tillverkare och STEM -lärare, besök vår webbplats, https://tinkergen.com/ och prenumerera på vårt nyhetsbrev.

TinkerGen har nyligen skapat en Kickstarter -kampanj för MARK (Make A Robot Kit), en robotkit för att lära ut kodning, robotik, AI!

Den ursprungliga Micropython-koden från hexkcd/micro-vaders, ändrades till att fungera med TinkerGen BitPlayer.

Rekommenderad: