Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: WolfIng Entertainment en Mayo 08, 2015, 03:35:11 PM

Título: Enemigos solapados...[editado]
Publicado por: WolfIng Entertainment en Mayo 08, 2015, 03:35:11 PM
Edito.:

quiero que cuando se creen los enemigos y lleguen a mi posición que no se solapen unos con otros, es decir, que hagan colisión entre ellos y para llegar hasta mi tengan que intentar rodearme o algo así.... :-[ :-[no se si me han entendido... xD.
Resumiendo:
Quiero hacer como un check_collision con todos los enemigos, incluso con el mismo tipo de enemigo. Viendo que no puedo solucionar el problema, os dejo el editable del juego a ver si mirando el juego podeis ver mas claro el fallo.
Título: Re:Enemigos solapados...
Publicado por: damyrodriiguez en Mayo 08, 2015, 09:01:20 PM
HOLA AMIGO !!! TENGO LA SOLUCION..

Mira yo tengo un juego top down, de zombies en el cual uso ese tipo de codigos que tu quieres.. aqui te lo planteo. Este codigo teservíra para que los enemigos se colisionen entre ellos y se esquiven tambien..

hagamos el ejemplo de que lo estoy creando yo para guiarte..

Creo un objeto llamado: obj_player
Creo un objeto llamado: obj_zombies... bueno

ve a "step event" en obj_zombies y abre un "execute code" escribe lo siguiente.

if distance_to_object(obj_player) <= 256
{
      if distance_to_object(obj_player) <= 16 {speed=0}
   mp_potential_step(obj_player.x,obj_player.y,4,all)

      if distance_to_object(obj_zombies) < 16
      mp potential_step(x,y,4,all)
      if distance_to_object(obj_player) <= 16 {speed=0}
}

LISTO..obviamente tu pon el nombre de tu jugador segun como lo hayas escrito, y al del zombie tambien. tu sabes.

bueno, y el numero "4" que encuentras en esta accion "Potential" es la velodidad del enemigo o del objeto que se aserque a ti... pues la diferencia de usar "Pontential" y usar "point_direction" es que... mp_potential_step esquiva todo obstaculo para llegar a ti sin necesidad de mucho codigo, solo poniendo eso ya basta.. y el point_direction no esquiva objetos, va solo en linea recta.. a no ser que hagas mas codigos cosa que aburriria. bueno
espero que te sirva esto. dejame decirte que:

Por Pregunta sobre este tema o otras dudas que tengas, te hago saber que me llamo Luiber Extrenzas en Facebook, AGREGAME! yo aqui te dejo el Link, cuando quieras, a las ordenes (Y)

https://www.facebook.com/profile.php?id=100008220635391
Título: Re:Enemigos solapados...
Publicado por: WolfIng Entertainment en Mayo 09, 2015, 04:07:13 AM
Cita de: damyrodriiguez en Mayo 08, 2015, 09:01:20 PM
HOLA AMIGO !!! TENGO LA SOLUCION..

Mira yo tengo un juego top down, de zombies en el cual uso ese tipo de codigos que tu quieres.. aqui te lo planteo. Este codigo teservíra para que los enemigos se colisionen entre ellos y se esquiven tambien..

hagamos el ejemplo de que lo estoy creando yo para guiarte..

Creo un objeto llamado: obj_player
Creo un objeto llamado: obj_zombies... bueno

ve a "step event" en obj_zombies y abre un "execute code" escribe lo siguiente.

if distance_to_object(obj_player) <= 256
{
      if distance_to_object(obj_player) <= 16 {speed=0}
   mp_potential_step(obj_player.x,obj_player.y,4,all)

      if distance_to_object(obj_zombies) < 16
      mp potential_step(x,y,4,all)
      if distance_to_object(obj_player) <= 16 {speed=0}
}

LISTO..obviamente tu pon el nombre de tu jugador segun como lo hayas escrito, y al del zombie tambien. tu sabes.

bueno, y el numero "4" que encuentras en esta accion "Potential" es la velodidad del enemigo o del objeto que se aserque a ti... pues la diferencia de usar "Pontential" y usar "point_direction" es que... mp_potential_step esquiva todo obstaculo para llegar a ti sin necesidad de mucho codigo, solo poniendo eso ya basta.. y el point_direction no esquiva objetos, va solo en linea recta.. a no ser que hagas mas codigos cosa que aburriria. bueno
espero que te sirva esto. dejame decirte que:

Por Pregunta sobre este tema o otras dudas que tengas, te hago saber que me llamo Luiber Extrenzas en Facebook, AGREGAME! yo aqui te dejo el Link, cuando quieras, a las ordenes (Y)

https://www.facebook.com/profile.php?id=100008220635391

Lástima, hay un fallo pero no consigo encontrarle... me crea los enemigos en el borde de la room pero no se mueven de ahí... no se que pasa...
¿alguna idea de que puede pasar? lo he puesto como me dijiste
Muchas gracias de todas formas  ;)
Título: Re:Enemigos solapados...
Publicado por: damyrodriiguez en Mayo 09, 2015, 04:10:09 AM
Ponme el codigo que estas utiliando para que se creen los enemigos, haber como lo hisiste :)
Título: Re:Enemigos solapados...
Publicado por: damyrodriiguez en Mayo 09, 2015, 04:24:17 AM
FIJATE EN ESTO, TAL VEZ SEA EL PROBLEMA...

