Codifique su propio estilo Zelda de arriba hacia abajo | Estructura alámbrica #61

Haz tu propio tributo a la tierra de Hyrule en Python y Pygame Zero. Mark Vanstone tiene el código en la última revista Wireframe, disponible ahora.

Con The Legend of Zelda de 1986, Nintendo creó una aventura con un nivel de libertad que no se veía en sus juegos anteriores. Como el valiente héroe Link, los jugadores podían dirigirse en cualquier dirección que eligieran, cortando a los enemigos con su espada y descubriendo secretos repartidos por el fantástico mundo de Hyrule. El éxito del juego original habla por sí mismo, con una serie constante de secuelas y derivados muy queridos, mientras que la serie, en su conjunto, ha dejado un impacto duradero en el diseño del juego.

Link lucha contra una variedad de monstruos en su búsqueda para encontrar a la princesa Zelda.

Para nuestra nueva versión de Pygame Zero, nos centraremos en la jugabilidad de arriba hacia abajo de la versión original de NES. Crearemos un mapa hecho de bloques que se desplazarán mientras Link explora, y también agregaremos algunos enemigos para que los elimine con su espada de confianza.

Primero, generemos un mapa estilo Zelda. Los elementos de la pantalla están formados por bloques cuadrados dispuestos en una cuadrícula. Hay cuadrados para árboles, rocas y otros tipos de terreno, incluido el agua. Para este ejemplo, nos ceñiremos a una pequeña selección de tipos de bloques, pero usted mismo puede agregar más. Si necesita encontrar gráficos para este tipo de proyectos retro, vale la pena visitar spriters-resource.com: los sprites utilizados en nuestro proyecto fueron creados por MisterMike. Al diseñar un sistema de mapas para representar un área mucho más grande que la pantalla, debemos almacenarlo de una manera que no sea solo una imagen enorme, por lo que lo dividimos en bloques. En este caso, usaremos bloques de 50 píxeles cuadrados y nuestro área de mapa visible comprenderá 16 bloques de ancho y 10 bloques de alto.

Podríamos contener todos nuestros datos de mapas en una gran lista bidimensional con cada bloque representado por un número, pero eso significaría que incluso para un mapa bastante pequeño terminaríamos con líneas y líneas de datos de mapas que serían aburridos. para escribir. Una forma más inteligente de almacenar estos datos es representar el mapa completo en una imagen 50 veces más pequeña que el mapa real, donde cada píxel representa un bloque. Nuestro suelo está representado por píxeles negros, nuestros árboles por píxeles verdes, mientras que las rocas son amarillas y los cantos rodados son rojos. Luego, podemos leer el área de la imagen del minimapa que se muestra actualmente en la pantalla y traducirla a nuestros bloques de mapa.

Nuestro homenaje de Python y Pygame Zero a The Legend of Zelda.

Cuando mostramos nuestros bloques de mapa, comenzaremos a dibujar desde 100 píxeles hacia abajo de la pantalla para dejar espacio para un minimapa en la parte superior. Así que todo lo que tenemos que hacer por nuestro drawMap() La función se ejecuta a través de un bucle incrustado de valores x e y para traducir los colores de los píxeles (que leemos usando el image.get_at() función del módulo Pygame) en nuestros bloques de mapa más grandes y mostrarlos en la pantalla en las posiciones correctas.
La parte del mapa que estamos mostrando está controlada por las variables mapx y mapy. Si queremos ver una parte diferente del mapa, solo tenemos que cambiar esos valores y esa área se mostrará en el próximo ciclo de dibujo. Para hacer que el mapa se desplace en lugar de simplemente cambiar, tenemos las variables mapScrollx y mapScrolly. Si configuramos el mapScrollx a 16, podemos contar con esa variable cada ciclo de actualización y aumentar la mapx valor por uno cada vez. Esto significa que en 16 ciclos, el área de visualización del mapa se habrá movido 16 bloques a la derecha. Podemos usar el mismo proceso para valores de desplazamiento negativos y para el eje y, pero en ese caso, solo desplazando 10 bloques a la vez.

tiempo de héroe

