Kabosu - Creando cosas
Publicado: 2024-08-31 (actualizado 2024-10-06)
Etiquetas: Godot, Inkscape, Juegos, Pixel Art, Proyectos, Reto de la Paella
Actualizado el 2024-10-06 para corregir algunos errores.
En este artículo voy a comentar un pequeño proyecto-broma que he realizado durante el último mes. Solo he invertido unas pocas horas en total pero entre una cosas y otras se ha alargado en el tiempo. Aquí va un nuevo reto de la paella.
No recuerdo porqué y no he conseguido encontrar el mensaje original pero hace unas semanas Chichazor me sugirió en Mastodon modificar el Donkey Kong para que en vez de Mario fuera un chorizo y el objetivo fuera llegar arriba para meterse en una paella. Ese intercambio de mensajes dio inicio a un nuevo reto de la paella.
Estuve un rato buscando algún clon libre del Donkey Kong original pero no encontré nada. Descubrí la web Open Source Game Clones que creo que voy a usar bastante a partir de ahora para este tipo de retos. Allí tampoco había nada sobre Donkey Kong pero sí que había un listado de clones de Super Mario. De la lista conocía el Super Tux que probé un poco durante mis primeros pasos en Linux pero me llamó la atención Super Tux Classic. Según la descripción es una reimplementación de Super Tux en GDScript para Godot. Como ya estuve tocando SDL2 con Noiz2sa el mes pasado, del que tengo un reto de la paella pendiente, decidí usar la versión de Godot en vez del Super Tux original.
El Super Tux Classic está implementado con Godot 3.5.2 según su documentación. Yo tenía instalada 4.2 así que, sin pensar mucho, abrí el proyecto con mi versión. La migración automática de proyectos nunca me había dado ningún problema en Godot pero la verdad es que nunca había probado a hacerla con un proyecto tan grande. En este caso adaptó lo que pudo pero me dejó un montón de trozos de código inválidos que fallaban al compilar: clases que habían sido renombradas en Godot 4, funciones que ya no existían, etc. Estuve una hora o así aprendiendo cuáles eran las diferencias entre las versiones 3 y 4 e intentando migrar el proyecto a mano. Al final me rendí: el juego tiene más de 200 escenas y 120 ficheros de código. Migrar todo y asegurarme que funcionase iba a costar mucho tiempo. Aprender más sobre Godot 3 no es algo que quiera hacer a estas alturas así que decidí bajarme la última versión disponible de Godot 3 (la 3.5.3) y usar eso.
Con la versión correcta de Godot, compilar y ejecutar el juego fue un paseo. Nada que ver con retos anteriores dónde estuve horas o días solo para conseguir compilar el código.
En mi intento anterior de portar Super Tux Classic a Godot 4 me dio la impresión de que el juego parecía tener excesivo código y escenas para lo que es la complejidad del juego pero en verdad el 90% de las escenas corresponden a los niveles del juego así que tampoco está tan mal.
Mi idea inicial era hacer los siguientes cambios:
Al final lo hice un poco más simple como explicaré a continuación.
Los gráficos que tenía que modificar estaban en el directorio SourceCode/images/player/tux
. Ahí hay varios subdirectorios para los distintos sprites de Tux, el protagonista del juego:
big
: cuando Tux es grande como en Super Mario Bros.small
: Tux pequeño.worldmap
: Es el sprite que se usa en el mapa de elección de nivel.Las imágenes son demasiado grandes para mis capacidades de dibujo (aproximadamente 46x66 píxels) pero haría lo que pudiese.
Mi plan inicial era hacer los gráficos pixelados. Aunque los gráficos del juego parecen hechos con un programa de dibujo tipo Gimp, las pocas animaciones que he hecho en mi vida las hice con PyxelEdit así que allí me fui. Compré una licencia de este programa hace más de 10 años y creo que no se ha actualizado desde entonces. La mayoría de páginas enlazadas en la web oficial de PyxelEdit dan error así que supongo que el programa está abandonado. Es el programa con el que estoy más familiarizado para dibujar píxels y funciona muy bien en Linux con Wine así que lo he seguido usando todos estos años.
Tras un rato mirando fijamente fotos de chorizos en el buscador dibujé esta animación de 2 frames. Como el sprite me quedó muy pequeño decidí que sería el sprite del mapa.
Esta fue una versión inicial que luego pensaba mejorar pero (¡sorpresa!) al final la dejé así por pereza.
Para los sprites más grandes decidí cambiar a Inkscape. Para crear personajes sencillos más o menos me manejo pero nunca había probado a hacer un personaje animado. Se llama reto de la paella pero el principal objetivo es probar cosas nuevas.
Hice un diseño inicial del personaje. La idea era luego ponerle algún tipo de textura al cuerpo pero (¡sorpresa!) al final lo dejé así. Aquí fue cuando se me ocurrió que el Tux pequeño sería un chorizo cortado por la mitad y el Tux grande un chorizo entero. No me gustaron las piernas oscuras del anterior dibujo así que las puse del mismo color que el resto del cuerpo. Debería editar la versión pixelada para hacerla consistente pero así se quedó.
El siguiente paso fue intentar animar el chorizo grande. Hice 4 copias del objeto inicial y fui cambiando la orientación de las piernas para simular que caminaba. No sabía cómo exportar cada objeto por separado así que exporté la imagen a PNG y con PyxelEdit organicé la animación como pude. Esté fue el resultado final:
Luego me puse con el chorizo pequeño. Como el anterior me había quedado algo cutre decidí buscar algo de información sobre cómo animar con Inkscape para ver si había alguna herramienta especializada como la que tiene PyxelEdit. No encontré nada específicamente para esto pero en la wiki de Inkscape hay un pequeño artículo sobre cómo animar. En él recomiendan hacer cada frame en una capa y luego usar la extensión JettyInk para exportar uno a uno los frames de la animación. Está extensión se incluye por defecto con Inkscape y, por lo que he entendido, se usa para crear presentaciones pero se puede utilizar sus funciones de exportar para otras cosas como, en este caso, animaciones. Siguiendo esa pequeña guía me resultó más sencillo crear y exportar la animación. Aún así tuve que importar las imágenes en PyxelEdit para alinearlas un poco. Esta animación me salió un poco mejor que la primera.
Para el chorizo grande lo que hice fui sustituir las imágenes de Tux por las nuevas en el directorio del proyecto. Funcionó aunque me pareció muy cutre y no estaba seguro de si iba a causar algún error inesperado.
Con el chorizo pequeño lo intenté hacer un poco mejor: dentro de Godot, seleccioné una de las imágenes del pigüino y la intenté borrar. Me salió un aviso indcando qué escenas usaban ese recurso. Por suerte era solo una: Tux.tscn
. Esta escena tiene 2 AnimatedSprites, SpriteSmall
y SpriteBig
que, como su nombre indica, tenían las animaciones del pingüino. Edité las animaciones para poner las nuevas. Mis imágenes era mucho más grandes así que tuve que escalar el objeto al 20%.
Hice lo mismo con el sprite del mapa. Esta vez en la escena era scenes/worldmap/Player.tscn
.
Ahora que ya tenía los sprites del personaje funcionando me puse a pensar en cómo incluir la paella. Quería que estuviera al final del nivel. En el Super Tux al final de cada nivel hay un iglú en el que se mete el pingüino. Quizá podía cambiarlo por un paellero en una típica barraca valenciana y que el chorizo saltase a la paella para terminar el nivel. Demasiado ambicioso y ya no quería emplear demasiado tiempo en este proyecto. Ya llevaba varias semanas con esto pendiente.
Al final decidí buscar una imagen de una paella. Elegí una versión del emoji que encontré en Wikipedia. Cambié el sprite del iglú por la paella y di por concluído el proyecto.
Pongo a continuación unas pocas capturas de pantalla de cómo quedan los sprites en el Super Tux. No son del mismo estilo pero tampoco desentonan demasiado estéticamente. Quizá el tamaño es un poco pequeño.
Aún hay muchas referencias a Tux en el juego como los iconos pero no me molesté en cambiarlos. El mayor problema que le veo es que, para ser un juego ambientados en paellas valencianas, la estética helada e invernal del juego no encaja nada.
Terminado este reto. Creo que he aprendido un par de cosas:
Nos vemos en el próximo reto de la paella.