Высота прыжка персонажа не контролируется

Мы пытаемся сделать игру марио. Однако используемый персонаж поднимается и поднимается, если мы удерживаем клавишу вверх. В отличие от игры марио, в которой он возвращается после определенной высоты. Мы только начали изучать Gml. Пожалуйста, помогите нам с этим. Мы загрузили скрипт, который мы сделали для прыжков и перемещения. Переменные hsp и vsp предназначены для горизонтальной и вертикальной скорости соответственно. grav — для настройки гравитации.

{

    var hsp;
    var vsp;
    var grav;
    var grounded;
    hsp = 0;
    vsp = 0;
    grav = 5;
    grounded = 0;

    key_right = keyboard_check_direct(vk_right); 
    key_left = keyboard_check_direct(vk_left);
    key_up = keyboard_check_direct(vk_up);

    if(key_right)
    {
        if(hsp < 3)
        {
            hsp += 5;
        }
    }

    if(key_left)
    {

        if(hsp > -3)
        {
            hsp -= 5;
        }
    }
    if(key_up)
    {
        vsp = -20;

    }
    vsp += grav;

    if(place_meeting(x + hsp, y, obj_wall))
    {
        while(!place_meeting(x + sign(hsp), y, obj_wall))
        {
            x += sign(hsp);
        }
        hsp = 0;
    }

    x += hsp;

    if(place_meeting(x, y + vsp, obj_wall))
    {
        while(!place_meeting(x, y + sign(vsp), obj_wall))
        {
            y += sign(vsp);
        }
        if(sign(vsp) == 1)
        {
            grounded = 1;
        }
        vsp = 0;
    }
    else
        grounded = 0;



    y += vsp;
}

person Wanming Hu    schedule 15.02.2015    source источник


Ответы (1)


Ваша проблема с кодом:

if(key_up)
{
    vsp = -20;

}
vsp += grav

Что происходит, так это то, что каждый шаг, если нажата клавиша вверх, объект, выполняющий скрипт, будет перемещаться на 20 пикселей вверх. Затем он переместит персонажа вниз на grav пикселя. Поскольку grav всегда равно 5, это приведет к чистому смещению (-20 + 5) = -15, пока нажата клавиша «вверх». Это похоже на то, что вы постоянно (пока нажата кнопка «вверх») прыгаете каждый шаг, а не только один прыжок, а затем позволяете гравитации делать свою работу.


Я думаю, что вам нужно прыгать только в том случае, если у вас есть что-то под собой (с чего можно спрыгнуть). Для этого просто добавьте еще одно условие (проверка того, что вы находитесь поверх чего-то) в оператор if, например...

if ( key_up and place_meeting(x, y+1, obj_wall) )
{
    vsp = -20;

}
vsp += grav

Теперь вы сможете прыгать, только если вы стоите на чем-то, а гравитация будет тянуть вас вниз, если вы находитесь в воздухе.

person PGmath    schedule 16.02.2015