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.
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡴⣪⣭⣿⣷⣶⣄⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⠤⢤⢔⡾⣹⣿⣿⣿⣿⣿⣿⣷⡄⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠀⢰⢳⣿⣿⣿⠋⣻⣿⣿⣿⣿⣿⣿⣾⣿⠟⠀⠀⠀
⠀⠀⠀⠀⠀⢀⠔⠁⠀⠀⠀⢸⣼⣷⣻⣧⣴⣿⣏⣿⣿⣿⣿⣿⣿⣿⣶⣶⣦⠤
⠀⠀⠀⠀⢠⠇⠀⠀⠀⠀⠀⠈⢿⣿⣷⣿⣏⡿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠛⠁⠀
⠀⠀⠀⢀⠇⠀⠀⠀⠀⠀⠀⠀⠀⠹⢿⣿⣿⣿⣝⣿⣯⣾⠋⣇⠀⠀⠀⠀⠀⠀
⠀⠀⢠⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⡄⠀⠀⠙⣽⣝⠋⢡⣯⣀⠘⢦⡀⠀⠀⠀⠀
⠀⠀⡷⡁⠀⡄⠀⢠⠻⠀⠀⠀⢸⠙⠀⠀⠀⠙⡇⢹⣧⠛⠂⠀⢤⣉⠢⡀⠀⠀
⡠⢊⠚⢇⣰⢣⠀⡞⠒⠣⠀⠀⠘⡄⠘⠓⠲⢆⣳⠀⠀⣠⣄⣀⣀⠙⢯⣾⡄⠀
⣇⣇⡌⠈⡜⡌⢳⣧⣤⣄⡑⠄⣀⣳⢀⣠⣤⣴⣾⡆⠀⣿⠖⣠⣮⠀⠀⣿⠇⠀
⠈⠛⢇⠀⠿⠷⡘⣿⢙⠿⡏⠀⠈⠉⢻⣻⣿⡏⢹⡟⣢⣿⣟⡻⠋⢀⡴⠁⠀⠀
⠀⠀⠈⠢⢤⣀⣋⡿⢮⡉⠁⠀⠀⠀⠈⢉⣙⠷⠛⠺⣿⣙⣛⠭⠝⠋⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⡩⠒⠶⠲⠞⠓⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣵⣕⣉⣫⣿⣦⠀⠱⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⡾⡿⡟⣻⣿⡏⠱⣮⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⣰⢿⡛⣿⣾⣜⣾⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢀⣴⣿⣾⣿⣿⣿⣿⣿⣿⣾⡏⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢀⣵⣿⣿⣿⣿⣿⣿⣿⡿⣿⣿⣿⣿⣿⣯⣿⣿⠟⠃⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠈⢻⣿⣿⣶⣿⣿⣿⣿⣿⣿⣿⣿⠿⠿⠟⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠈⠻⠿⠿

Creo que falta una parte del código, ¿en dónde se asignan los otros sprites?

#2 Mayo 09, 2020, 04:22:43 AM Ultima modificación: Mayo 09, 2020, 04:36:35 AM por ElvisEnte
Cita de: Clamud en Mayo 09, 2020, 03:41:42 AM
Creo que falta una parte del código, ¿en dónde se asignan los otros sprites?
[gml]//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]

Allí se asignan las animaciones, sprites, de caminar y saltar, también caer. El problema es que incluso agregando la condición de !instance_exists(obj_hitbox_s) o bien !key_sword no funciona.
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡴⣪⣭⣿⣷⣶⣄⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⠤⢤⢔⡾⣹⣿⣿⣿⣿⣿⣿⣷⡄⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠀⢰⢳⣿⣿⣿⠋⣻⣿⣿⣿⣿⣿⣿⣾⣿⠟⠀⠀⠀
⠀⠀⠀⠀⠀⢀⠔⠁⠀⠀⠀⢸⣼⣷⣻⣧⣴⣿⣏⣿⣿⣿⣿⣿⣿⣿⣶⣶⣦⠤
⠀⠀⠀⠀⢠⠇⠀⠀⠀⠀⠀⠈⢿⣿⣷⣿⣏⡿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠛⠁⠀
⠀⠀⠀⢀⠇⠀⠀⠀⠀⠀⠀⠀⠀⠹⢿⣿⣿⣿⣝⣿⣯⣾⠋⣇⠀⠀⠀⠀⠀⠀
⠀⠀⢠⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⡄⠀⠀⠙⣽⣝⠋⢡⣯⣀⠘⢦⡀⠀⠀⠀⠀
⠀⠀⡷⡁⠀⡄⠀⢠⠻⠀⠀⠀⢸⠙⠀⠀⠀⠙⡇⢹⣧⠛⠂⠀⢤⣉⠢⡀⠀⠀
⡠⢊⠚⢇⣰⢣⠀⡞⠒⠣⠀⠀⠘⡄⠘⠓⠲⢆⣳⠀⠀⣠⣄⣀⣀⠙⢯⣾⡄⠀
⣇⣇⡌⠈⡜⡌⢳⣧⣤⣄⡑⠄⣀⣳⢀⣠⣤⣴⣾⡆⠀⣿⠖⣠⣮⠀⠀⣿⠇⠀
⠈⠛⢇⠀⠿⠷⡘⣿⢙⠿⡏⠀⠈⠉⢻⣻⣿⡏⢹⡟⣢⣿⣟⡻⠋⢀⡴⠁⠀⠀
⠀⠀⠈⠢⢤⣀⣋⡿⢮⡉⠁⠀⠀⠀⠈⢉⣙⠷⠛⠺⣿⣙⣛⠭⠝⠋⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⡩⠒⠶⠲⠞⠓⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣵⣕⣉⣫⣿⣦⠀⠱⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⡾⡿⡟⣻⣿⡏⠱⣮⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⣰⢿⡛⣿⣾⣜⣾⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢀⣴⣿⣾⣿⣿⣿⣿⣿⣿⣾⡏⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢀⣵⣿⣿⣿⣿⣿⣿⣿⡿⣿⣿⣿⣿⣿⣯⣿⣿⠟⠃⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠈⢻⣿⣿⣶⣿⣿⣿⣿⣿⣿⣿⣿⠿⠿⠟⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠈⠻⠿⠿

imagino todo eso lo tienes en alguno de event step, y lo peor no vi lo encierres en un bloque de acciones {acciones} Pero, a veces el principal error es que en el step se queda haciendo el cambio de sprite continuo por lo que no avanza del primer subimagen,. por lo cual es bueno siempre comparar si ya posee o no dicho sprite antes de indicar cambiar a ese sprite
ejemplo:
if place_free(x+1, y+1) and sprite_index!=spritePArado then
{sprite_index=spritePArado;}

prueba a ver si se corrige
Atentamente.-
Elvis Kelley
Mi Manual.
Mi canal de Youtube Youtube click aqui
Video tutoriales Game maker