Tabla de contenido:

Space Invaders en Micropython en Micro: bit: 5 pasos
Space Invaders en Micropython en Micro: bit: 5 pasos

Video: Space Invaders en Micropython en Micro: bit: 5 pasos

Video: Space Invaders en Micropython en Micro: bit: 5 pasos
Video: Making a Space Invaders game on Microbit part 3 2024, Mes de julio
Anonim
Image
Image

En nuestros artículos anteriores, hemos explorado la creación de juegos en GameGo, una consola de juegos retro portátil desarrollada por TinkerGen Education. Los juegos que creamos recordaban a los viejos juegos de Nintendo. En el artículo de hoy, vamos a dar un paso atrás, a la edad dorada de los juegos de arcade. Recrearemos el juego Space Invaders en Micropython en el microcontrolador Micro: bit, y como un giro, también usaremos BitPlayer Micro: la extensión bit, que nos permite jugar al juego de manera más conveniente.

Dado que este tutorial trata sobre la codificación del juego en Micropython, en lugar de la secuencia tradicional etapa por etapa que usamos antes para los tutoriales de programación gráfica, vamos a repasar el código bloque por bloque, repasando funciones importantes, clases y los principales círculo. Puede descargar el código completo en el repositorio de GitHub de este proyecto. ¡Abróchate el cinturón y comencemos!

Suministros

TinkerGen BitPlayer

BBC Micro: poco

Paso 1: bucle principal

Palanca de mando
Palanca de mando

En este tutorial usaré la palabra "método" con bastante frecuencia. Un método en Python es algo similar a una función, excepto que está asociado con objetos / clases. Entonces, para simplificar, puede leerlo como "una función dentro de la clase". Puede leer más sobre los métodos aquí.

Entramos en el bucle principal con

mientras no game_over:

condición. En el interior obtenemos el número de invasores, la posibilidad de que aparezcan y el número necesario para pasar al siguiente nivel del diccionario de niveles. A continuación, verificamos el movimiento de izquierda a derecha con los métodos de instancia Listen_Dir de la instancia de clase JoyStick. Si una de las condiciones se evalúa como Verdadera, incrementamos / disminuimos el valor x de nuestro personaje jugable. Lo restringimos a [-2, 2] con dos condiciones if. Luego, inicializamos una instancia de la clase DisplayBuffer y verificamos si se presiona el botón "escudo" o "bala de fuego". Usamos el método DisplayBuffer.set () para configurar objetos para su posterior renderizado. Para renderizar el escudo usamos DisplayBuffer.set () directamente, pero para balas e invasores los agregamos a su lista respectiva y los establecemos () uno por uno en el bucle for con el siguiente código para luego renderizar con DispBuffer.render ():

para b en viñetas: b.render (dispBuf) para v en vaders: v.render (dispBuf)

Todos los invasores, balas y escudos se muestran en pantalla una vez en cada iteración del bucle principal con

dispBuf.render ()

Antes del final del bucle principal comprobamos si alguna de las viñetas de invasores ha llegado al final de pantalla, y si es así, las borramos de sus respectivas listas.

Paso 2: Joystick

Palanca de mando
Palanca de mando

BitPlayer es fácil de sostener y usar, con un joystick de 2 ejes como los controladores Gameboy o PSP, también incluye otros 6 botones programables etiquetados como L, R, A, B, C y D. Para una experiencia inmersiva e interactiva, BitPlayer en sí cuenta con un timbre, un motor de vibración y un puerto Grove I2C para conectar periféricos adicionales como una pantalla OLED.

Solo usamos el botón de izquierda a derecha del joystick para este juego, para un ejemplo completo del uso de todos los botones de BitPlayer, puedes echar un vistazo a joystick_example.py en el repositorio de GitHub de este proyecto. Al crear la instancia de la clase JoyStick, verificamos la lectura predeterminada del eje X y almacenamos ese valor en self. Read_X. Luego, en la función Listen_Dir, verificamos si la desviación de ese valor predeterminado es mayor que la variable de sensibilidad (intente ajustarlo usted mismo, si cree que JoyStick es demasiado sensible) y devolvemos Verdadero o Falso según la dirección detectada.

Echemos un vistazo a un ejemplo concreto de cómo funciona esto:

Digamos que nuestra lectura predeterminada del eje X es 0. Entonces, si movemos el Joystick hacia la derecha:

New_X = JoyStick_X.read_analog () # New_X = 200

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

Luego, cuando comprobamos la dirección:

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 else: return False

Paso 3: búfer de visualización

Búfer de visualización
Búfer de visualización

La clase DisplayBuf se encarga de controlar la pantalla LED. Se hace usando dos métodos, set () y render (). El método set () cambia los valores correspondientes a los píxeles de la pantalla LED. Quizás recuerde que los píxeles en la pantalla LED de Micro: bit se pueden expresar como una cadena o una lista: "00000: 00000: 00000: 00000: 00000" es una pantalla vacía. "00000: 00000: 00000: 00000: 00100" es una pantalla con píxeles poco iluminados en el centro de la fila inferior.

00000:

00000

:00000

:00000:

00100"

Esta notación podría ser más fácil de procesar:)

Entonces, lo que hacemos durante el ciclo principal es llamar al método set () de DisplayBuf para configurar todos nuestros objetos que deben mostrarse en la pantalla. Luego usamos el método render () para mostrarlos todos en la pantalla simultáneamente.

Paso 4: invasores, balas y el jugador

Invasores, balas y el jugador
Invasores, balas y el jugador

Bullets e Invaders pertenecen a la clase Mover. Las instancias de la clase Mover tienen sus ubicaciones x, y y velocidad, así como también su brillo. La clase Mover tiene dos métodos de instancia, set () y move (). El método set () simplemente llama al método DisplayBuf set () con coordenadas actualizadas para guardar para su posterior renderizado en la matriz de LED. El método move () actualiza la coordenada de la instancia de acuerdo con la velocidad de la instancia, lo que resulta útil más adelante, cuando necesitamos cambiar la velocidad de los invasores a medida que avanzan los niveles.

Class Bullet y class Invader son subclases de la clase Mover. Aquí usamos algo llamado herencia. La funcionalidad de super () nos permite llamar a métodos de la superclase en subclase, sin necesidad de repetir el código.

Paso 5: Hágalo suyo

Hazlo tuyo
Hazlo tuyo

¡Felicidades! Acabas de volver a crear el clásico juego Space Invaders en Micro: bit con un hardware de juego genial. Por supuesto, puedes mejorar el código del juego desde aquí; por ejemplo, a partir de ahora, el juego solo tiene un nivel, puedes agregar más desafiantes. Además, como recordarás, el juego original tiene rocas flotando frente al jugador, que también puedes agregar.

Si creas una versión mejorada del juego, ¡compártela en los comentarios a continuación! Para obtener más información sobre BitPlayer y otro hardware para creadores y educadores STEM, visite nuestro sitio web, https://tinkergen.com/ y suscríbase a nuestro boletín.

TinkerGen ha creado recientemente una campaña de Kickstarter para MARK (Make A Robot Kit), un kit de robot para enseñar codificación, robótica, IA.

El código original de Micropython de hexkcd / micro-vaders se cambió para que funcione con TinkerGen BitPlayer.

Recomendado: