Sommario:

Space Invaders in Micropython su Micro:bit: 5 passaggi
Space Invaders in Micropython su Micro:bit: 5 passaggi

Video: Space Invaders in Micropython su Micro:bit: 5 passaggi

Video: Space Invaders in Micropython su Micro:bit: 5 passaggi
Video: Tutorial 1 - microbit dice tutorial 2024, Luglio
Anonim
Image
Image

Nei nostri articoli precedenti abbiamo esplorato la creazione di giochi su GameGo, una console di gioco retrò portatile sviluppata da TinkerGen education. I giochi che abbiamo realizzato ricordano i vecchi giochi Nintendo. Nell'articolo di oggi, faremo un passo indietro, all'età d'oro dei giochi arcade. Ricreeremo il gioco Space Invaders in Micropython su un microcontrollore Micro:bit e, come variante, utilizzeremo anche l'estensione BitPlayer Micro:bit, che ci consente di giocare in modo più conveniente.

Poiché questo tutorial riguarda la codifica del gioco in Micropython, invece della tradizionale sequenza passo-passo che abbiamo usato prima per i tutorial di programmazione grafica, esamineremo il codice blocco per blocco, esaminando importanti funzioni, classi e le principali ciclo continuo. Puoi scaricare il codice completo nel repository GitHub di questo progetto. Allacciate le cinture e cominciamo!

Forniture

TinkerGen BitPlayer

BBC Micro: bit

Passaggio 1: ciclo principale

Telecomando da gioco
Telecomando da gioco

In questo tutorial userò la parola "metodo" abbastanza spesso. Un metodo in Python è in qualche modo simile a una funzione, tranne per il fatto che è associato a oggetti/classi. Quindi, per semplificazione, puoi leggerlo come "una funzione all'interno della classe". Puoi leggere di più sui metodi qui.

Entriamo nel ciclo principale con

mentre non è game_over:

condizione. All'interno otteniamo il numero di invasori, la possibilità della loro comparsa e il numero necessario per passare al livello successivo dal dizionario dei livelli. Successivamente controlliamo il movimento sinistra-destra con i metodi di istanza Listen_Dir dell'istanza di classe JoyStick. Se una delle condizioni viene valutata come True, incrementiamo/decrementiamo il valore x del nostro personaggio giocabile. Lo limitiamo a [-2, 2] con due condizioni if. Quindi inizializziamo un'istanza della classe DisplayBuffer e controlliamo la presenza di pulsanti "scudo" o "proiettile di fuoco". Usiamo il metodo DisplayBuffer.set() per impostare gli oggetti per il rendering successivo. Per il rendering dello scudo usiamo direttamente DisplayBuffer.set(), ma per i proiettili e gli invasori li aggiungiamo al rispettivo elenco e li impostiamo uno ad uno nel ciclo for con il seguente codice per il rendering successivo con DispBuffer.render():

per b in punti elenco: b.render(dispBuf) per v in vaders: v.render(dispBuf)

Tutti gli invasori, i proiettili e gli scudi vengono visualizzati una volta che ogni iterazione del ciclo principale con

dispBuf.render()

Prima della fine del ciclo principale controlliamo se qualcuno dei proiettili degli invasori ha raggiunto la fine dello schermo e, in caso affermativo, li eliminiamo dai rispettivi elenchi.

Passaggio 2: joystick

Telecomando da gioco
Telecomando da gioco

BitPlayer è facile da impugnare e utilizzare, con un joystick a 2 assi come i controller Gameboy o PSP, include anche altri 6 pulsanti programmabili etichettati come L, R, A, B, C e D. Per un'esperienza coinvolgente e interattiva, BitPlayer è dotato di un cicalino, un motore di vibrazione e una porta Grove I2C per collegare periferiche aggiuntive come un display OLED.

