Archivo de la etiqueta: Godot Engine

Doble Salto en Juegos de Plataformas – Sunny Land en Godot

¡Hola amigos! En este turorial voy a explicarles cómo extender las funcionalidades de Sunny Land, el juego de plataformas que desarrollé hace unos meses, añadiendo la posibilidad de dos o más saltos en el personaje principal. Hago este tutorial porque un usuario me comentó que estaba intentando programar el doble salto del personaje y para ello había duplicado el estado de saltar en la Máquina de Estados.

Seguir leyendo Doble Salto en Juegos de Plataformas – Sunny Land en Godot

Enemigos que te disparan

Ya estoy retomando el ritmo de los tutoriales, vamos ahora con otro en la Lista. Les enseñaré a hacer enemigos un poco más inteligentes, que puedan dispararle a los jugadores cuando se encuentren cerca. Para esto podemos tomar prestado código del Juego de Plataformas Sunny Land y el Asset de la Máquina de Estados. Si al momento de ver este vídeo todavía estoy mudando los repositorios a GitLab, pueden obtener el código de los artículos.

Seguir leyendo Enemigos que te disparan

Selector de Personajes

Tengo tiempo sin hacer esto de los tutoriales, es hora de retomarlo. Explicaré un tema que me habían pedido hace un tiempo, en los siguientes días es probable que pueda hablar sobre los dos que me faltan hasta ahora (según la lista de tutoriales).

(Escribí esto hace como un mes, pero no tenía internet para publicarlo. Hoy en día me faltan más tutoriales por cumplir)

Hacer un selector de personajes en Godot es muy sencillo, tenemos muchos métodos diferentes. Lo que aplicaremos ahora será la creación de una nueva escena de Interfaz 2D. Para los personajes que serán “seleccionables” podemos usar el nodo de tipo TextureButton, y si hace falta redimensionar la imagen, activamos su propiedad “expand”.

Cuando tengamos las imágenes/botón preparadas (que en mi caso son naves, pero puede ser cualquier cosa) añadamos un script para el nodo raíz y empecemos a conectar la señal de “pressed()” de los botones con él.

Después necesitaremos un Singlenton o script en el AutoLoad que pueda guardar al jugador que queremos añadir a nuestro nivel. Hagan clic en “Nuevo Script” y lo guardan con el nombre de “global_var”. Pueden hacer de ese script un Singlenton si entran en los aquíAjustes de Proyecto y en la pestaña de AutoLoad lo añaden. El nombre que elijan para ese script será el que deben usar cuando quieran trabajar con sus variables y/o funciones. Si no sabes como funciona el AutoLoad, pasa por aquí.

Antes de cerrar el nuevo script, creen la variable de “player_dir” e indiquen que será de tipo String. Ella guardará la ruta que tiene el personaje que instanciaremos, en el Sistema de Archivos de nuestro proyecto.

Ya con esto podemos volver a nuestro Selector de Personajes. En el script con todas las señales de presionado conectadas, vamos a crear las variables de “nave_azul”, “nave_roja” y “nave_verde”, que son mis personajes. Esas tres variables son una cadena de texto (String) y para tener la dirección de cada una sólo tenemos que arrastrar la escena correspondiente al personaje hasta el espacio después del igual, en la variable.

Dentro de todas las funciones que quedaron abiertas, hagan que la variable “player_dir” del script global, pase a tener la dirección del personaje que represente ese botón. Por ejemplo: la primera señal que emití corresponde a la nave verde, por lo que la dirección correcta para el script global será la variable con la nave verde.

También debemos añadir una línea que nos haga cambiar de escena, yo lo resolví con una función que llama a “get_tree().change_scene()”, sólo tienen que poner dentro “change_scene()” la ruta de la escena nivel, y después de hacer clic en alguna nave, cambiaremos de escena.

Ya en nuestro nivel sólo tendremos que instanciar la nave que indiquemos en el Selector. Añadan un Script donde quieran: puede ser en el nodo raíz o por algún contenedor de los personajes, como es mi caso. Básicamente tienen que cargar la escena con la dirección que guardamos hace un rato, y usar la función “instance()” para crear una nueva instancia que podamos tener en la escena. La añadimos como hija y cambiamos su propiedad de posición si no tenemos una cámara.

