Organizar Nodos en Godot

Nodos en Godot La principal característica de Godot es que puedes organizar todo con Nodos, ¿Pero qué son los Nodos? Los

Views 96 Downloads 4 File size 185KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Nodos en Godot La principal característica de Godot es que puedes organizar todo con Nodos, ¿Pero qué son los Nodos? Los nodos son los objetos que va a contener el juego, pueden ser visuales o no, eso va a depender que lo que quieras hacer, pero como ejemplo, un Sprite es un Nodo visual y un Camera2D es no visual, dado que la cámara en si, no es un objeto que puedas reconocer en el juego como un enemigo, el personaje, el fondo, las plataformas etc....

Como organizar adecuadamente Una duda que podrías tener es, ¿Como funcionan?, bueno esta pregunta tiene muchas respuestas, ya que obedece a como quieres que sea el juego, pero para la generalidad, existe una manera práctica de saber como organizar los nodos, de forma que tenga un sentido en tu juego, y no tengas que hacerlo por que en un tutorial dice que es así, sin que tú entiendas porque. Antes de empezar a crear juegos, se deben conocer algunos conceptos claves, que te ayudaran a entender lo que hace cada nodo. Los principales son: Viewport, Camera, Sprite, Tiles. Viewport: es el área visible de tu juego, o más bien, “la pantalla”, que puede mostrar cualquier cosa de tu juego, si algo está fuera de los margenes de viewport no será visible en tu juego, pero si existirá, como por ejemplo en un juego de Super Mario Bross, solo ves una pequeña parte del nivel y a medida que vas avanzando van apareciendo las demás cosas, esto es porque el viewport solo muestra una porción de todo el nivel. En Godot por defecto existe un viewport y así que no es necesario que lo añadas tu, a este objeto puedes configurarle su tamaño y en Godot está delimitado por un rectángulo azul. Camera: una camera, es exactamente lo que conocemos como cámara, pero para representarlo, es como un camarógrafo que sigue al actor o la escena, mientras va enfocando, como el la TV solo puedes ver una cámara a la vez, en un juego es igual, solo se puede ver una cámara a la vez a través de un viewport, a esta cámara se le llama cámara activa. Sprite: es una representación gráfica, puede ser una fotografía, un dibujo, una caricatura, un personaje, el fondo, los objetos del fondo, etc..., cualquier cosa que tu quieras manipular mediante el teclado, mouse, joypad, programación, etc..., será un Sprite, entonces lo usaremos para ir colocando nuestros elementos en pantalla, como enemigos, personajes, obstáculos, etc.... Tiles: este tipo de objeto es usado principalmente para crear los niveles de un juego, es un conjunto de imágenes que al juntarlas componen una elemento reconocible, como por ejemplo el suelo, las paredes, las plataformas. Principalmente, objetos inanimados, que están allí, como el escenario, o el mundo del personaje. Conociendo esos 4 elementos tienes una gran historia por detrás de como se han creado los vídeo juegos.

En un principio trabajaremos con viewport, sprite y tiles. Es típico de juegos con una sola pantalla estática, como la mayoría de juegos conocidos: Candy Crash, Pacman, entre otros. Entonces vamos a detallar los elementos de un juego archi-conocido Pacman, ya que justamente es un juego sencillo y que reúne estos conceptos básicos.

Construcción de Pacman

Acá tenemos varios elementos sencillos: 1 pacman 4 fantasmas (de distintos colores) frutas varias (naranja, plátano, frutilla, etc...) los puntitos de comida los puntos grandes de poder. 1 nivel 1 un área de pantalla más larga que ancha, así como una pantalla de celular en posición viewport, para ser claros, un rectángulo parado como un edificio, ¿más claro así?

Ahora necesitamos identificar que es cada cosa, ya está claro cual es el viewport. El pacman, las frutas, los puntitos de comida, los puntos de poder y los 4 fantasmas serán los sprites, cada fantasma será una imagen única para hacerlo más simple, ya que con programación podemos ocupar solo una imagen, pero para efectos prácticos no nos sirve de esa forma. Y por ultimo el nivel será el laberinto de bordes azules. Ocuparemos la imagen anterior para ir recortando cada sprite, lo puedes hacer con cualquier editor de imágenes que te guste. Deberías lograr algo como esto:

Ahora, este juego tiene algunas particularidades, pacman abre y cierra la boca mientras avanza, los fantasmas miran en dirección de donde avanzan y los puntos de poder brillan. Esto son animaciones que por ahora las dejaremos fuera, lo importante es saber como organizar estos nodos en nuestra escena. En Godot, es muy necesario tener un nodo que se llama root (raíz), puede ser de cualquier tipo, pero siempre es recomendado que sea representativo de lo que estas haciendo, generalmente puedes ocupar 2 tipos de nodos como root en Godot: Node → CanvasItem → Control: Sirve para crear todo lo que se relaciona como la información del juego. En un juego normal tienes el puntaje, las vidas que te quedan, el nombre del nivel, las pantallas de las opciones del juego, etc... todos estos elementos deberían pertenecer a un nodo raíz de tipo Control. Node → CanvasItem → Node2D: Este sirve como nodo principal para todos los elementos de la escena, es decir, nuestros enemigos, personajes, el nivel, obstáculos, o cualquier elemento que queramos manipular. Empezando con lo práctico, crea un Node2D como root (para juegos 3D existen otros elementos que no serán del alcance de esta guía), entonces allí debes agregar cada sprite y posicionarlos en donde lo desees, para los sprites selecciona Node → CanvasItem → Node2D → Sprite, luego duplica los sprites tantas veces como los que necesitemos, para eso se necesita 8 sprites Debería verse como esto:

