Estoy aprendiendo a programar y estoy haciendo un pequeño juego de plataformas para practicar y tal, pero tengo un problema y es que, no consigo hacer que el personaje salte con la animación de salto. Tengo 3 bloques en step que son los y uno en create con lo sig comandos siguientes:


CREATE

mov = 0
v = 4;
vv = 0;
vh = 0;
vsalto = -10




STEP

Declarar Movimiento

der = keyboard_check(ord ("D"))
izq = -keyboard_check(ord ("A"))
salto = keyboard_check_pressed(ord("W"))

mov = der + izq
vh = v * mov

Velocidad Vertical

///Gravedad

if (vv < 30) && !place_meeting(x,y+1,object1){

vv=vv+1

}

//Detecta la colisión con el suelo

if (place_meeting(x,y+vv,object1)){

while(!place_meeting(x,y+sign(vv),object1 )){

y = y + sign(vv)}


vv = 0
}

//salto

if (place_meeting(x,y+1,object1)&& salto){

vv = vsalto

}


//Declara el movimiento vertical a la y
y = y + vv


Velocidad horizontal

///Colisión horizontal


if place_meeting(x + vh,y,object1){

while(!place_meeting(x+sign(vh),y,object1 )){

x = x + sign(vh)
}

vh = 0

}

//Animación horizontal
if vh == +4{
image_xscale = 1
sprite_index = spr_andando
image_speed = 0.3}
if vh == 0{
sprite_index = sprite0
image_speed = 0.5
}
if vh == -4{
image_xscale = -1
sprite_index = spr_andando
image_speed = 0.3
}


///Estableciendo variables

x = x + vh; ///x tendra el valor de vh







Aclarar que sprite0 es el spite en el que esta el personaje parado y el sprite1 es el bloque.

Podrias crear una nueva variable que controle cuando se esta colisionando o no con el suelo, y usarla en conjunto con otras variables para cambiar de sprites.
Si es falsa esta en el aire y cambias al sprite correspondiente, y si es verdadera usas los sprites para cuando esta quieto y caminando (dependiendo del valor de mov)

Cita de: 3dgeminis en Noviembre 03, 2018, 06:43:49 PM
Podrias crear una nueva variable que controle cuando se esta colisionando o no con el suelo, y usarla en conjunto con otras variables para cambiar de sprites.
Si es falsa esta en el aire y cambias al sprite correspondiente, y si es verdadera usas los sprites para cuando esta quieto y caminando (dependiendo del valor de mov)

He intentado como buenamente he podido lo de la variable, pero que va, no soy capaz de sacarlo (ya te digo estoy aprendiendo y se me escapan muchas cosas)

al cambiar el sprite_index cambias su raiz, al cambiar la subimagen haces una animacion, la variable image_index que por hecho es la que por predeterminado tiene el draw_self() es sumada por cada paso con image_speed la cual varia segun vos, ejemplo en 30 pasos hay un sprite del personaje moviendose con 5 imagenes en la animacion, el puesto que es que comienza en 1, la velocidad normal es 1, las imagenes que aumenta (image_index += image_speed pero no se muestra) si esta en 2 se salta una imagen y no te das cuenta a veces, como para detenerla la colocas en 0 ya que 1+0 = 1 (image_index += image_speed)... No se a que te referis con el control de animaciones primero controla todo tu codigo en mecanica del juego luego ajusta la animacion no querras darle un nuevo toque y tendras que empezar de nuevo  ;D

el problema es copier el codigo de algun lado sin entenderlo primero, he visto ese formato de codigo para plataformas en muchos lados, si lo copiaste de la seccion de scripts tiene muchos bugs, yo lo implemente y me funciono, luego que regrese del trabajo posteo como lo deje para que veas donde va la animacion de salto, recuerdo que cuando se esta en el aire o no se esta tocando el bloque o la pared cada step se debe de poner la animacion de salto, en mi caso yo solo checo eso 1 sola vez, ya que si esta en el aire y lo cambio no tiene caso Volver a cambiarlo o setearlo de nuevo mientras sigo en el aire.
Es Mejor No Saber Porque Funciona, Que Saber El Porque No Funciona...
Tienes alguna duda con "Game Design" o de videojuegos en general, contactamente mas facil en twitter @pavulzavala

#5 Noviembre 08, 2018, 10:30:14 PM Ultima modificación: Noviembre 08, 2018, 10:40:21 PM por dixon2010
Intenta con este y avísame su funcionamiento.
donde object1 es el suelo y/o la pared

[EVENT CREATE]

s=0;


[EVENT STEP]

b2=keyboard_check(38)
if(b2*(s=0)*place_meeting(x,y+10,object1))s=20
if(s)s-=1
vs=10-s
while(place_meeting(x,y+vs,object1))vs-=1*sign(vs)
y+=vs


Dios nos ayuda y nos da sabiduría para vivir. Cáda código es una obra maestra que hay que respetar aunque exista un código mas eficiente y sencillo.