Quisiera saber si alguien me puede ayudar, tengo un problema en mi juego RPG Isometrico estoy utilizando una IA para los enemigos en la cual para el seguimiento estaba utilizando mp_potential_path, pero dado a que cuando son varios enemigos en el room se pone lento el juego es que opte por utilizar mp_potential_step, el cual a su ves funciona bastante bien para lo que necesito, el unico problema es que al esquivar alguna que otra caja solida es como que el enemigo se queda pegado por un rato en el lugar al colisionar, quisiera saber como puedo hacer para que esto no pase, osea se puede verificar de alguna manera que momento antes de colisionar la esquive asi no pasa esto o algun otro metodo. desde ya mil gracias.-

  Saludos Makero the_blade:

  Como bien dice la explicación de la función esta no está exenta de errores, puede fallar. Aun así dice que en la mayoría de los casos puede llegar a alcanzar el objetivo.   :-[

  Un posible error en tu código puede ser que el tamaño del "stepsize" sea muy grande y a en el momento de chequear colisiones ya se encuentre dentro del objeto a evitar.    :-\

 

  Una solución a largo plazo puede ser crear tus propios "scripts" de movimientos donde chequees los espacios cuadrados que ocupan los objetos. Claro esto es válido si el juego que estás haciendo se mueve según el tamaño del "tile" del suelo, o sea un "tile" es un paso.  :)

  Si fuera así solo tienes que crear un "array" de todo el terreno a chequear donde los números cero (0) sean los espacios vacíos, uno (1) los espacios ocupados con objetos inmóviles y dos (2) los espacios ocupados con los personajes amigos y enemigos.   ;)

Cada vez que un personaje se vaya a mover, chequeará en el "array" si la posición a la que se mueve está vacía (o mejor dicho tiene un cero (0)), si ese así se mueve y actualiza los números en el "array". Este chequeo de colisiones es bueno no solo para el personaje jugador al moverse sino también para las IA enemigas para alcanzar un objetivo esquivando los obstáculos.  :D

De esta manera controlas cuantas veces quieres que un enemigo chequee las colisiones y el juego no estará lento. 8)

  Si tienes dudas puedes preguntar... 8)


Gracias amigo como recomiendas utilizar el stepsize en esa funcion para un optimo rendimiento? por otro lado te comento que tu metodo debe ser muy eficas aunq no se si podria adaptarlo dado que en mi juego la mayoria de las instancias tienen diferentes tamaños, por ejemplo ahy cajas, tarros y enemigos, todos de diferentes tamaños, o crees se podria hacer de otra manera mejor, no se me ocurre como hacerlo y necesito una solucion lo antes posible. gracias.-

   Saludos makero the_blade:

  Lo del tamaño del "stepsize" es más bien una suposición, no estoy seguro que sea eso. No he trabajado mucho con esas funciones.

  En cuanto a lo de chequear el espacio por uno mismo, si tienes diferentes tamaños en los espacios que ocupan los elementos del mundo, puede ser un inconveniente. ¿Acaso no utilizastes "Snap" para colocar los objetos en el "room"? ¿En la ventana del "room", donde dice SnapX y SnapY qué número colocaste?

En caso de hayas puesto un número mayor de diez es posible subdividir el espacio y realizar por nosotros mismos los chequeos de la IA.

espero respuesta...   


en la ventana del room de cada nivel tengo puesto 16x16, tienes alguna idea en definitiva me interesa que los enemigos puedan esquivar cajas, tarros y a su ves se puedan esquivar entre si porq sino se suben unos arribas de otros si me podes ayudar a implementar tu sistema te lo agradeceria muchisimo y por otro lado te mando por mensaje privado mi msn para que me agregues si es que tenes asi si podes hablamos por ese medio, un abrazo.-

#5 Octubre 04, 2012, 08:44:05 PM Ultima modificación: Octubre 04, 2012, 08:46:47 PM por ferhand
  Makero the_blade:


   El MSN no me será útil ya que vivo en Cuba y no tengo opción de ningún tipo de chat. Las comunicaciones deberán ser a través de la ComunidadGM.

  Si tienes puesto 16x16 significa que los objetos y personajes ocupan uno o varios cuadros de esas medidas. Igual puedes decir en el "array" de control de colisiones que más de un cuadro están siendo ocupados y no se puede mover a esa dirección. Da igual que un objeto ocupe uno o más cuadros, el hecho es que todos esos cuadros deben aparecer como ocupados en el "array" para chequear la colisión antes de moverse.

Esto se parece mucho al GIA Tetris, donde una ficha ocupaba más de un cuadro en el campo. Mi solución fue crear un cuadro que tomo como punto centro o pivote. A partir de él documento todos los demás cuadros que este objeto debe ocupar. Todo lo hago relativo al cuadro pivote.

