Inhaltsverzeichnis:

Space Invaders in Micropython auf Micro:bit - Gunook
Space Invaders in Micropython auf Micro:bit - Gunook

Video: Space Invaders in Micropython auf Micro:bit - Gunook

Video: Space Invaders in Micropython auf Micro:bit - Gunook
Video: Making a Space Invaders game on Microbit part 2 2024, Juli
Anonim
Image
Image

In unseren vorherigen Artikeln haben wir uns mit der Spieleentwicklung auf GameGo beschäftigt, einer tragbaren Retro-Spielekonsole, die von TinkerGen Education entwickelt wurde. Die Spiele, die wir gemacht haben, erinnerten an alte Nintendo-Spiele. Im heutigen Artikel machen wir einen Schritt zurück in das goldene Zeitalter der Arcade-Spiele. Wir werden das Space Invaders-Spiel in Micropython auf dem Micro:bit-Mikrocontroller neu erstellen – und als Wendung werden wir auch die BitPlayer Micro:bit-Erweiterung verwenden, die es uns ermöglicht, das Spiel bequemer zu spielen.

Da es in diesem Tutorial darum geht, das Spiel in Micropython zu codieren, werden wir anstelle der traditionellen Schritt-für-Schritt-Sequenz, die wir zuvor für die grafischen Programmier-Tutorials verwendet haben, den Code Block für Block durchgehen - wichtige Funktionen, Klassen und die wichtigsten Funktionen Schleife. Sie können den vollständigen Code im GitHub-Repository dieses Projekts herunterladen. Anschnallen und los geht's!

Lieferungen

TinkerGen BitPlayer

BBC Micro:bit

Schritt 1: Hauptschleife

Joystick
Joystick

In diesem Tutorial werde ich das Wort "Methode" ziemlich oft verwenden. Eine Methode in Python ähnelt einer Funktion, außer dass sie Objekten/Klassen zugeordnet ist. Zur Vereinfachung können Sie es also als "eine Funktion innerhalb der Klasse" lesen. Hier können Sie mehr über Methoden lesen.

Wir betreten die Hauptschleife mit

während nicht game_over:

Zustand. Im Inneren erhalten wir die Anzahl der Eindringlinge, die Wahrscheinlichkeit ihres Erscheinens und die Anzahl, die benötigt wird, um aus dem Level-Wörterbuch zum nächsten Level zu gelangen. Als nächstes prüfen wir mit Listen_Dir-Instanzmethoden der Klasseninstanz JoyStick auf Links-Rechts-Bewegung. Wenn eine der Bedingungen als wahr ausgewertet wird, erhöhen/verringern wir den x-Wert unseres spielbaren Charakters. Wir beschränken es auf [-2, 2] mit zwei if-Bedingungen. Dann initialisieren wir eine Instanz der DisplayBuffer-Klasse und prüfen, ob die Schaltfläche "Schild" oder "Kugel feuern" gedrückt wurde. Wir verwenden die Methode DisplayBuffer.set(), um Objekte für das spätere Rendern zu setzen. Zum Rendern des Schildes verwenden wir DisplayBuffer.set() direkt, aber für Aufzählungszeichen und Eindringlinge fügen wir sie ihrer jeweiligen Liste hinzu und setzen sie nacheinander in einer for-Schleife mit dem folgenden Code zum späteren Rendern mit DispBuffer.render():

für b in Kugeln: b.render(dispBuf) für v in vaders: v.render(dispBuf)

Alle Eindringlinge, Kugeln und Schilde werden bei jeder Iteration der Hauptschleife mit angezeigt

dispBuf.render()

Vor dem Ende der Hauptschleife überprüfen wir, ob eine der Kugeln von Eindringlingen das Ende des Bildschirms erreicht hat, und wenn ja, löschen wir sie aus ihren jeweiligen Listen.

Schritt 2: Joystick

Joystick
Joystick

BitPlayer ist einfach zu halten und zu verwenden, mit einem 2-Achsen-Joystick wie Gameboy- oder PSP-Controllern, und enthält weitere 6 programmierbare Tasten mit den Bezeichnungen L, R, A, B, C und D. Für ein immersives und interaktives Erlebnis bietet der BitPlayer selbst verfügt über einen Summer, einen Vibrationsmotor und einen Grove I2C-Port, um zusätzliche Peripherie wie ein OLED-Display anzuschließen.