si estas creando los enemigos atravez de Execute code, es problema puede ser esto..

instance_create(x,y,obj_enemigo)

que en la posicion x tienes que agregarle un + y poner en que parte de la pantalla, ir ajustando..

por ejemplo.. instance_create(x+320,y+320,obj_enemigo) para elegir el lugar espesifico, y sino crea todos los enemigos de primera poniendolo tu manualmente, que no pasara ningun error con el codigo que te di, porque si no estas serca de ellos no se activarán, pues puedes ponerlos libremente
Título: Re:Enemigos solapados...
Publicado por: WolfIng Entertainment en Mayo 09, 2015, 05:10:26 AM
Cita de: damyrodriiguez en Mayo 09, 2015, 04:10:09 AM
Ponme el codigo que estas utiliando para que se creen los enemigos, haber como lo hisiste :)

Este es el código, es un sistema por oleadas que compartió un compañero de la comunidad:

var yy,xx,direc;

if (oleada == 0) {
    numOleada += 1;
    oleada = 1;
}
if (instance_number(obj_parent_enemigo_sigue) < numZombies * numOleada) {
    yy = random_range(544,480);
    direc = random_range(0,1);  //Creamos un n�mero aleatorio entre 0 y 1.
    if (direc >= 0.5) { //Si ese n�mero es mayor o igual que 0.5 se crea el objeto de izquierda a derecha
        idObj =  instance_create(0,yy,choose(obj_enemigo1,obj_enemigo2,obj_zombie3,obj_zombie4)); //con idObj tomamos la ID del objeto creado.
        idObj.direccion = 0; //Al objeto recien creado le cambiamos el valor de la variable direccion.
    } else { //Si no se crea de derecha a izquierda.
        idObj = instance_create(room_width,yy,choose(obj_enemigo1,obj_enemigo2,obj_zombie3,obj_zombie4))
        idObj.direccion = 1;
    }
    alarm[0] = 5; 
} else {
    oleada = 0;
}
Título: Re:Enemigos solapados...
Publicado por: damyrodriiguez en Mayo 09, 2015, 05:15:35 AM
Sabes porque no se mueven? no será que la oleada casualmente crea mas de 1 objetos sobre el mismo sitio? por el cual se tranca uno con el otro, por estar ensima entre ellos? fijate, tal vez es eso lo que pasa, disparale al enemigo para que cuando ese muera, tal vez el de abajo puedo avanzar, si esto pasa era ese el problema. dime
Título: Re:Enemigos solapados...
Publicado por: WolfIng Entertainment en Mayo 09, 2015, 06:10:30 AM
Cita de: damyrodriiguez en Mayo 09, 2015, 05:15:35 AM
Sabes porque no se mueven? no será que la oleada casualmente crea mas de 1 objetos sobre el mismo sitio? por el cual se tranca uno con el otro, por estar ensima entre ellos? fijate, tal vez es eso lo que pasa, disparale al enemigo para que cuando ese muera, tal vez el de abajo puedo avanzar, si esto pasa era ese el problema. dime

Si, era justo eso, y de vez en cuando me sigue pasando, no solo con las paredes si no con los enemigos también, puede ser por el precise colision? de todas formas ahora anda mucho mejor aunq la velocidad de los enemigos me parece muy rápida aunque se la baje a uno... xD
Título: Re:Enemigos solapados...
Publicado por: damyrodriiguez en Mayo 09, 2015, 06:16:43 AM
Me parecia, porque ya me ha pasado jaja sabes repararlo?

