Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: king195 en Julio 29, 2014, 11:49:36 AM

Título: Problema con sistema de daño
Publicado por: king195 en Julio 29, 2014, 11:49:36 AM
Buenas a todos, he estado teniendo un problema a la hora de realizar el sistema de daño. Lo que he hecho ha sido crear un sistema de inmunidad cada vez que el enemigo me lanza un ataque de tal forma que no me pueda sacar más vida.

Es decir, he creado un simple Alarm con un tiempo programado en el cual debería surgir efecto.

Create Event del personaje principal
global.inmortal = true;

Evento Alarm
global.inmortal = true;

Evento End Step
if distance_to_object(obj_enemigo) < 0.1{   
        if global.inmortal{
            global.inmortal = false;
            alarm[5] = 60;
        }
    }


En el evento End Step del personaje principal empiezan a  venir los problemas. He intentado que en vez de ser la distancia que hay con el enemigo sea cada vez que el "global.hp  = global.hp -1;" pero no ha funcionado, ya que si pongo eso el enemigo no me baja nada de vida.

Evento Step
  if global.inmortal{
        sprite_index = spr_ninja_prototype;
    }else{
        sprite_index = spr_player01_blood;
  }
 


Para cambiar el sprite cada vez que el enemigo me hace daño

___

Ahora a partir de eso he creado el sistema de ataque del enemigo

Create Event del enemigo
global.delay_attack = true;

Basicamente queria que hubiese un efecto retraso antes de que el enemigo le dé el golpe al personaje, por eso he intentado hacer un Alarm, el tema es que el Alarm empieza a contarse desde que el primer golpe fue efectuado, no lo hace pensando en el retraso, sino asestando un golpe principal y luego pensando en el retraso.

Alarm Evento del enemigo
global.delay_attack = true;

End Step del enemigo
if (distance_to_object(obj_player01) < 0.1){
    if global.delay_attack{
        global.delay_attack = false;
        alarm[1] = 30;
                if (global.inmortal = false){
                    global.hp -= 1;
                }
    }
}


Aquí en un principio lo primero que quiero que verifique es sí existe esa distancia con el obj_player, si la hay va a hacer el efecto delay(retraso), y la siguiente pregunta es sí el personaje esta en modo inmortal, si no lo esta la vida del personaje bajará 1 punto.

He hecho toda la comprobación y no funciona ni el Delay ni la Inmortalidad, lo único que hace el enemigo es pasar de la inmortalidad y pensar en cuanto tiempo le queda para hacer el ataque, al final más que un Delay es un efecto de espera al siguiente ataque y sin importarle si esta o no la inmortalidad. Alguna ayuda o recomendación de lo que podría hacer o mejorar?

Hay que tener en cuenta que el ataque que hace el enemigo al personaje es Meele, no es un efecto de disparo.
Título: Re:Problema con sistema de daño
Publicado por: king195 en Julio 29, 2014, 02:05:27 PM
No hay respuestas  :'( :'(

Me he fijado que uno de los problemas es ese... no pueden coexistir una acción que diga que si inmortal es falso va a poder quitarle vida por que entre medio el alarm que ejecuta el inmortal para que se repita cada x segundos ya lo pone a false de nuevo y ahí hay uno de esos fallos que impide o que se ejecute el inmortal o que me saque vida.

Sigo entre la espada y la pared, si alguien me puede echar una mano me vendría de 10. Por ahora voy a intentar arreglar 1 cosa antes de ir a los dos a la vez. El efecto retraso antes de asestar el golpe, si alguien sabe sobre el tema vendría de mucha ayuda.

Por ahora le quitare el tema de la inmortalidad. 
Título: Re:Problema con sistema de daño
Publicado por: Marth en Julio 29, 2014, 03:19:35 PM
Podrías hacer, si lo que te ataca es un proyectil, que se destruya nada más colisionar.
Si no, yo lo que hago es hacer una variable, la cual va decrementandose hasta llegar a 0 y al colisionar hay esta instrucción:

if(!inmune){daño inmune=x}
Título: Re:Problema con sistema de daño
Publicado por: penumbra en Julio 29, 2014, 05:32:23 PM
Tu sistema es algo raro y tiene algunos falllos. Raro porque no estás revisando colisiones para saber si el enemigo atacó al jugador, sino que estás usando un chequeo de distancias, en donde si la distancia es menor a 0.1, consideras que ambas instancias están tan cercanas que haya una colisión inminente.

1. No estoy seguro (no he probado) que distance_to_object(obj_enemigo) regrese valores decimales, ya que me imagino que devuelve un valor en pixels, y veo difícil que exista algo como 0.1 (una décima) de pixel.

2.  No debieras (en CREATE) inicializar inmortal a 1. Se supone que
     
     a) El jugador al comenzar el juego no tiene motivos para ser inmortal
     b) El jugador sólo pasa a modo inmortal DESPUÉS de haber sido dañado, NO ANTES. por lo que en create debe ir inmortal = false

