Bueno, primero que nada, buenas, porque ésta es mi primera publicación en éste foro. Había estado desarrollando un juego por casi un año, pero un error grave en un tema del checkpoint y respawn me obligó a hacerlo de nuevo, de 0, hace poco, y en eso estoy. Ahora estoy teniendo un problema con el ataque, em, ¿melee? con un sable. El problema aquí es que hay un script scr_attack, el cual se ejecuta cuando se ejecuta key_sword en el evento step del jugador, pero no se muestra la animación. El código es el siguiente, en el jugador:
Evento create:
[gml]///Initialize variables
grav = 0.2;
hsp = 0;
hsp_carry = 0;
vsp = 0;
movespeed = 3;
jumps = 0;
jumpsmax = 1;
jumpspeed_normal = 6.3;
jumpspeed = jumpspeed_normal;
allow = true;
if (global.checkpointR == room)
{
x = global.checkpointx;
y = global.checkpointy;
}
key_down = 0[/gml]
Evento step:
[gml]//Get player input
key_right = keyboard_check(vk_right);
key_left = -keyboard_check(vk_left);
key_jump = keyboard_check_pressed(ord('Z'));
key_jump_held = keyboard_check(ord('Z'));
key_down = keyboard_check(vk_down);
key_sword = keyboard_check_pressed(ord('X'));
//React to input
move = key_left + key_right;
hsp = move * movespeed;
if (vsp < 10) vsp += grav;
if (place_meeting(x,y+1,obj_block))
{
jumps = jumpsmax;
}
if (key_jump) && (jumps > 0)
{
jumps -= 1;
vsp = -jumpspeed;
}
if (vsp < 0) && (!key_jump_held) vsp = max(vsp,vsp/2);
var hsp_final = hsp + hsp_carry;
hsp_carry = 0;
if (key_sword)
{
scr_attack();
}
//Horizontal Collision
if (place_meeting(x+hsp_final,y,obj_block))
{
while(!place_meeting(x+sign(hsp_final),y,obj_block))
{
x += sign(hsp_final);
}
hsp_final = 0;
}
x += hsp_final;
//Vertical Collision
if (place_meeting(x,y+vsp,obj_block))
{
while(!place_meeting(x,y+sign(vsp),obj_block))
{
y += sign(vsp);
}
vsp = 0;
}
y += vsp;
//Animate
if (move!=0) image_xscale = move;
if (place_meeting(x,y+1,obj_block))
{
if (hsp!=0) && !instance_exists(obj_hitbox_s) sprite_index = spr_player_walk; else sprite_index = spr_player_idle;
}
else
{
if (vsp < 0) && !instance_exists(obj_hitbox_s) sprite_index = spr_player_jump else sprite_index = spr_player_fall;
}[/gml]
Evento draw:
[gml]draw_self();
if sprite_index = spr_player_walk
{
image_speed = 0.1;
}
else if sprite_index = spr_player_a
{
image_speed = 0.4;
}[/gml]
Luego, el script scr_attack:
[gml]sprite_index = spr_player_a;
image_index = 0;
instance_create(x,y,obj_hitbox_s);[/gml]
En el evento create de la hitbox, y para que desaparezca luego de un tiempo:
[gml]image_xscale=obj_player.image_xscale;
existtime=0;
timeexist=0.5[/gml]}
Evento step de la hitbox:
[gml]existtime+=0.03;
if existtime > timeexist
{
instance_destroy();
}
x = obj_player.x;
y = obj_player.y;
image_xscale = obj_player.image_xscale;[/gml]
Probé poner tanto una condición if !key_sword como if !instance_exists(obj_hitbox_s) en los bloques de código de //Animate del jugador, pero no parece haber una forma de hacer que la animación se vea.
Si elimino todo ese bloque de //Animate, la animación se reproduce correctamente.
Evento create:
[gml]///Initialize variables
grav = 0.2;
hsp = 0;
hsp_carry = 0;
vsp = 0;
movespeed = 3;
jumps = 0;
jumpsmax = 1;
jumpspeed_normal = 6.3;
jumpspeed = jumpspeed_normal;
allow = true;
if (global.checkpointR == room)
{
x = global.checkpointx;
y = global.checkpointy;
}
key_down = 0[/gml]
Evento step:
[gml]//Get player input
key_right = keyboard_check(vk_right);
key_left = -keyboard_check(vk_left);
key_jump = keyboard_check_pressed(ord('Z'));
key_jump_held = keyboard_check(ord('Z'));
key_down = keyboard_check(vk_down);
key_sword = keyboard_check_pressed(ord('X'));
//React to input
move = key_left + key_right;
hsp = move * movespeed;
if (vsp < 10) vsp += grav;
if (place_meeting(x,y+1,obj_block))
{
jumps = jumpsmax;
}
if (key_jump) && (jumps > 0)
{
jumps -= 1;
vsp = -jumpspeed;
}
if (vsp < 0) && (!key_jump_held) vsp = max(vsp,vsp/2);
var hsp_final = hsp + hsp_carry;
hsp_carry = 0;
if (key_sword)
{
scr_attack();
}
//Horizontal Collision
if (place_meeting(x+hsp_final,y,obj_block))
{
while(!place_meeting(x+sign(hsp_final),y,obj_block))
{
x += sign(hsp_final);
}
hsp_final = 0;
}
x += hsp_final;
//Vertical Collision
if (place_meeting(x,y+vsp,obj_block))
{
while(!place_meeting(x,y+sign(vsp),obj_block))
{
y += sign(vsp);
}
vsp = 0;
}
y += vsp;
//Animate
if (move!=0) image_xscale = move;
if (place_meeting(x,y+1,obj_block))
{
if (hsp!=0) && !instance_exists(obj_hitbox_s) sprite_index = spr_player_walk; else sprite_index = spr_player_idle;
}
else
{
if (vsp < 0) && !instance_exists(obj_hitbox_s) sprite_index = spr_player_jump else sprite_index = spr_player_fall;
}[/gml]
Evento draw:
[gml]draw_self();
if sprite_index = spr_player_walk
{
image_speed = 0.1;
}
else if sprite_index = spr_player_a
{
image_speed = 0.4;
}[/gml]
Luego, el script scr_attack:
[gml]sprite_index = spr_player_a;
image_index = 0;
instance_create(x,y,obj_hitbox_s);[/gml]
En el evento create de la hitbox, y para que desaparezca luego de un tiempo:
[gml]image_xscale=obj_player.image_xscale;
existtime=0;
timeexist=0.5[/gml]}
Evento step de la hitbox:
[gml]existtime+=0.03;
if existtime > timeexist
{
instance_destroy();
}
x = obj_player.x;
y = obj_player.y;
image_xscale = obj_player.image_xscale;[/gml]
Probé poner tanto una condición if !key_sword como if !instance_exists(obj_hitbox_s) en los bloques de código de //Animate del jugador, pero no parece haber una forma de hacer que la animación se vea.
Si elimino todo ese bloque de //Animate, la animación se reproduce correctamente.