Como algo opcional pueden crear un nodo Position2D para guardar la posición del nuevo personaje.

Espero que este artículo con su vídeo les sea de utilidad. Pueden dejar dudas o recomendaciones en los comentarios de este blog o YouTube.

Cómo automatizar la colocación de items en mapas con Godot Engine

Si estas desarrollando un vídeojuego (en Godot Engine) y quieres añadir mejoras u otros elementos, es probable que termines preparando muchas escenas para los items, monedas y otros objetos particulares, que después tendrás que posicionar dentro de un nivel. Instanciar y posicionar una escena dentro de otra puede resultar engorroso, sobretodo si después cambias de opinión y quieres eliminar o cambiar la posición de un item… en este artículo aprenderán a usar el nodo TileMap con un script muy sencillo, que les facilitará la tarea de colocar items en sus niveles.

Preparar el TileMap

Después de añadir un nodo TileMap con el nombre del item o cosa que represente, añádanle un recurso tileset con la imagen del objeto. Para crear ese recurso sólo tienen que hacer clic derecho en algún lugar del Sistema de Archivos y después presionar sobre «Crear Recurso > TileSet».

Supongo que ya saben trabajar con ese tipo de recursos. Después de añadir una imagen, presionan el botón amarillo con la opción de «Tile único» y ajustan el tamaño con el rectángulo amarillo. Después de colocar el recurso Tileset dentro del nodo TileMap, hagan que las celdas tengan el tamaño de la imagen de su item. En mi caso el item tiene las dimensiones de 16×16 pixeles.

Script del TileMap

Ya con eso podemos dibujar en cualquier lugar del mapa una imagen estática de nuestro objeto, faltaría que esas imágenes se convirtieran en una nueva instancia de la escena correspondiente. Añadan un script normal al nodo TileMap y copien lo siguiente:

extends TileMap

var cherry = load("res://Items/Cherry/Cherry.tscn")

func _ready():
	for c in get_used_cells_by_id(0):
		var new_cherry = cherry.instance()
		add_child(new_cherry)
		new_cherry.global_position = map_to_world(c) + Vector2(0, 8)
		set_cellv(c, -1)
  • La variable cherry lleva el nombre de su item y guarda con load la dirección de la escena que tiene ese item en la carpeta de proyecto. Pueden obtener esa dirección si desde el Sistema de Archivos hacen clic derecho sobre una escena y buscan la opción «Copiar Dirección».
  • La variable c del bucle for tomará la posición de todas las celdas ocupadas en el TileMap. La función get_used_cells_by_id(0) devolverá una lista (array) y el bucle se ejecutará según el tamaño de esa lista. Con cada valor de la variable c, una nueva instancia se guardará como hija del nodo TileMap.
  • Cuando decimos map_to_world(c) estamos indicando que la nueva posición global de cada item pase de la posición local del mapa (que en ese momento se guarda en «c») a la posición global de nuestro juego. Fíjense en que durante todas las vueltas del bucle, la variable «c» siempre tendrá el valor de Vector2() con la ubicación de cada celda. Para que los items se alineen con el suelo, pueden sumar un Vector2(0, y aquí poner el resultado del tamaño vertical de su item dividido entre dos) por ejemplo: como mi item mide 16px de alto, sume un Vector2(0, 16/2) para que quede alineado. Ustedes pueden sumar o restar según los valores que necesiten.
  • Con la última línea de set_cellv(c, -1) estaremos eliminando la imagen estática que creamos al principio en la posición que tenía la variable c durante esa pasada del bucle.

Todo listo, deberían tener un resultado así:

Si tienen alguna duda, pueden dejarla en los comentarios :).

Juego de Estrategia… y turnos | DevLog 1