Mi idea:
[STEP]
if ( distance_to object(obj_enemigo) <= 2 ) and (global.inmortal == 0)
{
     global.hp -= 1;                       //primero recibe daño
     global.inmortal = 1                  // luego cambia a inmortal
     alarm[0] = 60
}


EVENTO ALARM[0]
global.inmortal = false
Título: Re:Problema con sistema de daño
Publicado por: king195 en Julio 29, 2014, 06:00:00 PM
Cita de: penumbra en Julio 29, 2014, 05:32:23 PM
Tu sistema es algo raro y tiene algunos falllos. Raro porque no estás revisando colisiones para saber si el enemigo atacó al jugador, sino que estás usando un chequeo de distancias, en donde si la distancia es menor a 0.1, consideras que ambas instancias están tan cercanas que haya una colisión inminente.

1. No estoy seguro (no he probado) que distance_to_object(obj_enemigo) regrese valores decimales, ya que me imagino que devuelve un valor en pixels, y veo difícil que exista algo como 0.1 (una décima) de pixel.

2.  No debieras (en CREATE) inicializar inmortal a 1. Se supone que
     
     a) El jugador al comenzar el juego no tiene motivos para ser inmortal
     b) El jugador sólo pasa a modo inmortal DESPUÉS de haber sido dañado, NO ANTES. por lo que en create debe ir inmortal = false

Mi idea:
[STEP]
if ( distance_to object(obj_enemigo) <= 2 ) and (global.inmortal == 0)
{
     global.hp -= 1;                       //primero recibe daño
     global.inmortal = 1                  // luego cambia a inmortal
     alarm[0] = 60
}


EVENTO ALARM[0]
global.inmortal = false

Si, tienes razón, lo único es que si le quita la vida formaría parte de la condición para volverse inmortal. Ya que del otro lado hay un delay del ataque, es decir, no puede venir y así por tocarme sacarme vida.

Create Event
global.inmortal = false;

Alarm[5]
global.inmortal = false;

Step Event
if (place_meeting(x,y,obj_enemigo)) and (global.inmortal == 0) and (global.hp = global.hp -1) //distance_to_object(obj_enemigo) < 0.01
    {                     
            global.inmortal = 1;                                             
            alarm[5] = 60;
    }

  if (global.inmortal){
        sprite_index = spr_player01_blood;
    }else{
      sprite_index = spr_ninja_prototype; 
  }


Cambie lo de la distancia por que viene a ser lo mismo.

Igual me he fijado que la inmortalidad no hace efecto, el enemigo me saca vida y la inmortalidad no se crea.
Título: Re:Problema con sistema de daño
Publicado por: penumbra en Julio 29, 2014, 06:08:31 PM
Cita de: king195 en Julio 29, 2014, 06:00:00 PM
Igual me he fijado que la inmortalidad no hace efecto, el enemigo me saca vida y la inmortalidad no se crea.
Es que insisto, haces cosas raras. Me parece que estás usando código tanto en el enemigo como en el jugador, cuando sería más fácil unificar el código en una sola instancia. En el último código que pusiste, no hay ninguna instrucción que quite vida al jugador, sin embargo dices que el enemigo te quita vida, entonces meda por pensar que estás haciendo chequeos en donde no se debe