Wir verwenden für dieses Spiel nur die Links-Rechts-Wippe des Joysticks, ein vollständiges Beispiel zur Verwendung aller BitPlayer-Schaltflächen können Sie unter joystick_example.py im GitHub-Repository dieses Projekts nachsehen. Beim Erstellen der Instanz der JoyStick-Klasse überprüfen wir den Standardwert der X-Achse und speichern diesen Wert in self. Read_X. Dann prüfen wir in der Funktion Listen_Dir, ob die Abweichung von diesem Standardwert höher ist als die Empfindlichkeitsvariable (versuchen Sie es selbst zu optimieren, wenn Sie der Meinung sind, dass JoyStick zu empfindlich ist) und geben entsprechend der erkannten Richtung True oder False zurück.

Schauen wir uns ein konkretes Beispiel an, wie das funktioniert:

Nehmen wir an, unser Standardwert für die X-Achse ist 0. Wenn wir dann den Joystick nach rechts bewegen:

New_X = JoyStick_X.read_analog() #New_X=200

Rechts = New_X - self. Read_X #Right = 200 Left = self. Read_X - New_X #Left = -200

Wenn wir dann nach der Richtung suchen:

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: True zurückgeben sonst: False zurückgeben

Schritt 3: Puffer anzeigen

Puffer anzeigen
Puffer anzeigen

Die DisplayBuf-Klasse ist für die Steuerung des LED-Bildschirms verantwortlich. Dies geschieht mit zwei Methoden, set() und render(). set()-Methode ändert die Werte, die den Pixeln des LED-Bildschirms entsprechen. Sie erinnern sich vielleicht, dass Pixel auf dem Micro:bit LED-Bildschirm als String oder als Liste ausgedrückt werden können - "00000:00000:00000:00000:00000" ist ein leerer Bildschirm. "00000:00000:00000:00000:00100" ist ein Bildschirm mit schwach beleuchteten Pixeln in der Mitte der unteren Reihe.

00000:

00000

:00000

:00000:

00100"

Diese Notation ist möglicherweise einfacher zu verarbeiten:)

Während der Hauptschleife rufen wir also die Methode set() von DisplayBuf auf, um alle unsere Objekte festzulegen, die auf dem Bildschirm angezeigt werden müssen. Dann verwenden wir die Methode render(), um sie alle gleichzeitig auf dem Bildschirm anzuzeigen.

Schritt 4: Eindringlinge, Kugeln und der Spieler

Eindringlinge, Kugeln und der Spieler
Eindringlinge, Kugeln und der Spieler

Kugeln und Eindringlinge gehören zur Mover-Klasse. Instanzen der Mover-Klasse haben ihre x-, y-Positionen und Geschwindigkeit sowie Helligkeit. Die Mover-Klasse hat zwei Instanzmethoden, set() und move(). Die set()-Methode ruft einfach die DisplayBuf-set()-Methode mit aktualisierten Koordinaten auf, um sie für das spätere Rendern auf der LED-Matrix zu speichern. Die Methode move() aktualisiert die Instanzkoordinaten entsprechend der Instanzgeschwindigkeit - das ist später nützlich, wenn wir die Geschwindigkeit von Eindringlingen mit fortschreitendem Level ändern müssen.

Class Bullet und Class Invader sind Unterklassen der Mover-Klasse. Hier verwenden wir etwas namens Vererbung. Die Funktionalität von super() ermöglicht es uns, Methoden der Oberklasse in der Unterklasse aufzurufen, ohne den Code wiederholen zu müssen.

Schritt 5: Machen Sie es sich zu eigen

Machen Sie es sich zu eigen
Machen Sie es sich zu eigen

Herzliche Glückwünsche! Sie haben gerade das klassische Space Invaders-Spiel auf Micro:bit mit cooler Gaming-Hardware neu erstellt. Natürlich können Sie den Spielcode von hier aus verbessern - zum Beispiel hat das Spiel derzeit nur ein Level - Sie können anspruchsvollere hinzufügen. Wie Sie sich vielleicht erinnern, hat das Originalspiel auch Steine, die vor dem Spieler schweben, die Sie ebenfalls hinzufügen können.

Wenn Sie eine verbesserte Version des Spiels erstellen, teilen Sie sie in den Kommentaren unten mit! Weitere Informationen zu BitPlayer und anderer Hardware für Hersteller und MINT-Lehrer finden Sie auf unserer Website https://tinkergen.com/ und abonnieren Sie unseren Newsletter.

TinkerGen hat kürzlich eine Kickstarter-Kampagne für MARK (Make A Robot Kit) erstellt, ein Roboter-Kit zum Unterrichten von Codierung, Robotik und KI!

Der ursprüngliche Micropython-Code von hexkcd/micro-vaders wurde geändert, um mit TinkerGen BitPlayer zu funktionieren.

Empfohlen: