Hola, soy nuevo en esto de la programación de videojuegos y estoy siguiendo un tutorial en Youtube de "TheMontyDrake" sobre como hacer un juego de plataformas, he seguido bien los dos primeros videos pero ahora viene mi problema: Cuando salto y caigo al suelo se queda clavado el Personaje, un par de sprites o así, pero no siempre. He estado revisando mil veces el codigo que sale en el tutorial y lo tengo igual y en el video todo le va bien y a mi me se clava el Personaje >:(. Haber si alguien me puede ayudar.

Este es el codigo de movimiento del personaje, haber si alguien ve algún error, o puede que el error esté en otro sitio.


///Desplazamiento
var KeyLeft, KeyRight, KeyJump, KeyJumpRelease;

KeyLeft        = -keyboard_check (vk_left);
KeyRight       = keyboard_check (vk_right);

KeyJump        = keyboard_check_pressed(ord('X'));
KeyJumpRelease = keyboard_check_released(ord('X'));

//Comprobación de colisiones
intColLeft  = place_meeting(x - 1, y, objBlock);
intColRight = place_meeting(x + 1, y, objBlock); //Para que se pare cuando hay un Block
bolGround   = place_meeting (x, y + 1, objBlock); //Para saber si Player tiene un Block debajo

intMove = KeyLeft + KeyRight;

//Definir aceleración y fricción en función del medio
if (!bolGround)
{
    intTempAcc = intAirAcc;
    intTempFric = intAirFric;
}
else
{
    intTempAcc = intGroundAcc;
    intTempFric = intGroundFric;
}

//Velocidad horizontal
if (intMove != 0) intVX = scrApproach(intVX, intVXMax * intMove, intTempAcc);
else intVX = scrApproach(intVX, intVXMax * intMove, intTempFric);

//Velocidad Vertical
if (!bolGround)
{
    intVY = scrApproach(intVY, intVYMax, intGravityNorm); //Caída libre
}

//Salto
if (KeyJump && bolGround) intVY = -intVYMax;

//Colision horizontal (X)
repeat(abs(intVX))
{
    if (!place_meeting(x + sign(intVX), y, objBlock))
    {
        x += sign(intVX)
    }
    else
    {
        intVX = 0;
        break;
    }


//Colisión Vertical (Y)
repeat(abs(intVY))
{
    if (place_meeting(x, y + sign(intVX), objBlock))
    {
        intVY = 0;
        break;
    }
    else y += sign(intVY)
}



Gracias. Un saludo :)

Cita de: MetalGore en Mayo 07, 2017, 07:54:14 PM
Hola, soy nuevo en esto de la programación de videojuegos y estoy siguiendo un tutorial en Youtube de "TheMontyDrake" sobre como hacer un juego de plataformas, he seguido bien los dos primeros videos pero ahora viene mi problema: Cuando salto y caigo al suelo se queda clavado el Personaje, un par de sprites o así, pero no siempre. He estado revisando mil veces el codigo que sale en el tutorial y lo tengo igual y en el video todo le va bien y a mi me se clava el Personaje >:(. Haber si alguien me puede ayudar.

Este es el codigo de movimiento del personaje, haber si alguien ve algún error, o puede que el error esté en otro sitio.


///Desplazamiento
var KeyLeft, KeyRight, KeyJump, KeyJumpRelease;

KeyLeft        = -keyboard_check (vk_left);
KeyRight       = keyboard_check (vk_right);

KeyJump        = keyboard_check_pressed(ord('X'));
KeyJumpRelease = keyboard_check_released(ord('X'));

//Comprobación de colisiones
intColLeft  = place_meeting(x - 1, y, objBlock);
intColRight = place_meeting(x + 1, y, objBlock); //Para que se pare cuando hay un Block
bolGround   = place_meeting (x, y + 1, objBlock); //Para saber si Player tiene un Block debajo

intMove = KeyLeft + KeyRight;

//Definir aceleración y fricción en función del medio
if (!bolGround)
{
    intTempAcc = intAirAcc;
    intTempFric = intAirFric;
}
else
{
    intTempAcc = intGroundAcc;
    intTempFric = intGroundFric;
}

//Velocidad horizontal
if (intMove != 0) intVX = scrApproach(intVX, intVXMax * intMove, intTempAcc);
else intVX = scrApproach(intVX, intVXMax * intMove, intTempFric);

//Velocidad Vertical
if (!bolGround)
{
    intVY = scrApproach(intVY, intVYMax, intGravityNorm); //Caída libre
}

//Salto
if (KeyJump && bolGround) intVY = -intVYMax;

//Colision horizontal (X)
repeat(abs(intVX))
{
    if (!place_meeting(x + sign(intVX), y, objBlock))
    {
        x += sign(intVX)
    }
    else
    {
        intVX = 0;
        break;
    }


//Colisión Vertical (Y)
repeat(abs(intVY))
{
    if (place_meeting(x, y + sign(intVX), objBlock))
    {
        intVY = 0;
        break;
    }
    else y += sign(intVY)
}



Gracias. Un saludo :)

Tambien he seguido sus tutoriales de plataformas, pero si el problema no esta en los códigos, puede ser en el sprite, ya que monty usa un personaje animado que cambia la posicion de sus pixeles por cada fotograma, también puede ser por la colisión que le has puesto al sprite o su centrado, yo ya termine sus tutoriales y hay que adaptar el sprite a sus códigos, buena suerte  ;).

Gracias Naitsabes0 :). El sprite que yo utilizo también tiene animación y los pixeles cambian. Lo que me comentas de la colisión del sprite no se lo que es :-[, perdona pero soy muy novato en esto. ¿Como adaptaste tus sprites a su codigo?.

Gracias. Seguiré intentandolo.

creo que copiaste mal ~~( aunque creo no estoy seguro no conosco el codigo) estas aplicando la fuerza horizontal en vez de la vertical
"if (place_meeting(x, y + sign(intVX), objBlock))" (se encuentra en las ultimas lineas)
deberias poner(lo que esta en rojo) intVY

Muchas Gracias wilodxd :D. Era eso!!!!!, Joder, lo había revisado miles de veces y no lo había visto :-[, seré cazurro. Muchas gracias y la próxima vez estaré más atento al copiar :P.

Gracias y un saludo. :)