Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: LowHertzs en Agosto 02, 2014, 02:40:59 PM

Título: [Solucionado] Bajar vida del enemigo solo si está cerca
Publicado por: LowHertzs en Agosto 02, 2014, 02:40:59 PM
Hola makeros! quiero hacer uso de un script, para que cuando golpee, si el enemigo está "cerca" le quite vida, y si no lo está no le quite nada. La cuestión es que no me funciona, desde el script no se baja la vida del enemigo. Y me salta ERROR para obtener la variable "hp" del "obj_enemy_flame". Este es el código que estoy usando.

if (sprite_index = spr_player_golpe)
    {
    target = instance_nearest(x, y, obj_enemy_flame)
    if (distance_to_object(target) <= 32)
        {
        hp -=1;
        }
    }


Quiero hacerlo con el uso de script, NO QUIERO USAR EL "CHECK COLLISION", puesto que solo quiero que le pueda quitar vida si está pulsando la tecla "F" y no solo con acercarse.

Este es el error que me salta, como si no puede detectar la variable global hp del bicho en cuestión.
___________________________________________
############################################################################################
FATAL ERROR in
action number 1
of  Step Event0
for object obj_player:

Push :: Execution Error - Variable Get -1.hp(100003, -2147483648)
at gml_Script_scr_player_golpe_state (line 6) -         hp -=1;
############################################################################################
--------------------------------------------------------------------------------------------
stack frame is
gml_Script_scr_player_golpe_state (line 6)
called from - gml_Object_obj_player_StepNormalEvent_1 (line 7) -         scr_player_golpe_state();
Título: Re:Bajar vida del enemigo solo si está cerca
Publicado por: Maximo en Agosto 02, 2014, 04:52:04 PM
creo que se cual es tu error.
No puedes modificar la variable hp del enemigo poniéndola en otro objeto, pues ese objeto no tiene la variable hp registrada y te dará error.
Tienes que especificar a que objeto le vas a modificar la variable.
En vez de
hp -= 1
tienes que poner
target.hp -= 1
esto hará que el sistema modifique la variable hp del enemigo
Título: Re:Bajar vida del enemigo solo si está cerca
Publicado por: Guacusio en Agosto 02, 2014, 04:54:13 PM
Cuando pongas un código, tienes que indicar en qué objeto y evento está. Indica también dónde inicializas la variable hp.
Título: Re:Bajar vida del enemigo solo si está cerca
Publicado por: LowHertzs en Agosto 02, 2014, 04:58:25 PM
Yo quiero restarle vida a un objeto desde el mismo script:

En ese caso quedaría así:

if (sprite_index = spr_player_golpe)
    {
    target = instance_nearest(x, y, obj_enemy_flame)
    if (distance_to_object(target) <= 32)
        {
        obj_enemy_flame.hp -=1;
        }
    }

Pero tampoco funciona correctamente.

Porque en cuanto le pego al enemigo un golpe que supuestamente como puse en el codigo resta -1 y el enemigo tiene 6, muere de un golpe.

Además que si pongo varios enemigos repetidos, en cuanto le doy a uno, mata a todos.
Título: Re:Bajar vida del enemigo solo si está cerca
Publicado por: Guacusio en Agosto 02, 2014, 05:06:56 PM
No has indicado en qué evento llamas al script. Puede que tu error sea llamarlo en el evento step. Por otra parte, este código:

obj_enemy_flame.hp -=1;

precisamente afecta a todas las instancias del objeto obj_enemy_flame. ¿Tienes clara la diferencia entre un objeto y una instancia?
Título: Re:Bajar vida del enemigo solo si está cerca
Publicado por: Maximo en Agosto 02, 2014, 05:13:09 PM
lo que tienes que poner quedaría así:

if (sprite_index = spr_player_golpe)
    {
    target = instance_nearest(x, y, obj_enemy_flame)
    if (distance_to_object(target) <= 32)
        {
        target.hp -=1;
        }
    }
porque target es el enemigo mas cerca, al que tu tienes que quitar vida, por lo que si hay mas enemigos solo dañas a ese
Título: Re:Bajar vida del enemigo solo si está cerca
Publicado por: LowHertzs en Agosto 02, 2014, 05:25:34 PM
Cita de: Guacusio en Agosto 02, 2014, 05:06:56 PM
No has indicado en qué evento llamas al script. Puede que tu error sea llamarlo en el evento step. Por otra parte, este código:

obj_enemy_flame.hp -=1;

precisamente afecta a todas las instancias del objeto obj_enemy_flame. ¿Tienes clara la diferencia entre un objeto y una instancia?

Debo de tener una idea poco clara, las instancias desde el poco conocimiento de gm que tengo son propiedades de los objetos no?

Y respecto al otro mensaje de @Maximo tenías razón, me había liado con la guía de GM, y pensaba que tenia que definir el objeto también entre los corchetes, pero claro de esa manera pierde totalmente el sentido, ahora si funciona perfectamente, lo que no entiendo es por qué los mata de un golpe. Supongo que habría que definir que es un valor "relativo" para que no ponga el valor del hp del enemigo en -1 de golpe, si no que vaya restando al valor que ya tiene. Pero no sé como definir relativo en código. Según la guía nada más ponerlo ya es relativo.
Título: Re:Bajar vida del enemigo solo si está cerca
Publicado por: Maximo en Agosto 02, 2014, 05:34:03 PM
Citarlo que no entiendo es por qué los mata de un golpe
creo que el problema está en
if (sprite_index = spr_player_golpe)
esto hace que cada steep que el jugador tenga el sprite spr_player le quite hp al enemigo
Si el sprite "spr_player_golpe" tarda más de 1 steep, por ejemplo, imagínate que tarda 10 steps, quitará 10 hp del enemigo
Título: Re:Bajar vida del enemigo solo si está cerca
Publicado por: LowHertzs en Agosto 02, 2014, 06:00:32 PM
Cita de: Maximo en Agosto 02, 2014, 05:34:03 PM
Citarlo que no entiendo es por qué los mata de un golpe
creo que el problema está en
if (sprite_index = spr_player_golpe)
esto hace que cada steep que el jugador tenga el sprite spr_player le quite hp al enemigo
Si el sprite "spr_player_golpe" tarda más de 1 steep, por ejemplo, imagínate que tarda 10 steps, quitará 10 hp del enemigo

Vale, ahora lo capto, voy a probar a hacerlo de otra manera y comento.

Gracias por vuestra ayuda!.

Era justamente eso, ya lo solucioné añadiéndolo a un evento "release key", gracias!.
Título: Re:[Solucionado] Bajar vida del enemigo solo si está cerca
Publicado por: Guacusio en Agosto 03, 2014, 12:14:38 AM
Cita de: LowHertzs en Agosto 02, 2014, 05:25:34 PM

Debo de tener una idea poco clara, las instancias desde el poco conocimiento de gm que tengo son propiedades de los objetos no?


Más bien es lo contrario: los objetos definen las propiedades de las instancias. Tu código hp-=1 no funcionaba porque lo estabas aplicando a todas las instancias del objeto, por eso Maximo te indicó que lo aplicaras a la instancia específica más cercana en vez de a todas las instancias de tipo obj_enemy_flame. Respecto al por qué el enemigo muere de golpe, Maximo ya te explicó por qué; supuso que tu código estaba en el evento step y eso implica que se ejecuta permanentemente. Esto muestra la importancia de indicar en una pregunta en qué evento colocas el código.