Ir al contenido principal

Godot 2D, Terreno destructible

Similar a lo vez en juegos como Worms, Hedgewars, Duel of Tanks, etc.




Como es costumbre dejo las ilustraciones, archivos 3D y el dibujo vectorial aquí.
http://www.mediafire.com/file/xeohcauejbw8fa5/Iustraciones_del_Terreno_destructible.zip/file

Comenzamos con modelar, texturizar y exportar el terreno a Godot, usa el programa y la exportación soportadas que mas te agrade, yo usare Blender 2.79 con la exportación a .OBJ




Pasamos todo a nuestro proyecto y arrancamos en Godot.




El agujero
En una escena colocamos un nodo "CSGPolygon", le cambiamos el nombre por: "Agujero".




En la propiedad "Mode", elegimos "Spin" ahora en "Spin Sides" elevamos el valor a "25", mas alto sea este valor mejor se vera el contorno circular y no poligonal pero mas recursos consumirá.




Lo giramos -90 grados, lo agrandamos sobre el eje: "Y" hasta: "2.5", un valor por encima de la profundidad de tu mapa, el mapa que hiciste en 3D.




Pasamos al modo "Ortogonal", con "Vista Superior", movemos el punto rojo para formar un trapecio, que tanto lo muevas determinara en tamaño del contorno que tendrán los agujeros.




Ahora le ponemos un material sin sombreado del color que desees que sean lo contornos del agujero.




En el apartado "CSGShape", en "Operation", cambiamos a "Subtraction", notaran como el materia se vuelve un poco mas claro, esto es para indicarte el cambio, el material no se ha modificado.




El campo
En una nueva escena colocamos:
"Spatial" como nodo raíz, le ponemos el nombre de: "Campo"
"CSGCombiner" como hijo de "Campo", le ponemos el nombre de: "Terreno"
"CSGMesh" como hermano de "Terreno".




Seleccionamos el nodo "Terreno", marcamos la casilla de "Use Collision".




Pasamos al nodo "CSGMesh", cargamos nuestro modelo OBJ.




Ponemos un nuevo material al que le ponemos la textura y quitamos el sombreado.




La bala
En una nueva escena colocamos:
"Spatial" como nodo raíz, le ponemos el nombre de: "Bala", le añadimos un script
"Sprite3D" como hijo de "Bala", le colocamos su textura
"RayCast" como hermano de "Sprite3D".




Clic en el nodo "RayCast", en "Enabled" marcamos la casilla, le damos un tamaño acorde al sentido de la bala y lo alejamos "-0.5" en "Z", para que pueda chocar con el terreno al mismo tiempo que la bala se mantiene visible por el frente, aunque sea 2D recuerda que estamos en 3D.




Ajustamos la forma de la colisión solamente por los ejes: "X" e "Y".




Introducimos las ordenes:




El arma
En una nueva escena colocamos:
"Spatial" como nodo raíz, le ponemos el nombre de: "Arma", le añadimos un script
"Sprite3D" como hijo de "Arma", le colocamos su textura
"Position3D" como hermano de "Sprite3D".




Movemos ligeramente el nodo "Sprite3D", el movimiento en "X" de "-0.5" es para cambiar su punto de rotación y el de "Z" de "-0.1" es para que se coloque por detrás del personaje que la porte.




Movemos ligeramente el nodo "Position3D", el movimiento en "X" de "-0.5" junto con el de "Y" de "0.01" es para alinearlo con el cañón del arma.




El script lleva esto:




El Personaje
En una nueva escena colocamos:
"KinematicBody" como nodo raíz, le ponemos el nombre de: "Personaje", le añadimos un script
"Sprite3D" como hijo de "Personaje", le colocamos su textura
"CollisionShape" como hermano de "Sprite3D", le ponemos una forma cúbica
Enlazamos el arma anteriormente creada.




Ajustamos la colisión solo en los ejes X e Y, después su Posición para que quede pegada al personaje.




Le agregamos la acción "ui_saltar" a la tecla "Shift"




Guion:





La escena principal
En una nueva escena colocamos:
"Spatial" como nodo raíz, le ponemos el nombre de: "Mostrar"
"Camera", como hijo de "Mostrar"
"Sprite3D" como hermano de "Camera", le ponemos el nombre de: "Fondo", le colocamos su textura
enlazamos la escena de "Campo"
enlazamos al "Personaje"




Seleccionamos la cámara, cambiamos "Proyection" a "Orthogonal", alejamos la cámara un poco deslizando sobre el eje "Z" en "3" y en "Size" elevamos hasta ver completamente el escenario, en este caso basta con elevarlo hasta: "5.7".