Ahora estamos listos para agregar a nuestro héroe. Link estará representado por un objeto Actor con el que comenzamos en el primer cuadro de animación y lo colocamos en algún lugar en el medio del área de juego. Dibujamos Vincular cada cuadro en el draw() función, pero querremos agregar un código adicional en una función llamada drawChars(). Para que Link se mueva por el mapa, definiremos algunas teclas para moverse en cuatro direcciones. Podríamos limitar a Link para que solo pueda moverse de un bloque al siguiente, pero esto puede hacer que el movimiento se vea bastante brusco, por lo que permitiremos que Link se mueva un par de píxeles cada vez que detectemos que se mantiene presionada una tecla. . Esto significa que tenemos que averiguar hacia qué bloque se está moviendo, y si no es un bloque de tierra (representado en nuestro minimapa por píxeles negros), cancelamos el movimiento. Si Link se mueve, necesitamos alternar sus fotogramas de animación usando un contador de fotogramas y luego asignar una imagen basada en ese contador de fotogramas y la dirección en la que está mirando.

Aquí está el código de Mark para un Zelda de arriba hacia abajo. Para que funcione en su sistema, primero deberá instalar Pygame Zero; las instrucciones completas se pueden encontrar en wfmag.cc/pgzero. Para obtener el código completo, diríjase a nuestro Github.

Ahora que tenemos a Link moviéndose por la pantalla, debemos activar la función de desplazamiento de pantalla cuando llegue al borde. Hacemos esto detectando cuándo llega a x<0 o x>800 o y>600 o y<100. A continuación, podemos configurar nuestro mapScrollx o mapScrolly variables; esto activará el mecanismo de desplazamiento que nos llevará a la siguiente sección del mapa. Sin embargo, mientras nos desplazamos, debemos asegurarnos de que otros objetos en el mapa también se desplacen para que permanezcan en la posición correcta en relación con el mapa.

Una vez que tengamos a Link moviéndose de una pantalla a otra, querremos algunos enemigos para que luche. Haremos algunos monstruos como Actores y los colocaremos alrededor del mapa. Queremos que se muevan un poco, por lo que podemos agregar algo de lógica en el ciclo de actualización para moverlos hacia Link si están en la pantalla al mismo tiempo. Podemos probar la colisión de bloques de la misma manera que lo hacemos con Link.

A continuación, necesitaremos agregar la habilidad de lucha con espadas de Link. Haremos que aparezca la espada cuando se presione la barra espaciadora haciendo que la espada sea un actor independiente. Hay cuatro imágenes diferentes para las cuatro direcciones, aunque se podría lograr el mismo efecto cambiando el ángulo de la espada Actor. Cuando se ejecuta esta animación, podemos probar para ver si hay una colisión con alguno de los monstruos y, de ser así, activar un cambio de estado para que se despachen. Cambiamos el estado del monstruo de 10 a 9, que luego usamos para contar hacia atrás durante la actualización mientras giramos al Actor, y cuando ese estado llega a cero, el enemigo ya no se muestra.

La última parte que cubriremos es el minimapa en la parte superior izquierda de la pantalla. Este es un indicador de dónde está Link en el mapa más grande, por lo que todo lo que tenemos que hacer es traducir sus coordenadas en el mapa grande al tamaño del minimapa y trazar un cuadrado.

Y eso es todo: ¡tenemos los conceptos básicos de un Zelda de arriba hacia abajo! Hay todo tipo de elementos que podrías agregar: pociones y otros elementos útiles, más enemigos, caminos secretos, etc., pero como siempre, dejaremos esos para que los imagines.

Obtenga su copia de Wireframe #61

Puede leer más funciones como esta en el número 61 de Wireframe, disponible directamente en Raspberry Pi Press, que entregamos en todo el mundo.

¡Tenemos una nueva oferta de subs! Suscríbete a Wireframe por un año y obtén un GRATIS 8BitDo Controlador Bluetooth Pro 2 por valor de £ 39.

Y si prefieres tus revistas en formato digital, ¡también puedes descargar el número 61 de Wireframe en PDF gratis!