Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: wast en Noviembre 11, 2018, 06:55:38 PM

Título: Personaje estático mientras esta en el aire.
Publicado por: wast en Noviembre 11, 2018, 06:55:38 PM
Como podría hacer que mi personaje no se mueva en dirección horizontal o pudiera moverse solo un poquito mientras salta? He intentado varias veces, pero se queda flotando reproduciendo la animación de saltar mientras se mueve, en vez de estar reproduciendo la de caer.
La animación de caer solo se reproduce si salto, y no me muevo en horizontal.

PD: Soy nuevo.
Título: Re:Personaje estático mientras esta en el aire.
Publicado por: bygdle en Noviembre 11, 2018, 07:13:49 PM
(https://dl.dropboxusercontent.com/s/2bm6rxrxtxd61tp/error.png?dl=0)
Título: Re:Personaje estático mientras esta en el aire.
Publicado por: elmmertonw en Noviembre 12, 2018, 02:36:21 AM
Cita de: wast en Noviembre 11, 2018, 06:55:38 PM
Como podría hacer que mi personaje no se mueva en dirección horizontal o pudiera moverse solo un poquito mientras salta? He intentado varias veces, pero se queda flotando reproduciendo la animación de saltar mientras se mueve, en vez de estar reproduciendo la de caer.
La animación de caer solo se reproduce si salto, y no me muevo en horizontal.

PD: Soy nuevo.
Lo que pude entender es lo siguiente
1.- estas haciendo un juego plataforma estilo mario bros
2.- que cuando salta tu personaje se mueve como si caminara en el laire en ves de saltar
3.- hay falta de informacion como si el personaje tiene una animacion de salto separa con la de caida y de que variable estes usando para hacer lo de la gravedad gravity o el valor de .

Posible solución

una variable de salto la cual dice si el personaje esta en el aire o esta tocando el suelo
esa una variable boolean
y si utiliza gravity para crear la gravedad  cuando la vspeed sea mayor a 0 se considera que el personaje esta cayendo por lo tanto podría hacer una condición con vspeed o era hspeed :V me confunde esas dos haha

de toda manera es necesario que tu pase el codigo que utuliza o un gif por que una imagen no seria muy demostrativa

espero haberte ayudado.

PD: Bienvenido a la comunidad
PDD: Casi no entiendo nada de el punto planteado se mas especifico para la proxima.
PDDD:Que divertido es escribir posdata XD
Título: Re:Personaje estático mientras esta en el aire.
Publicado por: wast en Noviembre 12, 2018, 03:58:51 PM
Hola, perdón por mi escasez de información. Mi Pj tiene 4 eventos:
Yo lo que quiero hacer es que se mueva poco mientras esta en el aire, no que se vaya deslizando. Y además que se reproduzca la animación de caída.

Sí estoy haciendo un juego de plataformas.

Create:

sprite_index = sprite2;
image_speed = 1;
image_index = 0;

x = 512;
y = 416;

v = 7;


EVENTO STEP:
if keyboard_check(vk_right){
   direction = 0;
   speed = v;
   

}
//Izquierda
if keyboard_check(vk_left){
   direction = 180;
   speed = v
   
}
//Animacion quieto
if speed = 0 {
   sprite_index = sprite2;

   

}
//Animacion corriendo der
if speed > 0 && direction = 0{
sprite_index = main_char_right;   
}
//Animacion corriendo izq
if speed > 0 && direction = 180{
sprite_index = main_char_left;   
}

//pararse
if keyboard_check_released(vk_right){
   sprite_index = sprite2;
   speed = 0;
   image_speed = 1;
   
}
//pararse
if keyboard_check_released(vk_left){
   sprite_index = sprite2;
   speed = 0;
   image_speed = 1;
}
//gravedad
if place_empty(x,y+1){
sprite_index = main_char_up;
gravity = 1;
}
else{
gravity = 0;
}

//saltar
if keyboard_check_pressed(vk_up) and not place_free(x, y + 1) {
vspeed -= 15;
}



//para que se reproduzca la animación de caer.
switch (vspeed){

case +15:
sprite_index = main_char_fall
break;

case +14:
sprite_index = main_char_fall
break;

case +13:
sprite_index = main_char_fall
break;

case +12:
sprite_index = main_char_fall
break;

case +11:
sprite_index = main_char_fall
break;

case +10:
sprite_index = main_char_fall
break;

case +9:
sprite_index = main_char_fall
break;

case +8:
sprite_index = main_char_fall
break;

case +7:
sprite_index = main_char_fall
break;

case +6:
sprite_index = main_char_fall
break;

case +5:
sprite_index = main_char_fall
break;

case +4:
sprite_index = main_char_fall
break;

case +3:
sprite_index = sprite2
break;

case +2:
sprite_index = sprite2
break;

case +1:
sprite_index = sprite2
break;


}


COLISION CON PARED
move_contact_solid(direction, 12);
vspeed = 0; 


ANIMATION END
if sprite_index = main_char_up{
   
   image_speed = 0;
   
   }




pd: Soy nuevo en este motor, y aún me estoy acostumbrando al gml, debido a que he programado yo mismo con mis actuales pésimos conocimientos, probablemente estén mal optimizados, pero funcionan


Título: Re:Personaje estático mientras esta en el aire.
Publicado por: bygdle en Noviembre 12, 2018, 09:02:37 PM

Pregunta: El sprite main_char_fall, ¿en qué momento debe estar? ¿cuando el personaje está saltando (yendo hacia arriba), cuando está cayendo (yendo hacia abajo), o ambas (basta con que se mueva verticalmente)?
Título: Re:Personaje estático mientras esta en el aire.
Publicado por: wast en Noviembre 12, 2018, 09:45:49 PM
El sprite main_char_fall, és la animación de cuando cae.
El sprite main_char_up és la animación de el personaje cuando salta.

El sprite main_char_fall tiene que estar cuando esta cayendo.

[user]NiuWeb[/user]
Título: Re:Personaje estático mientras esta en el aire.
Publicado por: bygdle en Noviembre 12, 2018, 10:14:25 PM
Primero que todo, me parece que tu código está bastante desorganizado en cuanto a la asignación de los sprites, vamos por ahí primero. La idea es simple; organizar el sprite que se asignará basándose en "casos" opuestos; véase, si está en el aire o no, si se mueve arriba o abajo, izquierda o derecha, etc.
[gml]
//Primer caso: ¿está en  el aire o no?
if place_empty(x, y + 1) {
    //Si está en el aire
    if vspeed < 0 { //Si la velocidad es negativa (o sea, si va pa'rriba)
        sprite_index = main_char_up;
    }
    else if vspeed > 3 { //Si la velocidad es positiva y mayor que tres (o sea, si va pa'bajo)
        sprite_index = main_char_fall;
    }
}
else {
    //Si no está en el aire
    if hspeed == 0 { //Si el player está quieto
        sprite_index = sprite2; //Sprite de quieto
    }
    else if hspeed > 0 { //Si va pa'la derecha
        sprite_index = main_char_right;
    }
    else { //Si va pa'la izquierda
        sprite_index = main_char_left;
    }
}
[/gml]

Ahora bien, si lo que quieres es que el personaje reduzca su velocidad horizontal mientras esté en el aire, basta con que modifiques el código así:
[gml]
var vv = v; //La velocidad horizontal (uso otra variable para no modificar el valor real de la velocidad)
if (sprite_index == main_char_up) or (sprite_index == main_char_fall) { //Si el personaje está en el aire
    vv = v/3; //La velocidad será un tercio de la original
}
if keyboard_check(vk_right) {
    hspeed = vv; //Es mejor que no uses 'speed' para evitar problemas con 'vspeed'.
    /*
    Tampoco vamos a usar 'direction'; es innecesaria en este caso y, de nuevo, podría
    dar problemas con 'vspeed'. En su lugar, es mejor ponerle signo negativo o positivo
    a la velocidad. Si es positiva va pa'la derecha, y si es negativa, pues pa'la izquierda
    */
}
//Izquierda
if keyboard_check(vk_left){
    hspeed = -vv; //Aquí se pone negativo porque va pa'la izquierda
}[/gml]

Y listo, debería funcionar.

PD: Ese código es todo lo que necesitas en step, puedes reemplazar lo que ya tienes por esto, a excepción obviamente del código que genera la caída, la gravedad y el salto (sin dejar nada relacionado a los sprites aparte del código que te puse arriba).
Título: Re:Personaje estático mientras esta en el aire.
Publicado por: wast en Noviembre 13, 2018, 09:46:11 PM
Peró el personaje sigue deslizandose de izquierda a derecha, quiero decir, prefereria que cayera más rápido.

[user]NiuWeb[/user]
Título: Re:Personaje estático mientras esta en el aire.
Publicado por: bygdle en Noviembre 13, 2018, 09:49:56 PM
Solo aumenta la gravedad y la velocidad de salto.
Título: Re:Personaje estático mientras esta en el aire.
Publicado por: dixon2010 en Noviembre 14, 2018, 06:26:03 PM
Hola gusto en saludarle.

Algo así?


Este es el nuevo código
[CREATE EVENT]
b2=0
s=0
d=1


[STEP EVENT]

//movimiento vertical con salto.
b2p=(b2=0)*keyboard_check(38)
b2=keyboard_check(38)
if(b2p*(s=0)*place_meeting(x,y+10,object1))s=25
if(s)s-=1+place_meeting(x,y-1,object1)*2
if(s<0)s=0
vs=10-s
while(place_meeting(x,y+vs,object1))vs-=1*sign(vs)
y+=vs

//movimiento horizontal
b1=keyboard_check(37)
b3=keyboard_check(39)
control=(b1+b3=1)
if(control)d=1-2*b1
v=control*d*(6-(6/1.5)*(vs!=0))
//COLISIÓN
while(place_meeting(x+v,y,object1))v-=1*sign(v)
x+=v

//imágenes
sprite_index=sprite2
if(!place_meeting(x,y+2,object1))
{
if(vs<0)sprite_index=main_char_up else sprite_index=main_char_fall
}
if(abs(v) && (vs=0))sprite_index=main_char_right

image_xscale=d


Y no tienes que usar el evento colisión.
Ojo el object1 debe ser reemplazado por el objeto piso o pared