Usiamo solo il bilanciere sinistro-destro del joystick per questo gioco, per un esempio completo sull'uso di tutti i pulsanti BitPlayer puoi dare un'occhiata a joystick_example.py nel repository GitHub di questo progetto. Durante la creazione dell'istanza della classe JoyStick controlliamo la lettura predefinita dell'asse X e memorizziamo quel valore in self. Read_X. Quindi nella funzione Listen_Dir, controlliamo se la deviazione da quel valore predefinito è maggiore della variabile di sensibilità (prova a modificarla da solo, se ritieni che JoyStick sia troppo sensibile) e restituiamo True of False in base alla direzione rilevata.

Diamo un'occhiata a un esempio concreto di come funziona:

Diciamo che la nostra lettura predefinita dell'asse X è 0. Quindi, se spostiamo il Joystick a destra:

New_X = JoyStick_X.read_analog() #New_X=200

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

Quindi, quando controlliamo la direzione:

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: restituisce Vero altrimenti: restituisce Falso

Passaggio 3: buffer di visualizzazione

Buffer di visualizzazione
Buffer di visualizzazione

La classe DisplayBuf è responsabile del controllo dello schermo LED. Viene eseguito utilizzando due metodi, set() e render(). Il metodo set() modifica i valori corrispondenti ai pixel dello schermo LED. Potresti ricordare che i pixel sullo schermo LED Micro:bit possono essere espressi come stringa o elenco: "00000:00000:00000:00000:00000" è uno schermo vuoto. "00000:00000:00000:00000:00100" è uno schermo con pixel poco illuminati al centro della riga inferiore.

00000:

00000

:00000

:00000:

00100"

Questa notazione potrebbe essere più facile da elaborare:)

Quindi, ciò che facciamo durante il ciclo principale è chiamare il metodo set() di DisplayBuf per impostare tutti i nostri oggetti che devono essere visualizzati sullo schermo. Quindi usiamo il metodo render() per mostrarli tutti sullo schermo contemporaneamente.

Passaggio 4: invasori, proiettili e il giocatore

Invasori, proiettili e il giocatore
Invasori, proiettili e il giocatore

I proiettili e gli invasori appartengono alla classe dei Mover. Le istanze della classe Mover hanno le loro posizioni x, y e velocità, oltre alla luminosità. La classe Mover ha due metodi di istanza, set() e move(). Il metodo set() chiama semplicemente il metodo DisplayBuf set() con le coordinate aggiornate da salvare per il rendering successivo sulla matrice LED. Il metodo move() aggiorna le coordinate dell'istanza in base alla velocità dell'istanza - che torna utile in seguito, quando è necessario modificare la velocità degli invasori man mano che i livelli avanzano.

La classe Bullet e la classe Invader sono sottoclassi della classe Mover. Qui usiamo qualcosa chiamato ereditarietà. La funzionalità di super() ci permette di chiamare i metodi della superclasse in sottoclasse, senza bisogno di ripetere il codice.

Passaggio 5: crealo da solo

Rendilo tuo
Rendilo tuo

Congratulazioni! Hai appena ricreato il classico gioco Space Invaders su Micro:bit con un fantastico hardware di gioco. Ovviamente, puoi migliorare il codice di gioco da qui - ad esempio, a partire da ora, il gioco ha solo un livello - puoi aggiungerne di più impegnativi. Inoltre, come ricorderete, il gioco originale ha rocce che galleggiano davanti al giocatore, che puoi anche aggiungere.

Se realizzi una versione migliorata del gioco, condividila nei commenti qui sotto! Per ulteriori informazioni su BitPlayer e altro hardware per produttori ed educatori STEM, visita il nostro sito Web, https://tinkergen.com/ e iscriviti alla nostra newsletter.

TinkerGen ha recentemente creato una campagna Kickstarter per MARK (Make A Robot Kit), un kit robot per insegnare programmazione, robotica, AI!

Il codice Micropython originale di hexkcd/micro-vaders è stato modificato per funzionare con TinkerGen BitPlayer.

Consigliato: