Marzo 28, 2014, 11:26:22 PM Ultima modificación: Marzo 29, 2014, 07:03:08 PM por lorenzo
como hacer que los heroes sigan a varios enemigos
pero si ese enemigo esta peleando con un heroe que persiga a otro


es decir hay varios enemigos  y varios heroes

si 2 heroes van por un enemigo que el primer heroe en alcanzar al enemigo  se quede a pelear con el y que el otro heroe al ver  que ya alcanzo al enemigo vaya por otro enemigo que no aya sido alzanzado.


los enemigos son instancias del objeto enemigo
los heroes son instancias del objeto heroe


Haber si te entiendo, depende de esto variará el código para la solución del problema planteado, tú has creado un juego que conduce a varios personajes pero, ¿los conduce a la vez? o ¿los conduce intercambiando controles?.
me explico: osea aprieto un botón x para cambiar de personaje o héroe a manejar.
bueno en todo caso lo que puedes haces es jugar con las instancias. por lo que entiendo sólo tienes 2 héroes, ¿no?
igual puedes apuntar su ID antes que comienze el juego para que los valores recaigan en ellos; es decir:


//en el evento create
heroe[0]=instance_create( x, y, obj_heroes);
heroe[1]=instance_create( x, y, obj_heroes);

HvsE[0]=false;//variable que muestra si nuestro personaje esta en posición de pelea
HvsE[1]=false;

EID[0]=0;//variable que muestra con quien(con que instancia) el heroe está peleando.
EID[1]=0;

SetControlsTo=heroe[0];//da los controles a la instancia o primer heroe por defecto, el resto depende de ti.


//en el evento step

with(heroe[0])
     {
     if distance_to_object(obj_enemigo)<0{
                                                        temp=instance_nearest(x,y, object_enemigo);/*cuando el enemigo este cerca del heroe que le de a nuestra variable */      if temp!=EID[1] {/* si el enemigo que está cerca a ti es diferente con el que está peleado con el otro heroe*/
                                                                            HvsE[0]=true;
                                                                            EID[0]= temp; }/*si no se cumple está condición simplemente el héroe ignorará el enemigo que está luchando con tu otro héroe.*/                                                       
                                                         
                                                         }
      }

//generar controles para la instancia dada a SetControlsTo
with(SetControlsTo){//los controles que le quieras dar depende de ti
  if keyboard_check_button(ord('A')) then x-=2;
  else if keyboard_check_button(ord('D')) then x+=2;
} //lo que puedes hacer con esto es que si tu heroe[0] está ocupado con un enemigo entonces le quitas los controls
   //ejemplo:
   if  HvsE[0]==true then SetControlsTo=HvsE[1];//entiendes?
   


Bueno cualquier duda que tengas me avisas para explicarte pero, si realmente querías que tus heroes sean controlados a la vez, por una parte puedes cambiar el código de SetControlsTo.

crea un bucle para que recorra los datos del heroe[0] y heroe[1]. no lo hice porque tengo que explicar a que héroe recaerá la acción cuando las variables del otro estén ocupadas.

Lo que yo hago es poner varias instancias del objecto heroe y varias instancias del objeto enemigo en el room y luego ejecuto el juego.

al comenzar el juego todos los heroes que puse,me doy cuenta que  van hacia la  primera instancia del enemigo que puse en el room.

lo que quiero es que cuando un heroe toque a ese enemigo o primera instancia del enemigo ese heroe se quede a pelear con el y los otro heroes sigan a otra instancia  del enemigo que  no estee peleando.

pero los demas heroes de cualquier manera sigen a la primera instancia del enemigo aunque ya estuviera peleando.

en el evento step del heroe tengo

Citarif enemigo.pelea=0 and pelea=0
{
move_towards_point(enemigo.x,enemigo.y,2)
}


if enemigo.pelea=1 and pelea=1
{
speed=0
}



if place_meeting(x+vspeed,y+vspeed,enemigo)
{
sprite_index=pelea
pelea=1
}

creo que el problema esta en move_towards_point(enemigo.x,enemigo.y,2)
ya que (enemigo.x,enemigo.y) siempren lo toman a la primera instancia del enemigo.


habria que encontrar una forma de que al enemigo.x,enemigo.y al que no estamos refiriendo no esta peleando o tenga la variable pelea=0.



Debes recorrer todos los enemigos, ya que si te diriges a "obj_enemigo.x" el game maker da como preferencia el objeto de menor id que sea obj_enemigo... para recorrer varios objetos del mismo tipo esta instance_find(objeto, n):

Los objetos "enemigos" los recorrerías asi:

for (i=0; i<instance_number(obj_enemigo); i+=1)
{
     enemy[i] = instance_find(obj_enemigo,i);
     
     // para saber si tu enemigo esta peleando
     if (instance_exists(enemy[i]))
     {
           if (enemy[i].esta_peleando == false)
           {
                // atacar;
                enemy[i].esta_pealeando = true;
           }
     }
}


La variable "esta_peleando" debe estar creada en el objeto enemigo... pero es una idea nada mas....
Saludos :)
El ayer es un recuerdo, el mañana un pensamiento, es el ahora en donde existo y vivo para ser feliz :D