pon que al crearse el objeto zombie si esta en collision con el mismo objeto, se elimine y vuelva a crear, hasta que encuentre un lugar, eso el programa lo hace muy rapido y ni lo notas jaja sino elige tu manual mente la posicion asi te evitas estos problemas, eligiendo donde no hay objetos ni nada..
Título: Re:Enemigos solapados...
Publicado por: WolfIng Entertainment en Mayo 09, 2015, 06:31:52 AM
Cita de: damyrodriiguez en Mayo 09, 2015, 06:16:43 AM
Me parecia, porque ya me ha pasado jaja sabes repararlo?

pon que al crearse el objeto zombie si esta en collision con el mismo objeto, se elimine y vuelva a crear, hasta que encuentre un lugar, eso el programa lo hace muy rapido y ni lo notas jaja sino elige tu manual mente la posicion asi te evitas estos problemas, eligiendo donde no hay objetos ni nada..
No, la verdad es que no se como hacer eso, ¿podrías explicarlo?, aunque ahora el fallo no me da cuando se crean tanto como cuando están en pantalla y colisionan unos con otros...
Título: Re:Enemigos solapados...
Publicado por: damyrodriiguez en Mayo 09, 2015, 07:13:33 AM
Prueba con esto haber.. mmm

crea un objeto que se llame: obj_zombie_rel

y ve a event_create: execute code: pon global.zombie_rel = 0

en evento step pon esto: execute code: escribe..

if global.zombie_rel = 0
{}

if global.zombie_rel > 0
{
global.zombie_rel -=1;
Y DEBAJO AQUI PONES LA ACCION QUE CREE A UN ZOMBIE AL AZAR COMO LOS DEMAS.}

/// esto es para que no se pase el limite de variable.
if global.zombie_rel < 0
{global.zombie_rel = 0}

y listo, ponlo en el escenario...

ahora ve al objeto zombie normal osea al enemigo y pon...

en event_create: ve a la lista de comandos de game maker.. "control" y busca la que tiene
una flechita roja que toca con una pared azul... que se llama "Check Collision" ponla y te saldrá una ventanita asi:

x: x
y: y
objects: Only Solid.. la cambias a "ALL"

relative[SI]

y dejabo de esa pones en la misma lista de control una flechita que va a hacia arriba, y luego pones una que va hacia abajo... y en medio de ellas pon un execute code con esto:

global.zombie_rel += 1
instance_destroy();