Por ejemplo: este personaje "cofre" ocupa a partir del cuadro pivote, un cuadro a la derecha, otro cuadro hacia abajo y otro a la derecha y abajo, sumando todos los cuadros incluyendo el de pivote son cuatro cuadros. Cada vez que ese "cofre" se mueva a la derecha debe revisar en el "array" si sus cuatro cuadros están desocupados, entoces se desplaza y actualiza en el "array" los cuadros que están ocupados en el mundo.

Este método es muy eficiente, no carga la PC y tienes control de lo que sucede todo el tiempo.

  Una cosa que se me pasó por alto es que el juego es isométrico. ¿Lo estás haciendo desde cero o ya tienes mucho adelantado? Lo pregunto porque para que en un isométrico los objetos se dibujen unos sobre otros en dependencia de la lejanía con la cámara debes tener una relación de la profundidad/posición y controlarla. Según la fila de cuadros que ocupas en el mundo será tu profundidad a la hora de dibujar. Para esto puedes utilizar el mismo "array" del que estamos ablando.

  Mi opinión es que  bases todo el juego en este sistema. Una vez implementado solo tienes que dedicarte a diseñar los elementos del mundo, pues las colisiones y orden de dibujado estarán controladas por un objeto controlador al respecto. El objeto que contendrá el "array" del mundo y le dirá a cada objeto su profundidad para ser dibujado...

Voy a almorzar, puedes escribir, pero responderé después de media hora... 