Movemos el campo ligeramente hacia abajo para que de la impresión de estar encima del agua




Movemos al personaje, el movimiento en "Z" es ligero, no mucho, solo lo suficiente como para que se aprecie el arma completamente.




¡Listo!
http://www.mediafire.com/file/572y65kclz3e7tt/Terreno_destructible.zip/file

Nota:
Evita los agujeros pequeños y/o muy juntos suelen conducir a un mal funcionamiento.

En terrenos mas grandes con muchos agujeros VISIBLES se puede empezar a poner lento.

Puedes mejorar el rendimiento bajando el número de "Spin Sides" del "Agujero".

Si destruyes absolutamente TODO el terreno, Godot devolverá una error.

Las balas normalmente se hacen con el nodo "Area", pero al día que se escribe esto, Godot esta en la versión 3.2 y en esta versión el Nodo "Area" no detecta las colisiones con los nodos de "CSG", desconozco si es torpeza mía o es Godot y si es Godot esperemos que lo implementes en versiones futuras.

Pude haber usado un "RigidBody" para la bala pero no es muy bueno para detectar con que choca, aveces en vez de devolver con que choca se desliza o rebota, de esa forma no registra la colisión.

Como lo mencione en la primera publicación de este blog, los modelos que hagas en Blender deben estar perfectamente centrados en todos los ejes para tener una correcta exportación a OBJ y por ende a Godot.

En estos momentos se me ocurren otras dos formas de hacer terreno destructible:
-Una es integrar, o buscar, o hacer una librería de recorte de polígonos 2D, de esa forma no es necesario tocar el 3D, lo harías directamente en 2D, recortando las colisiones, no use este método por que CSG ya viene incluido y listo.

-Otra forma seria dibujar sobre el mapa los agujeros, el personaje caminaría sobre los píxeles de la imagen y no sobre las formas de colisión de Godot, mas grande la imagen mas se elevaría el consumo de memoria RAM, además tendrías que crear un motor de física basado en el choque de píxeles.

Si deseas exportar a Android sustituye todos los nodos "Sprite3D" por nodos "MesInstance" con malla "QuadMesh"

Comentarios

Entradas más populares de este blog

Godot 2D, Burro castigado

Es un juego de cartas similar al juego de UNO. Reglas: Comenzamos por repartir cuatro cartas a cada jugador. 1. El primer jugador tira una carta, la que quiera. 2. Los jugadores de la derecha deben tirar solo una carta del mismo palo. 3. Quien halla sacado la carta mas alta gana la ronda, ahora tira la carta que quiera. 4. Se repiten los pasos 2 y 3. Si no tienes una carta del mismo palo debes tomar cartas de la baraja hasta que puedas tirar una, si se acaban las cartas de la baraja cedes tu turno al de la derecha, gana el jugador que se quede sin cartas. Las ilustraciones y dibujo vectorial aquí están: http://www.mediafire.com/file/oisuslw4o2n0oac/Ilustraciones_de_Burro_castigado.zip/file Comenzamos por crear una carta, en una nueva escena colocamos el nodo: "TextureButton" como nodo raíz, le ponemos el nombre de: "Carta". En el apartado "Textures", "Normal" colocamos un "Nuevo AtlasTexture". Clic en &q

Godot web, Base de datos

Consultamos y agregamos registros en una base de datos de un servidor. El servidor Comenzamos por crear una base de datos, en este caso es una base llamada: "videojuego". Ahora creamos una tabla de nombre: "record". En la tabla ingresamos 3 campos: id: como llave primaria nombre, como varchar puntucion, como int. Ingresamos varios registros de prueba a la tabla. Descargamos, ponemos en una carpeta llamada "Cx4a" dentro del servidor, editamos para ingresar nombre de usuario, clave de MySql entre otros datos. http://www.mediafire.com/file/a6c7048tmz2ksir/Cx4a.zip/file Godot Tabla Comenzamos por la tabla, en una escena colocamos un nodo: "ScrollContainer", al que le damos un tamaño de 300 x 200 Ahora como hermano de "ScrollContainer" colocamos un: "VBoxContainer", en propiedades, nos bajamos hasta "SizeFlags" en donde marcamos la casilla de "Expand". Po

Godot 3D, Girar cámara con cursor

Mueve el cursor y la cámara se moverá con el. Aunque la cámara esta colocada como hijo del personaje funciona perfectamente sin serlo. Las ordenes de la cámara: ¡Listo! http://www.mediafire.com/file/zka6ty5f0q9cbvr/Camara_y_mouse.zip/file Nota: Funciona en Godot3.xx