Después de una pausa por cuestiones de salud (toda la semana pasada estuve enfermo) vuelvo con el desarrollo de este proyecto (Juego de Estrategia basada en turnos con Godot). Les dejaré una lista con los avances que hasta el momento pude realizar.

  1. Nueva paleta de colores.
  2. Límite al movimiento de las unidades (ya no pasan sobre el agua o la zona montañosa).
  3. Los Scripts del generador de mundos y el controlador de la partida ya se encuentran comentados y estructurados según la guía de estilo para gdscript.
  4. La cámara ahora tiene una base para recibir «animaciones» durante la partida, con un nodo Tween.
  5. Solución a dos problemas relacionados con las unidades: el primero era que podían desaparecer del mapa y el segundo que sus casillas claras no aparecían cuando estaba cerca de un obstáculo.

No fueron muchos cambios importantes, espero que durante esta semana pueda avanzar en la interfaz de usuario. Necesito hacer algo bonito para el menú de selección de edificios, la información de recursos del jugador y otros detalles.

¡Encontré recursos gratuitos para la interfaz de usuario!

Un dato interesante es que los experimentos para medir el rendimiento del proyecto no bajaron de 59fps hasta que llegó el momento de mostrar las casillas viables. Cuando la unidad a la que se hace clic tiene más de 15/20 movimientos disponibles, hay una bajada de veinte o más fps. Generalmente ninguna unidad supera los diez movimientos, ya que se cuentan otras cosas como el coste de movimiento según la casilla, por lo que esta imperfección estará eclipsada.

Entonces cierro por hoy. Sepan que si bien el desarrollo del repositorio apunta a la interfaz de usuario esta semana, también dejaré espacio para abrir una nueva línea independiente sobre la generación de mundos aleatorios (procedural generation) en github. Avisaré cuando llegue el momento, ¡buena suerte compañeros!

Space Pixel RPG : Un pequeño juego de naves antiguo

Presentación

Hola, mi nombre es Matías y vengo del canal de youtube FuryCode. Llevo desarrollando videojuegos desde hace ya algunos años y quería hacer un pequeño Devlog de un juego que hice para una jam. El juego se llama Space Pixel RPG y pronto (6 de julio del 2019) se lanzará en la Play Store de Android. Quería contarles mi experiencia desarrollando este pequeño juego y ver si podemos sacar algo que pueda ayudar a alguien.

¿De que trata el juego Space Pixel RPG?

Space Pixel RPG es un pequeño juego arcade en el cual te mueves en un camino y puedes disparar sólo al centro de la pantalla. Puedes moverte de forma horaria o anti-horaria con las flechas del teclado o haciendo tap en la pantalla (la parte izquierda o derecha) si estas en un móvil.

Es un juego casual por lo que los niveles, normalmente suelen ser fáciles y cortos.

El juego lo cree, para luego enseñarlo en un curso de Udemy acerca de fundamentos de GDScript en Godot engine, que tengo hecho, pero lo quiero ampliar.

Desarrollo del juego

Lo anterior era solo para poner en contexto, ahora les quería hablar acerca del desarrollo de videojuego.

El juego esta desarrollado en Godot Engine 3.1 con GDScript, y me demore menos de 4 días (durmiendo y sin mucho apuro) en sacar una versión 0.1.0 para la jam. La jam era de una semana, que por cierto todavía no se sabe el ganador, luego se sabrá.

Primero, como podrán notar, no es un gran juego arcade, ni piensa serlo. Es básicamente un experimento para probar algunas cosas que he ido aprendiendo acerca de ASO (APP Store Optimization) y también me a servido para reflexionar otras cosas.

Mediante el desarrollo no tuve casi ningún inconveniente grave, ya que es un juego simple. Sólo que me arrepiento un poco de no haber generado los niveles del juego de una forma aleatoria controlada o procedural. Esto me hubiera tomado un poco más de tiempo de desarrollo pero hubiera tenido muchos niveles. Y al final sería sólo una inversión de tiempo al principio para después dedicarle tiempo a otras cosas, como podría ser otro modo de juego, etc. Pero ya no lo hice así.

Qué cosas aprendí en el desarrollo de Space Pixel RPG