gracias ferhand mira si el juego en si esta bastante avanzado quizas vistes algo en su momento en la seccion galeria se trata del juego The American Conqueror: The Unknow Coast, y es por eso queria utilizar algo simple como mp_potential_step pero si decis q es mas eficiente ese sistema tendrias algun ejemplo o algo cortito como para estudiarlo y ver como la adapto a mi juego si es que no es muy complicado ya que el juego tiene aproximadamente 4 niveles ya hechos y muchos objetos en el mismo.-

  Makero the_blade:


  Sí, he visto las imágenes y son sorprendentes su calidad. El juego tiene buena pinta, pero sin un sistema robusto pasarás bastante trabajo para organizar y controlar todo su contenido.

  No te mentiré, los cambios que planteo no son "coser y cantar", levan su trabajo y análisis, pero mejorarían mucho el control de colisiones para que no se cargue la PC, te ayudarían a controlar el dibujado de profundidad, podrías generar tus propias IA sin que carguen demasiado la PC, todo eso solamente porque controlas las posiciones de los objetos sin tener que preguntarles a cada uno.

  Si todos los espacios que ocupan los objetos son múltiplos de 16x16 entonces es posible hacerlo, pero no está exento de trabajo.   

  Es tu decisión.  :-[ 


mira ferhand si crees poder ayudarme como para que funcione bien el sistema y no tenga inconvenientes en el juego dime q hacer o como puedes ir ayudandome, no se bien lo de los espacios porahy se podria arreglar como dices ya que por ejemplo si bien un arbol es grande  por ejemplo el sprite ocupa 496x440, solo necesitaria que colisione la parte de abajo del tronco o un poco menos total lo demas no importario y objetos mas grandes como efificios porahy se podria limitar como dices con varios cuadrados aunq con que no puedan pasar por arriba ya esta osea directamente se bloquearian los border, ahora decime por favor como hago necesito una solucion lo antes posible.-

  Primero lo primero:


  Cada objeto de tu mundo ocupa diferente cantidad de cuadros de 16x16, esa es el área de colisiones a chequear al mover.

  Cada objeto debe tener determinada el área que ocupan en el mundo. (imagen anexa)

  Mañana te traigo el algoritmo que utilicé en GIA Tetris modificado para que te sirva de ejemplo...Ahora debo ir a casa.  :-[ 


usa verificaciones de colision antes de indicar el movimiento, ya lo hice antes y funciona.
un ejemplo. (el codigo es largo)
if !place_meeting(x+lengdir_x(direction,speed*2),y+lengdir_y(direction,speed*2),other.solid)
{direction=point_distance(x,y,enemigo.x,enemigo.y) speed=8;}
else
if place_empty(x-32,y) and !place_meeting(x-32,y,other.solid)
{direction=point_distance(x,y,x-32,y) speed=8;}
else
.......
lo que haces es antes de ordenar el movimiento, verificas si en esa nueva posicion a moverse no colisiona, siendo true, es decir si no colisiona, se puede mover en la nueva direccion, de lo contrario verifica, espacios libres para desviar su camino y evitar la colision.

ferhand muchas gracias y bueno espero el algoritmo y elviskeley tambien gracias ahora decime ese ejemplo que me das es para usar con el mp_potential_step? y falta parte de codigo verdad?

Si falta gran parte del codigo, el codigo real son 157 lineas.
Esto solo era un ejemplo, o una idea, pero puedes usar grillas, controladas por alarm.

Primero lo primero:


  Cada objeto de tu mundo ocupa diferente cantidad de cuadros de 16x16, esa es el área de colisiones a chequear al mover.

  Cada objeto debe tener determinada el área que ocupan en el mundo. Yo particularmente lo determinaría con un "array". Dicho "array" tendría la forma de determinar todos los cuadros que ocupa dicho objeto a partir de un cuadro pivote (o de referencia) de la siguiente manera:

         







Representaré las columnas como "b" y las filas como "a". Tomo como pivote el cuadro rojo con la "palomita" y a partir de él redacto matemáticamente donde están los demás cuadros rojos.  Un cuadro está del cuadro de pivote a un cuadro más por las columnas en la misma fila, lo que es igual a: a+0, b+1. Otro cuadro está situado debajo del cuadro de pivote lo que equivale a un cuadro más por las filas en la misma columna: a+1, b+0. El último cuadro está situado del cuadro pivote a un cuadro más por las filas y un cuadro más por las columnas: a+1, b+1.

En dicho, que estará presente en cada objeto, solo guardo las posiciones relativas al cuadro pivote del objeto en cuestión. ¿Por qué relativas a un punto? Por que solo podemos posicionar a un objeto con un punto, pero si a partir de es punto conocemos el área que ocupa, que son sus cuadros, podemos controlar si colisiona o no en su totalidad con solo un punto.

Cada vez que el objeto se vaya a mover solo moverá el cuadro de pivote a las coordenadas de GM y a partir de él preguntará si el resto de los cuadros están vacíos o no.

Para saber que espacios del mundo están vacíos o llenos tendremos que llevar un "array" a modo de matriz con los cuadros del mundo ya ocupados. Para tener todos los datos actualizados en la matriz crearemos un algoritmo que recorra el mundo una sola vez, al inicio del juego para que sitúe los objetos inicialmente y otro algoritmo que escribirá y borrará los objetos móviles cada vez que se muevan.

Las bases del algoritmo son las ya mencionadas. Ahora presentaremos los pasos que debe hacer el juego para el control de colisiones y así sabremos nosotros que debemos programar:

1 el juego se inicia por lo que el objeto controlador crea la matriz del mundo, un "array" bidimensional (array[a,b]). Recorre todo el mundo ("room") y localiza cada objeto situado en él y lo registra en la matriz cuadro por cuadro. Ya está listo para empezar.

2 Cada objeto antes de moverse debe:
2.1  verificar si está vacío el cuadro de la matriz que coincide con la posición nueva a moverse, en caso de que esté vacío debe comprobar que el resto de los cuadros que componen al objeto pueden posicionarse también. En caso de que todo de positivo debe indicarle al objeto controlador que va a moverse y este borrará la posición vieja y escribirá la nueva en la matriz. Luego el objeto ejecuta la animación de moverse. En caso de que cambie de fila en la matriz debe actualizarse la profundidad para dibujar al objeto.

Implementar todos esos pasos es sencillamente meticulosidad, nada complicado solo trabajoso. Una vez esté implementado se verán las ventajas a la hora de implementar un algoritmo de IA que busque caminos posibles, que persiga, que esquive los obstáculos, incluso que realice emboscadas con cierto grado de inteligencia.

Esto es solo lo que debe hacer el código, para programarlo solo hay que ir paso a paso para evitar errores o variables inservibles.

Sería bueno saber como tratas los niveles, si es un "room" completo o solo una parte de un "room" gigantesco. Para determinar el tamaño de la matriz a utilizar en cada momento pues podemos tener, por ejemplo: una matriz mundo grande y otra pequeña que será solo del tamaño de la "view" porque en el juego ustedes decidieron que lo que estaba fuera de la "view" no se movería ya que no es multijugador.

Necesito saber las características del juego para poder diseñar los algoritmos óptimos pues se ajustan a las particularidades de cada proyecto. A demás no tengo mucho tiempo, mi idea es que aprendan en el proceso y lo programen ustedes, así sabrán mejor arreglarlo a la hora de los errores.

Si no entiendes dímelo que estoy en línea.


muchisimas gracias ferhand dime que caracteristicas necesitas saber del juego, yo creo q aunq sea con poco de ayuda y con algunas bases del codigo voy a poder ir armandolo. porque de momento nunca trabaje con ese sistema parece muy interesante.