2016-07-07 2 views
0

Я исследовал, как реализовать рудиментарную систему гравитации в slick2d. Вот код, который у меня есть (это функция обновления):Прыжки трудности в Slick2D

if (input.isKeyDown(Input.KEY_UP)) { 
     spressed = true; //Has the UP key been pressed? 
    } 
    if (spressed) { 
     if (!sjumping) {//if so, are we already in the air? 
      Sub_vertical_speed = -1.0f * delta;//negative value indicates an upward movement 
      sjumping = true;//yes, we are in the air 
     } 
     if (sjumping) { //if we're in the air, make gravity happen 
      Sub_vertical_speed += 0.04f * delta;//change this value to alter gravity strength 
     } 
     Sub.y += Sub_vertical_speed; 
    } 
    if (Sub.y == Sub.bottom){//Sub.bottom is the floor of the game 
     sjumping = false;//we're not jumping anymore 
     spressed = false;//up key reset 
    } 

Здесь возникает проблема. Когда я нажимаю клавишу «вверх», спрайт прыгает и идет нормально, но нажатие клавиши «вверх» снова ничего не делает. Первоначально я думал, что это было причиной того, что я не сбросил лишние строки, поэтому я добавил строку, чтобы установить ее в false, но вы все равно можете прыгать только один раз. :/

ответ

1

Похоже, что ваш Sub.y должен быть зажат на вашем Sub.bottom, чтобы он не выходил за него. Попробуйте:

if(Sub.y >= Sub.bottom) { 
    Sub.y = Sub.bottom; 
    sjumping = false; 
    spressed = false; 
} 
+0

Спасибо! Но для людей, которые читают это, это должно быть> =, а не <= – Steampunkery

+0

Да, не понял, что ваше нижнее значение было больше. Я сделал соответствующие изменения. Также отметьте как ответ :) – Steve

0

Я сделал что-то подобное раньше, и мое предположение о том, что Sub.y никогда не равна Sub.bottom. В зависимости от положения y и вертикальной скорости позиция y объекта никогда не будет точно значением Sub.bottom. Нижеприведенный код будет проверять на это:

if (Sub_vertical_speed + Sub.y > Sub.bottom){ //new position would be past the bottom 
    Sub.y = Sub.bottom; 
    sjumping = false; //we're not jumping anymore 
    spressed = false; //up key reset 
}