Hola a todos estoy creando un documento en google doc es online y se pueden dejar comentarios.
La idea es buscar el ejemplo del concepto y aplicarlo en cualquier engine…No se trata de un documento con la explicación de como usar un motor en particular,sino de un concepto general aplicado a cualquier game engine.
por lo visto hay herramientas que se repiten en todos los Game engine por eso se me ocurrió la idea de crear un documento donde se pueda ver en diferentes motores de videojuegos la misma funcionalidad resaltando ejemplos prácticos y la sintaxis o tutorial en español del game engine en particular…:dejo el documento que por ahora tiene 11 hojas…Si quieren dejar alguna sugerencia o comentario no duden en hacerlo en el mismo documento.
¡¡¡ Hola @kone9 !!! recién pude ponerme a ver en detalle el documento, ¡está espectacular!, es un gran avance y me parece que voy a poder aprender algunas ideas copadas de ahí. ¡Te investigaste todos los frameworks de juegos!
Aprovecho para contribuir algunas ideas que vi mientras repasaba el documento:
Aleatoriedad:
En pilas agregué algunas funciones para permitir esto más fácilmente. Hay una función nueva llamada azar que permite generar un número aleatorio dado un rango.
pilas.azar(desde, hasta)
Algo a mencionar es que esta función puede retornar valores que se incluyen en los extremos, por ejemplo si llamamos a pilas.azar(1, 3)
podría retornar 1
, 2
, o 3
.
Por cierto, hice un ejemplo mostrando cómo usar esta función en la versión nueva de pilas:
https://app.pilas-engine.com.ar/#/ejemplos/azar
Etiquetas o grupos para obtener parámetros de objetos
Todos los actores en pilas pueden tener una etiqueta para luego poder acceder a ellos desde otra parte del juego. Hay dos funciones principales para realizar esta búsqueda por etiquetas.
La función obtener_actor_por_etiqueta
recorre todos los actores en busca del primer actor que tenga la etiqueta solicitada:
let actor = this.pilas.obtener_actor_por_etiqueta("moneda")
Luego, la función obtener_todos_los_actores_con_la_etiqueta
hace algo similar, pero en lugar de retornar el primer actor con esa etiqueta retorna una lista con todos los actores que tengan la etiqueta.
Por ejemplo, en el ejemplo de aleatoriedad, cuando el usuario pulsa el botón “desordenar todos los actores” las monedas se mueven a una posición completamente distinta. Para eso usé la función obtener_todos_los_actores_con_la_etiqueta
y luego apliqué la función map
para darle a cada actor una posición nueva:
Buscar hijos
Por ahora los actores de pilas son lineales, no tienen estructura de arbol o padres/hijos. Es algo que me gustaría tener a futuro, pero es medio difícil de hacer ahora, lo trataré de hacer más adelante.
Buscar objetos o nodos hijos en una escen…
Aquí se podría usar la función pilas.obtener_actor_por_nombre(nombre)
donde nombre
tiene que ser un string con el nombre del actor en la escena, por ejemplo “caja” o “enemigo”.
Cambiar de escenas
Se me ocurren dos casos comunes de utilización, para cambiar a una escena usando su nombre se puede escribir:
pilas.cambiar_escena("escena2")
asumiendo que el título de la escena es “escena2”. Aquí tomo nota, aún no tenemos forma sencilla de llamar a las escenas de forma personalizada desde el editor, pero es algo para hacer en breve.
Otra cosa muy común es querer reiniciar la escena actual, en ese caso se puede escribir directamente:
pilas.reiniciar_escena();
Sistema de waypoint
Aún no tenemos una implementación de esto, voy a investigarlo porque me parece buenísimo y me gustaría que pilas lo incluya.
Instanciar objetos en la escena
Para crear actores en pilas se puede usar una forma muy parecida a la que teníamos en pilas 1. Se puede escribir pilas.actores.
seguido del nombre del actor. Por ejemplo, la nave de pilas puede disparar lasers invocando a este código, la parte destacada en rojo es donde invoca la creación del actor:
Por cierto, el editor acá nos puede ayudar bastante por que lista todos los actores conocidos en pilas:
lo malo es que ese listado solo muestra los actores que trae pilas. Si el programador hiciera un personaje propio no aparecería ahí. Mmmmm… habría que buscar una forma de incorporar esos actores personalizados ahí, tal vez podemos imitar un poco lo que hace unity, que tiene ese concepto de “prefabs” no?. Lo voy a investigar.
Destruir objetos
Para eliminar actores en pilas primero tenemos que conseguir apuntar al actor con una variable y luego llamar al método eliminar()
. Por ejemplo:
let nave = pilas.actores.nave();
nave.eliminar()
Enemigos persiguen a personajes
Esto también lo tendría que investigar, actualmente no tenemos nada que permita hacerlo fácil.
Colisiones, chocar con objetos en una escena y física
Las colisiones en pilas se logran usando figuras, cada actor tiene su propia figura y se muestra en el editor de propiedades. Ahí se puede seleccionar el tipo de figura (círculo o rectángulo por ahora) y cómo debe interactuar al contactar con otras figuras.
Luego, los eventos de reacción (al chocar por ejemplo) se tiene que programar desde el editor. Para que un actor reacciones a un choque con otro actor tiene que implementar la función cuando_comienza_una_colision
. Por ejemplo, en el ejemplo de plataformas que incluye pilas hay un personaje que puede capturar monedas siempre y cuando colisione con ellas:
También hay otros dos métodos para poder programar una reacción cuando se mantiene la colisión y cuando termina, cuando_se_mantiene_una_colision
y cuando_termina_una_colision
.
Áreas y cuerpos para activar eventos
Aquí se pueden lograr cosas similares a las que están en el documento, pero algo más básicas, usando las mismas figuras de la sección anterior pero marcándolas como “sensores” con la casilla que aparece en el inspector de propiedades.
Destruir objetos al salir de la cámara
Aquí no tenemos algo en pilas que lo facilite, me imagino que podemos implementar una habilidad para lograr esto. Algo como “eliminar al salir de cámara”, pero actualmente no existe, estoy pensando en voz alta…
Punto de SPAWN para los objetos en la escena
En pilas no tenemos ese concepto, pero sí se pueden inicializar los actores y luego asignarles la posición x e y de forma fija (con un número) o de forma relativa. Por ejemplo, en el ejemplo de la nave de más arriba, los lasers se crean en la misma posición que la nave usando las lineas laser.x = this.x
(donde this
es la nave en este caso).
Me quedé pensando en algunas mejoras para incluir en el próximo sprint y repasando de nuevo el documento. Una vez más: ¡Espectacular tu trabajo @kone9!, ¡gracias por compartirlo con nosotros!
Gracias a vos,perdón por la demora en contestar, ahora estoy haciendo tutoriales con JMONKEY ENGINE ya que es estable y cuanto más motores de juegos investigó más entiendo como funciona todo esto…Ese documento va a seguir creciendo…Con todo lo que dijiste hay un montonazo para documentar…Por parte de pilas voy a esperar hasta que sea estable…Te comento que la mayoría de la información sobre conceptos de videojuegos las APRENDO DE UNITY3D,ya que unity como es tan masivo hay mucha información,desde como resolver problemas, hasta conceptos de videojuegos que no se ven en ningun lado…
UNA COSA IMPORTANTE que podrías agregar a pilas engine es un buscador de archivos dentro del editor…Es importante tener acceso a los recursos de forma visual y en lo posible arrastrarlos a las propiedades como en unity3D o godot engine
Saludos
Ok,gracias…actualmente estoy con JMONKEY ENGINE.saludos