Bueno aquí quiero destacar algunas cosas que aprendí y que puede o no puede que compartan todas las personas

  • Sí, es difícil encontrar equipo para desarrollar un proyecto, pero no hay escusas para no hacerlo solo: Para desarrollar videojuegos normalmente es necesario contar con un equipo. Pero, no siempre puedes contar con que tu equipo este hasta el final del desarrollo, por diversos motivos, normalmente se tratan de motivación. Y hay que tomar en cuenta que muchas veces el arte, música, programación son difícilmente reemplazables. Si no puedes pagarle a un equipo para que te ayude con las áreas que tu no manejas como podría ser el arte, música o programación. ¡Siempre puedes aprender de todo un poco! El juego Space Pixel RPG lo hice todo yo, aunque reutilice música que había hecho anteriormente con beepbox, el arte es muy pixelado y no muy bueno. Pero esta hecho por mí. Y esto demuestra, un poco, que sí se pueden hacer las cosas solo. Aunque igual puedes conseguir algunas cosas de forma gratuita como por ejemplo los sonidos los baje de OpenGameArt.
  • Las metas pequeñas no son difíciles de terminar: Suele pasar que nos proponemos metas muy grandes, y no está mal, pero hay que considerara que las metas mas pequeñas son mucho más realizables que las metas más grandes. Sobre todo si estas empezando. ¡Si estas empezando no hagas el próximo battlefield!
  • Atento al marketing: Hay que estar más atento al marketing, generalmente es algo que no se aprende cuando te lo dicen, sino que cuando te topas con la realidad. Siempre es bueno informarse acerca de SEO, ASO, Marketing, etc. Yo no soy un experto en esto, pero cada vez me doy más cuenta de lo importante que es.

Bueno, en realidad son solo esas cosas las que aprendí con el desarrollo, a parte de temas de programación.

No hay que rendirse, sí otros lo han logrado ¿Por qué tu no?


Por cierto descarga el juego Space Pixel RPG ya!! (En la fecha de la creación de este artículo no esta disponible, pero te puedes registrar para que Android te notifique)

Creación de Proyecto e información sobre los recursos – Sunny Land con Godot – Cap I

Si estas aquí es porque te decidiste a iniciar un nuevo curso. Espero que aprendas cosas nuevas. Seguro que ya sabes crear proyectos, definir los Nodos y las Escenas en Godot, y muchas cosas más relacionadas con el editor… pasaré entonces a darte más detalles sobre los Recursos que se pueden crear dentro de Godot, pero primero configuraremos nuestro proyecto.

Dirijanse a los “Ajustes de Proyecto”, les enumeraré los cambios que realizaremos:

  1. Windows → El Ancho y Alto del proyecto será de 320 y 240 pixeles respectivamente.
  2. Windows → Bajando en las propiedades de la misma sección, sería bueno cambiar el Mode a 2D y el Aspect en Keep. Así los gráficos se ajustarán a cualquier cambio que se le realice a la pantalla.
  3. Escriban “Snap” en el buscador, y después activen la propiedad “Pixel Snap”. Con eso evitamos que los gráficos no se encuentren perfectamente alineados.

Creando Recursos

Ahora podemos empezar: según la documentación oficial del motor, tenemos que Los recursos son Contenedores de datos. Sirven cuando un Nodo puede disponer de sus datos y darles una función. El recurso que necesitaremos para trabajar con nuestros mapas de tiles, se conoce como TileSet. Para no desviarme del tema, y pasar directamente a construir los gráficos ncesarios, les dejaré con este enlace la documentación de Godot en Español en su tema de los recursos: https://docs.godotengine.org/es/latest/getting_started/step_by_step/resources.html.

Creamos una nueva carpeta desde el sistema de archivos de Godot y dentro de ella, cuando pulsemos el clic derecho, podremos “Crear un Recurso”. Nos mostrará un menú parecido al que sale cuando creamos nodos, simplemente escribimos “TileSet” y ya tendremos lo que necesitamos. Guardamos y abrimos con doble clic.

Se abrirá el editor de Tiles. Lo pueden usar para crear AutoTiles y Tiles separados. Para eso ustedes deben tener preparada una hoja de Sprites con los tiles que van a necesitar, alineados en función de que sea fácil entender cómo es que deben estar colocados cuando Godot les dé posiciones. La hoja que usaré yo, la tienen en la carpeta de Assets que pegamos dentro del proyecto.

