Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mensajes - ElvisEnte

1
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.
2
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.