and (global.hp = global.hp -1)

Esta condición no va a funcionar, nunca se va a cumplir, por lo que ese bloque de código NUNCA se ejecutará. Esta no es la manera en que funciona GM ni el evento STEP

CitarLo único es que si le quita la vida formaría parte de la condición para volverse inmortal.

El código que puse hace exactamente eso, si le quita vida se vuelve inmortal. No necesitas usar un IF para preguntar si le quita vida, sino que le quitas vida y luego cambias a modo inmortal.


Título: Re:Problema con sistema de daño
Publicado por: king195 en Julio 29, 2014, 06:23:31 PM
Cita de: penumbra en Julio 29, 2014, 06:08:31 PM
Cita de: king195 en Julio 29, 2014, 06:00:00 PM
Igual me he fijado que la inmortalidad no hace efecto, el enemigo me saca vida y la inmortalidad no se crea.
Es que insisto, haces cosas raras. Me parece que estás usando código tanto en el enemigo como en el jugador, cuando sería más fácil unificar el código en una sola instancia. En el último código que pusiste, no hay ninguna instrucción que quite vida al jugador, sin embargo dices que el enemigo te quita vida, entonces meda por pensar que estás haciendo chequeos en donde no se debe

and (global.hp = global.hp -1)

Esta condición no va a funcionar, nunca se va a cumplir, por lo que ese bloque de código NUNCA se ejecutará

CitarLo único es que si le quita la vida formaría parte de la condición para volverse inmortal.

El código que puse hace exactamente eso, si le quita vida se vuelve inmortal. No necesitas usar un IF para preguntar si le quita vida, sino que le quitas vida y luego cambias a modo inmortal.

Tienes razón funciona, pensaba que global.hp debía contar como una condición por la cual se haría inmortal, no pensé en que podía pasar por la simple cadena  :-\

Igual ahora no cuadra con el delay_attack que tengo, si pongo el global.hp en ambas zonas, en lo de la inmortalidad como en el del delay_attack me bajan ambos la vida. Lo que puedo hacer es que delay forme parte del producto de la inmortalidad y quito la acción de quitarle la vida, voy a probar.

Nada, sigue fallando pienso que debe de ser en algo del enemigo..

if (distance_to_object(obj_player01) < 0.01 and (global.inmortal != 1)){
        global.delay_attack = true;
        global.hp = global.hp -1;
        alarm[1] = 5*room_speed;
                }



Nada, esta resuelto el tema del choque entre inmortal y delay... Una chorradita, igual el delay no se cumple, no hay retraso antes de que se produzca el choque del ataque.

Título: Re:Problema con sistema de daño
Publicado por: manoloon en Febrero 28, 2015, 08:14:59 PM
Te dejo como lo solucione este temita...

En CREATE  --> definimos variable :

Invisible = true // evaluara si esta invisible o no

InvisibleTimer = 60 // el timer para la invisibilidad-- NO USAREMOS ALARM[]

En STEP -->> definiremos los pasos :

// Invisibilidad!!

if Invisible = true {

// aca arranca el timer , con lo cual no usamos ALARM de ninguna manera!

if InvisibleTimer >= 0 {

            sprite_index = sprPlayerInvisible // el sprite definido para el player invisible

            InvisibleTimer -= 1; }

if InvisibleTimer == 0 {

sprite_index = sprPlayer  // el sprite definido como normal para el Player

Invisible = false // volvemos a poner la variable Invisible en false

}

}

De esta manera , cada vez que el objeto Player se crea en pantalla , es inivisible por un tiempo determinado (60 frames en nuestro caso ).

Asi y todo si usas la variable Invisible , para el hit del enemigo.. lo tienes solucionado.. SAludos!
Título: Re:Problema con sistema de daño
Publicado por: bcortesl@gmail.com en Marzo 02, 2015, 03:06:20 PM
Y si usas que el enemigo cuando tu energía sea <=0 el daño del enemigo sea 0?