prueba haber que tal... esto lo que hise fue, que si el objeto al crearse esta sobre otro objeto sea cual sea, pared o enemigo, se elimine y suma el variable +1 para que sepa que hay un enemigo que se elimino por falta de espacio y el variable vuelve a crearlo, pero si vuelve a crearse sobre otro se volverá a eliminar hasta conseguir lugar. es algo simple(: a mi me ha funcionado jaja
Título: Re:Enemigos solapados...
Publicado por: WolfIng Entertainment en Mayo 11, 2015, 05:30:18 AM
Cita de: damyrodriiguez en Mayo 09, 2015, 07:13:33 AM

prueba haber que tal... esto lo que hise fue, que si el objeto al crearse esta sobre otro objeto sea cual sea, pared o enemigo, se elimine y suma el variable +1 para que sepa que hay un enemigo que se elimino por falta de espacio y el variable vuelve a crearlo, pero si vuelve a crearse sobre otro se volverá a eliminar hasta conseguir lugar. es algo simple(: a mi me ha funcionado jaja

Lo siento amigo, o no lo hize bien, o no me funciona, se me siguen quedando solapados además de eso también se me quedan solapados si van andando y chocan unos con otros...

¿Alguien sabe como puedo solucionarlo?
Gracias compañeros!
Título: Re:Enemigos solapados...
Publicado por: damyrodriiguez en Mayo 12, 2015, 09:54:57 AM
No puedo aceptar que no puedas, te seguiré ayudando jaja mira, para que no sientas que no puedes.. Te harè un Editable y te lo subirè para que veas los códigos..... Ha y por sierto, para que los enemigos roten en dirección al player, que usas? image angle?
Título: Re:Enemigos solapados...
Publicado por: WolfIng Entertainment en Mayo 12, 2015, 11:35:33 AM
Cita de: damyrodriiguez en Mayo 12, 2015, 09:54:57 AM
No puedo aceptar que no puedas, te seguiré ayudando jaja mira, para que no sientas que no puedes.. Te harè un Editable y te lo subirè para que veas los códigos..... Ha y por sierto, para que los enemigos roten en dirección al player, que usas? image angle?

Bueno amigo, creo que mas o menos ya hacen lo que quería, aun así de vez en cuando se quedan trabados unos con otros pero más o menos lo que me fallaba era que el sistema por oleadas me creaba los enemigos fuera del room o justo en un punto en el que colisionaban con una pared y entonces ya no se movían. con respecto a lo que uso para hacer que giren entorno al jugador uso hspeed y vspeed, aunq estoy abierto a sugerencias jajajajajajja ;D ;D, pero creo q el image angle no me serviría de mucho pues ya tengo cuatro sprites para las direcciones de los enemigos y de momento con el hspeed y vspeed no va mal... (aunq estoy abierto a cambios constructivos... xDD)
como siempre gracias por molestarte en contestar!
Título: Re:Enemigos solapados...
Publicado por: 3dgeminis en Mayo 12, 2015, 04:20:15 PM
POone lo siguiente en el eventoCOLISION con otros enemigos:

empujar = point_direction(x,y,other.x,other.y)
if place_free(x+lengthdir_x(1,empujar),y+lengthdir_y(1,empujar))
{
x = x+lengthdir_x(-1,empujar)
y = y+lengthdir_y(-1,empujar)
}
Título: Re:Enemigos solapados...[editado]
Publicado por: Clamud en Mayo 13, 2015, 08:01:32 PM
Bajé el editable pero me apareció un error en el número de argumentos del script scr_minimapa, así que no puede probar el juego.

Yo creo que lo más fácil para evitar colisiones entre los enemigos es usar la función mp_potential_step o alguna de las variaciones que se muestran en el manual: Motion Planning (http://docs.yoyogames.com/source/dadiospice/002_reference/movement%20and%20collisions/motion%20planning/index.html). Lo importante es poner el argumento checkall como true para esquivar todos los objetos.

El inconveniente es que consume muchos recursos, ya que cuando se tienen máscaras de colisión precisas la detección de colisión se hace por pixel. Un sistema más eficiente debe usar alguna descripción geométrica para planear el movimiento, sin embargo eso resulta algo difícil de hacer. Dejo unos artículos que te pueden dar ideas:
http://es.wikipedia.org/wiki/B%C3%BAsqueda_de_ruta (http://es.wikipedia.org/wiki/B%C3%BAsqueda_de_ruta)
http://www.comunidadgm.org/articulos/pathfinding-(programaci243n)/ (http://www.comunidadgm.org/articulos/pathfinding-(programaci243n)/)
http://www.gamedev.net/page/resources/_/technical/math-and-physics/simple-but-effective-collisions-part-1-radial-collision-handling-r3147 (http://www.gamedev.net/page/resources/_/technical/math-and-physics/simple-but-effective-collisions-part-1-radial-collision-handling-r3147)

Un último comentario. Evita usar caracteres especiales (no usar vocales con tilde) en los nombres de los recursos de tu juego (ni en las variables), porque :GM8: codifica el texto y algunos caracteres no se muestran correctamente y tal vez se puede perder información.
Título: Re:Enemigos solapados...[editado]
Publicado por: WolfIng Entertainment en Mayo 14, 2015, 07:38:05 AM
Cita de: Clamud en Mayo 13, 2015, 08:01:32 PM
Bajé el editable pero me apareció un error en el número de argumentos del script scr_minimapa, así que no puede probar el juego.



si, de echo ese es otro problema, como estoy usando la version lite de GM8 y si me funciona pero cuando paso el juego a la version standard me da ese error, pero sinceramente no encuentro como quitarle un argumento al script sin que falle. Se agradecerían pistas sobre ello xDD

con respecto a mp_potential_step lo probé pero no me servía, me dejó un aporte un compañero de la comunidad pero no sirvió... también he quitado las mascaras de colisión precisa pero se siguen trabando y ya me estoy dando cabezazos contra la pared...  :-[ :-[jajajajajajaa
Bueno, muchas gracias.