Excitebike är ett side-scroller-spel där du navigerar en motorcykel över hopp, manövrerar runt hinder och rusar mot mållinjen.
Nintendo lanserade först detta BMX-racingspel för NES. Därifrån moderniserade företaget Excitebike och släppte den på N64 och så småningom Wii.
Det finns inte många NES-konsoler längre, vilket gör det svårt att få tag på Excitebike igen. Tack vare några retrofans på Wireframe Magazine kan ett stycke Python-kod återskapa denna NES-klassiker för timmar av nöje på din Raspberry Pi eller hemdator.
Skaffa koden och ställa in
Även om du kan använda nano eller vim för att redigera din python-kod, vill du dra nytta av en fullfjädrad textredigerare eller IDE.
Du måste installera Pygame Zero för att stödja funktionerna i denna hyllning till Excitebike. Pygame Zero innehåller Python-moduler för spelskapare att fokusera utan att behöva upprepa enkla grunder.
Om du inte har python3 installerat på din dator kan du ladda ner den senaste versionen från Python direkt. Det vill du också se till att du har PIP installerat för.
Med den senaste versionen av Python och PIP installerad, öppna din PowerShell- eller Linux-terminal och skriv:
pip3 Installera pgnoll
Slutligen måste du hämta en kopia av Python-koden från Wireframe magazines GitHub-förråd. Skriv följande kommando i en terminal:
git klona https://github.com/Wireframe-Magazine/Wireframe-66.git
Alternativt kan du ladda ner postnumret direkt från Wireframe GitHub-sidan.
Att bryta ner koden
För att förstå vad koden gör, kör först Excitebike-spelet. Gör det genom att navigera till källkoden och sedan köra den med Pygame Zero:
CD Wireframe-66/källa-kod-excitebike/
pgzrunexitebike.py
Du kan sedan öppna filen exitebike.py med en textredigerare för att se koden.
De dra funktionen ritar bakgrunden när cykelbilden rör sig. en "blit" hänvisar till ett block som ritas på skärmen. Ordet, "bakgrund," hänvisar till bakgrundsbilden (att länka bilderna till bakgrundsblocket är tack vare de importerade Pygame Zero-modulerna).
defdra():
screen.blit("bakgrund", (0, 0))
drawTrack()
cykel.dra()
screen.draw.text("VARVTID: "+str (int (time.time() - startTime)), (20, 555),color=(255,255,255), fontsize=50)
screen.draw.text("SISTA VARVET: "+str (sista varvet), upptill höger = (780, 555), färg=(255,255,255), fontsize=50)
Du kommer också att märka beräkningar för varvtid och sista varvet (detta representeras av tidsräknaren längst ner på skärmen). Varvtiden beräknar ständigt skillnaden mellan den första tryckningen på högerpilen (starttid) och den aktuella tiden.
Sista varvet är en liknande beräkning. Istället för starttiden beräknas tiden från när motorcykeln passerar en fördefinierad spårposition (nämns som trackPos < -4800 i koden). Objekten nedan inom citattecken representerar en bild.
Denna kod ritar bildblock på skärmen med vissa intervall och speciella positioner på skärmen. Den medföljande publikbilden är bara 100px bred. Ändå, koden nedan talar om för datorn när bilden ska ritas så att det ser ut som om det finns en simulerad folkmassa bakom motorcykeln när den rör sig.
Stenbilderna visas på skärmen i två delar. Den andra och tredje raden med kod nedan arbetar tillsammans för att simulera landskapet på ett snyggt sätt.
När du har skapat en säkerhetskopia av pythonkoden, försök att ändra siffrorna nedan för att se vad som händer med stenarna på skärmen!
screen.blit("publik1", ((t*100)+trackOffset-100, 0))
screen.blit("sten1", ((t*100)+trackOffset-100, 270))
screen.blit("sten1", ((t*100)+trackOffset-50, 270))
Vill du byta ut din motorcykel mot en Monstertruck, fyrhjuling eller annat fordon? Kanske vill du tävla med en enhörning till mållinjen?
Allt du behöver göra är att rita en 50x50px bild (med en transparent bakgrund). Placera sedan den här filen (picture.png) ibilder'-mappen (inom källkod-excitebike mapp). Du kommer att vilja skapa två bilder (en med en något ökad höjd) för att lägga till lite realism. Allt du behöver göra är att ändra referensen till 'cykel 0' här:
cykel = Skådespelare('cykel 0', center=(150, 350), ankare=('Centrum', 'botten'))
Se också till att utföra en sök- och ersätt-åtgärd med namnet på bilden (utan bildtillägget).
checkBikeRamp() är funktionen som gör jobbet för att beräkna Y-axeln så att din motorcykel (eller lastbil) åker uppför rampen (och får lite seriös luft om du har tur). De tangentbord.höger och tangentbord.vänster parametrar definieras i uppdatering() fungera.
Dessa kodbitar talar om för datorn att sakta ner motorcykeln eller snabba upp (beroende på vilken tangent användaren trycker på tangentbordet). Översättning: Ju snabbare din motorcykel rör sig, desto högre är numret på Y-axeln (eller mycket stora hopp).
På tvären, den on_key_down (nyckel) funktionen kommer att skicka din motorcykel till ett dyk.
om nyckel.namn == "NER":
cykel.riktning = 1
bike.laneY = begränsa(bike.laneY + 50, 375, 525)
bike.y += bike.direction
De muckLane parametern kommer att sakta ner din motorcykel med följande beräkning:
muckLane = int((bike.laneY-375)/50)+1
Rad 66 i koden bestämmer när "muck"-bilden ska visas på skärmen. Nu när datorn vet när din motorcykel kommer att passera över mucken, kommer den att sakta ner din motorcykelhastighet till hälften när du rör dig över mucken på banan. Ändra muckLane-värdet från /50 till /25 eller /75 för att se vad som händer härnäst.
Racers (ahem, Python-programmerare)! Starta dina motorer!
Även om du inte är bekväm med att programmera denna hyllning till Excitebike från början, är den här koden fortfarande en fantastisk primer. Genom att justera det och inse den visuella effekten av ändringarna kan du lära dig mycket. Kommer du att försöka lägga till fler funktioner eller AI-racers i ditt spel? Ge järnet!
Med lite Python-träning under bältet, är en annan idé att prova att lägga till olika nivåer när du passerar mållinjen efter 4 eller 5 gånger. Du kanske också vill lägga till belöningar för första, andra och tredje plats. Om du är på första plats, lägg till en publik-hejande ljudfil också! Det finns så många möjligheter.
När du är nöjd med dina Excitebike-förbättringar, varför inte ta itu med att skapa ett textäventyrsspel? Det finns många olika delar som säkerställer att du lär dig något spännande i timmar, dagar eller till och med veckor!