Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: carras en Febrero 29, 2016, 07:42:52 AM

Título: Problema con cambio de animaciones
Publicado por: carras en Febrero 29, 2016, 07:42:52 AM
Hola chicos estoy preparando un runner. Mi personajes corre, salta y hace un slide por suelo para pasar por debajo de objetos.
Tanto la animacion de salto como la de carrera van perfectas pero tnego problema al ahora de meter la animacion de slide. Cuando pulso la tecla para hacer el slide mete la animacion de slide y a veces va perfecto y aveces al siguiente frame vuelve a la animacion de carrera. Entiendo que pasa por que para la animacion de carrera compruebo que esta sobre el suelo y por eso me da problemas pero llevo un rato intentado corregir el error y no encuentro solucion. Este es mi codigo:

///animaciones
if vsp <0{
    sprite_index=s_salto
    image_speed=0.5

    if image_index >= image_number-1{
        image_speed = 0
}
}

if place_meeting(x,y+1,o_suelo)and slide=0{
    sprite_index=s_carrera
    image_speed=1
}

if place_meeting(x,y+1,o_suelo) and keyboard_check_pressed(vk_down){
    slide=1
    sprite_index=s_slide
    image_speed=0.7
   
}
if sprite_index=s_slide and image_index >= image_number-1{
        slide=0
        }
Título: Re:Problema con cambio de animaciones
Publicado por: Jucarave en Febrero 29, 2016, 03:48:56 PM
Probablemente sea mejor que manejes las animaciones con una maquina de estados y de ahí derecho puedes manejar mejor los cambios de estados, por ejemplo, normalmente uno tiene variables como "jumping" y "sliding" que se hacen true o false y luego se selecciona el sprite acorde con unas reglas, el problema es que se se añaden muchas esas reglas se vuelven muy complejas y probablemente causen errores:

Primero defines los estados en un macro (preferiblemente):

[gml]
STANDING=0;
RUNNING=1;
JUMPING=2;
SLIDING=3;
[/gml]

Luego en el create lo inicias en STANDING:

[gml]
state = STANDING;
[/gml]

De ahí puedes hacer checks de por ejemplo solo puede correr si esta quieto o solo puede hacer slide si esta corriendo:

[gml]
if (keyboard_check(vk_right) && state == STANDING){ //No tan sencillo como esto pero es la idea principal
    state = RUNNING;
}

if (keyboard_check(vk_down) && state == RUNNING){
    state = SLIDING;
}
[/gml]

Por ultimo en el evento end_step seleccionas el sprite de acuerdo al estado:

[gml]
switch (state){
    case STANDING:
        sprite_index = spr_stand;
        break;

    case RUNNING:
        sprite_index = spr_running;
        break;

    case SLIDING:
        sprite_index = spr_slide;
        break;
}
[/gml]

De este modo no debería ponerte tanto problema al cambiar de sprites.

Saludos