Ahora solo bastará ir asignando la imagen a cada sprite, en el parámetro Texture. Es importante que las imágenes se encuentren en un subdirectorio del proyecto. Una recomendación es no ocupar mayúsculas, espacios y caracteres no ASCII en los nombres de carpetas o archivos, preferentemente en ingles, para evitar errores de compatibilidad entre plataformas. Una vez termines de asignarle las imágenes y colocarle sus respectivos nombres debería quedar como esto:

Como ves, así se organizan los nodos en el juego, en este juego cada nodo es independiente, es decir, ningún nodo tiene otros nodos dentro, esto es porque para este juego no es necesario, pero imagina por un momento que los fantasmas tuviesen la posibilidad de tomar armas que encuentran en el camino, cada fantasma tendría un sub-nodo que representaría esa arma. Lo que trato de decir es que la jerarquía es como en la realidad pasa. Haciendo un ejemplo, que estudiaremos más adelante, nosotros tenemos un cuerpo, pero este tiene ropa y accesorios, entonces esa ropa y accesorios son sub-nodos de nuestro cuerpo.

Los Cuerpos Haciendo referencia al ejemplo anterior, Godot contiene unos tipos de nodos que representan cuerpos, como por ejemplo cuerpos Estáticos, cuerpos kinematicos (con movimiento), cuerpos Rígidos (afectados por la física Newtoniana)

Cada uno de estos tiene un rol en el juego Estáticos: son nodos que pueden ser obstáculos o elementos coleccionables, en pacman, los obstáculos o elementos coleccionables son los puntitos, las bolas de poder, las paredes del nivel, las frutas. El nodo asociado a el es: Node → CanvasItem → Node2D → CollisionObject2D → PhysicsBody2D → StaticBody2D Kinematicos: son nodos que tienen la capacidad de ser animados y movidos en la pantalla, en pacman, los kinematicos son pacman y los fantasmas, puesto que son estos los que se mueven por toda la pantalla. El nodo asociado a el es: Node → CanvasItem → Node2D → CollisionObject2D → PhysicsBody2D → KinematicBody2D Rígidos: son nodos que tienen la capacidad de verse afectados por la física Newtoniana (Godot trae por defecto un motor de física que funciona sin que tu hagas nada). En pacman no existen cuerpos de este tipo puesto que no existe física aquí. El nodo asociado a el es: Node → CanvasItem → Node2D → CollisionObject2D → PhysicsBody2D → RigidBody2D Entonces ahora debemos crear cuerpos para todos los elementos que son parte del juego en este caso para pacman y los fantasmas debes crear nodos kinematicos, y como el Sprite representa una imagen de este cuerpo debes hacer que cada sprite sea hijo de cada nodo kinematico. Haremos la prueba con pacman y debería quedar así:

Cuando lo agregues KinematicBody2D veras que se coloca en el centro de la escena, luego el sprite pacman debes redefinir su parent al KinematicBody2D, verás que pacman sigue en su posición original y KinematicBody2D en el centro, pero cuando mueves KinematicBody2D también se mueve pacman, pero al estar en posiciones distintas pasa que pacman no parece estar dentro de

KinematicBody2D lo que debemos hacer es configurar la posición de pacman a x = 0, y = 0, ya que la posición de los nodos hijos es relativa a la del padre, es decir, al mover el padre todos los nodos hijos se moverán junto a él manteniendo sus posiciones visuales intactas. Esto es útil cuando un personaje tiene muchos accesorios y debes moverlos todo juntos, en ves de moverlos uno a uno, solo mueves el padre y todos se moverán con él, armónicamente.

Algunos Tips con Cuerpos Si quieres que un personaje, enemigo o cualquier cosa sea afectado por las leyes físicas, debes usar RigidBody2D. Si quieres controlar todas las características de movimiento con programación en el espacio de tu personaje, enemigo o cualquier cosa, debes usar KinematicBody2D. Si deseas hacer cosas estáticas como mesas, floreros, paredes, etc..., debes ocupar StaticBody2D. En particular RigidBody2D es la mejor alternativa para los juegos de plataforma, ya que no tienes que controlar la física de las cosas, pero este objeto carece de movimiento que si tiene el nodo KinematicBody2D, pero a su vez, este último, carece de ser afectado por las leyes físicas, por lo tanto, debes por medio de programación agregarle a RigidBody2D la posibilidad que pueda moverse así como lo hace KinematicBody2D (puesto que es más fácil que programar la física para KinematicBody2D). Para esto existe un código que encontré en internet que le agrega la función move a un RigidBody2D. Debes agregar un script a RigidBody2D, copiar y pegar este código en él: func move(desired_velocity_x, accel, delta): velocity_x = lerp(velocity_x, desired_velocity_x, accel*delta) set_linear_velocity(Vector2(velocity_x, get_linear_velocity().y)) básicamente esta función solo mueve el cuerpo atrás y adelante.