Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: ReyHuno en Diciembre 11, 2012, 08:36:52 PM

Título: Problema variable perdida de vida
Publicado por: ReyHuno en Diciembre 11, 2012, 08:36:52 PM
Hola, estoy haciendo un juego tipo Zelda Link to the Past en cuanto al combate y cómo acabo de empezar a usar game maker con códigos, estoy teniedo algún problema, pero el que no consigo solucionar es el de cuando el goblin enemigo ataca al personaje. No se porque solo quita una vez la vida hasta que el personaje se aleja del ratio y luego vuelve.

La idea es que el personaje siga perdiendo vida hasta que no salga del área de ataque con un retardo de unos 30 frames por segundo...

El área del código que interesa es este:

//Si marca como objetivo al Héroe
if (distance_to_object(obj_hero)>3 and distance_to_object(obj_hero)-3<distance_to_object(obj_castillo) and not collision_point(x,y,obj_goblin1,1,1)){
    mp_potential_step_object(obj_hero.x,obj_hero.y,3,obj_pared)
   
    //Si esta más lejos en direccion X que en Y
    if (distance_to_point (obj_hero.x,y)>(distance_to_point (x,obj_hero.y)) and obj_hero.x > self.x) {
        sprite_index = spr_goblin1_l2;
        image_xscale = -1;
        //Si se encuentra muy cerca, Atacar
        if (distance_to_object(obj_hero)<=6+5) {
            if (collision_rectangle (self.x+5,self.y,self.x+32,self.y-32,obj_hero,0,1)){
                image_speed = 0.2;
                sprite_index = spr_goblin1_la;
                image_xscale = -1;
                global.vida -= random_range (1,3);
            }
        }
    }
    if (distance_to_point (obj_hero.x,y)>(distance_to_point (x,obj_hero.y)) and obj_hero.x < self.x) {
        sprite_index = spr_goblin1_l2;
        image_xscale = 1;
    }
    //Si esta más lejos en direccion Y que en X
    if (distance_to_point (x,obj_hero.y)>(distance_to_point (obj_hero.x,y)) and obj_hero.y > self.y) {
        sprite_index = spr_goblin1_d2;
        image_xscale = 1;
        //Si se encuentra muy cerca, Atacar
        if (distance_to_object(obj_hero)<=6) {
            if (collision_rectangle (self.x-15,self.y,self.x+16,self.y+32,obj_hero,0,1)){
                image_speed = 0.2;
                sprite_index = spr_goblin1_da;
                image_xscale = 1;
                global.vida -= random_range(1,3);
                }
            }
        }
}
    if (distance_to_point (x,obj_hero.y)>(distance_to_point (obj_hero.x,y)) and obj_hero.y < self.y) {
        sprite_index = spr_goblin1_u2;
        image_xscale = 1;
        //Si se encuentra muy cerca, Atacar
        if (distance_to_object(obj_hero)<=6) {
            if (collision_rectangle (self.x-15,self.y+22,self.x+16,self.y+7+32,obj_hero,0,1)){
                image_speed = 0.2
                sprite_index = spr_goblin1_ua;
                image_xscale = 1;
                global.vida -= random_range(1,3);
            }
        }
    }


A parte de eso otro problema es que la vida que quite vaya en valores enteros, pero eso es secundario...

Muchas gracias de antemano por todo, espero haberme explicado bien
Título: Re:Problema variable perdida de vida
Publicado por: JuanP en Diciembre 13, 2012, 11:18:15 PM
Hola.
¿La idea es que se le reste vida cada 30 "steps" si esta en el rango de ataque? el código no parece tener fallo tal vez el problema es como estas haciendo llamar a este código es decir si esta en el evento step o alarm, por que no pruebas a hacer algo que te indique que el código si se esta ejecutando cuando debe ser, no se cambiar el color del sprite imprimir unas letras crear una instancia. Bueno tal vez ya hiciste eso y sabes que se esta ejecutando correctamente pero en fin es lo que se me ocurre  :P
Título: Re:Problema variable perdida de vida
Publicado por: shaoran en Diciembre 14, 2012, 01:44:04 PM
Fijate  bien la logica que haz planteado:
En la primer bloque determinas que el objetivo debe estar por fuera y sin colisionar, si es asi lo marca y posteriormente entrea al segundo bloque donde determina que tan lejos esta y le quita la vida.

Pero una vez dentro, la primer linea ya no se cumple, por que ya esta dentro del radio y no por fuera.

Lo que puedes hacer es meter un while dentro del segundo bloque y no permitir quese rompa a menos que te alejes o mueras.

Lo que eh marcado con las barras es donde posiblemente este la falla, no estoy muy seguro pues no eh tenido tiempo de probar el codigo.

En cuanto pueda, lo pruebo y te confirmo.



////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
/////    Si marca como objetivo al Héroe
///    if (distance_to_object(obj_hero)>3 and distance_to_object(obj_hero)-3<distance_to_object(obj_castillo) ////   and not collision_point(x,y,obj_goblin1,1,1)){
////    mp_potential_step_object(obj_hero.x,obj_hero.y,3,obj_pared)
///////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////



   
    //Si esta más lejos en direccion X que en Y
    if (distance_to_point (obj_hero.x,y)>(distance_to_point (x,obj_hero.y)) and obj_hero.x > self.x) {
        sprite_index = spr_goblin1_l2;
        image_xscale = -1;
        //Si se encuentra muy cerca, Atacar
        if (distance_to_object(obj_hero)<=6+5) {
            if (collision_rectangle (self.x+5,self.y,self.x+32,self.y-32,obj_hero,0,1)){
                image_speed = 0.2;
                sprite_index = spr_goblin1_la;
                image_xscale = -1;
                global.vida -= random_range (1,3);
            }
        }
    }
    if (distance_to_point (obj_hero.x,y)>(distance_to_point (x,obj_hero.y)) and obj_hero.x < self.x) {
        sprite_index = spr_goblin1_l2;
        image_xscale = 1;
    }
    //Si esta más lejos en direccion Y que en X
    if (distance_to_point (x,obj_hero.y)>(distance_to_point (obj_hero.x,y)) and obj_hero.y > self.y) {
        sprite_index = spr_goblin1_d2;
        image_xscale = 1;
        //Si se encuentra muy cerca, Atacar
        if (distance_to_object(obj_hero)<=6) {
            if (collision_rectangle (self.x-15,self.y,self.x+16,self.y+32,obj_hero,0,1)){
                image_speed = 0.2;
                sprite_index = spr_goblin1_da;
                image_xscale = 1;
                global.vida -= random_range(1,3);
                }
            }
        }
}
///////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
  if (distance_to_point (x,obj_hero.y)>(distance_to_point (obj_hero.x,y)) and obj_hero.y < self.y) {
        sprite_index = spr_goblin1_u2;
        image_xscale = 1;[/b]
///////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
        //Si se encuentra muy cerca, Atacar
        if (distance_to_object(obj_hero)<=6) {
            if (collision_rectangle (self.x-15,self.y+22,self.x+16,self.y+7+32,obj_hero,0,1)){
                image_speed = 0.2
                sprite_index = spr_goblin1_ua;
                image_xscale = 1;
                global.vida -= random_range(1,3);
            }
        }
    }

Título: Re:Problema variable perdida de vida
Publicado por: ReyHuno en Diciembre 18, 2012, 04:39:35 PM
Muchas gracias por atenderme, voy a intentar arreglarlo basándome en lo que has dicho y ya comentaré más...