La añadimos con el botón de “+” y ahora podremos elegir entre crear un recurso AutoTile (azul) o un Tile único (amarillo). Esa hoja de ahí tiene muchas opciones, pero sólo vamos a poder aplicar tiles automáticos con unas zonas determinadas, como la tierra y la madera. Por lo tanto, primero seleccionaré la opción de AutoTile. Se nos permitirá definir la “región” o la “zona” de nuestra hoja. Para hacer que el selector sea más exacto, presionemos el botón con el imán:

Se percatarán de que los Tiles son más pequeños que los cuadrados de ahí. Para reducir el tamaño, vamos al inspector y cambiamos el «Snap» a valores de 16×16. Cuando la tengamos así, podremos seleccionar exactamente la zona de los tiles.

Los tenemos y ya podemos avanzar a la sección de «Collision», allí podremos hacer que los tiles sean sólidos para nuestro personaje. Nos encontraremos con que los cuadrados siguen siendo más grandes que la imagen, dirijanse nuevamente al inspector y abran la sección «Selected Tile» , busquen la propiedad «Subtile_size» y en los valores de «X» y «Y» ponen 16×16, el tamaño de estos tiles.

Ahora sólo debemos hacer un clic sobre la herramienta de rectángulo (la segunda, de izquierda a derecha), y después en los tiles que queramos como cuerpos sólidos.

Cuando tengamos todas las colisiones que necesitamos, pasaremos a la sección «BitMask», para definir cómo reaccionarán los Tiles mientras se estén creando. Deben hacer clic en todo el espacio que ocupa cada tile, menos en los bordes. Como en esta imagen:

Estos tiles ya deberían funcionar correctamente, sin embargo, nos toca seguir añadiendo otras partes que faltan. Como ya saben formar AutoTiles, explicaré como se hacen imágenes separadas, para saltarme el trabajo de hacerlo con todas.

Muy bien, hacer esto es practicamente el mismo proceso. Van al apartado de “Region” y en lugar de Autotiles seleccionan “Single Tile”. Marcan los tiles que necesitan, le dan una colisión si hace falta, y nos vamos felices.

En el próximo capítulo les explicaré todo lo que necesiten saben sobre el nodo TileMap y diseñaremos un mapa para nuestro nivel principal.

Botones virtuales para juegos en dispositivos móviles – Godot Engine

¡Hola! en este tutorial veremos una pieza fundamental para juegos de teléfonos. Incluir teclas virtuales en Godot es súper sencillo. Este artículo es una adaptación de otro tutorial, así que necesitarán que su personaje ya se pueda mover con un teclado desde la computadora.

Mi código de movimiento, sería algo como esto: (noten que en la dirección de izquierda o derecha, se define con la entrada de la acción «ui_right» y «ui_left»)

Muy bien: entren en la escena principal del juego y dentro de un nodo CanvasLayer, añadan los botones que necesiten para mover a su personaje, con el nodo de tipo TouchScreenButton. Un aproximado, serían tres de esos nodos, uno para la izquierda, otro para la derecha y un último para la flecha de saltar. A cada uno le colocan una imagen correspondiente a su acción: el primero se llama izquierda, tiene la flecha izquierda, el derecho es derecha, tiene su flecha, y el último se llama salto, con la flecha que apunta hacia arriba.

Para decirle a Godot que presionar esos botones desencadena una acción, la clase TouchScreenButton tiene una propiedad llamada «Action» que al ser presionada, producirá una entrada con el nombre que digamos. A cada dirección se le asignará una acción diferente: a izquierda y derecha, ui_left y ui_right respectivamente, ya que son las acciones que buscamos para mover horizontalmente a nuestro jugador. Y al salto, le corresponde ui_up.

Lo último que falta configurar para estos nodos, es que en su propiedad “Visibility Mode” indiquemos “Tuch screen only” para que sólo se muestre cuando el juego se ejecute sobre un entorno donde exista una pantalla táctil. Y si quieren emular un toque de la pantalla con el puntero del mouse, vayan a los Ajustes de Proyecto y, escribiendo «touch» en el buscador, activen la emulación de los toques.

De esta forma terminamos. Ahora, tocar esos botones produce el mismo efecto que presionar el teclado.