Я хочу, чтобы мой объект (на данный момент прямоугольник) подпрыгнул один раз, чтобы потерять скорость по пути вверх. Когда он почти остановился, я хочу, чтобы он повернул назад и набрал скорость на спуске. Когда он снова упадет на землю, он должен остановиться. Когда я снова нажимаю клавишу, он должен снова сделать то же самое.


Код, который я пытался написать, реализует переменную float gravity = 0.75; и переменную, которая отслеживает скорость float speed = 10;


В то время как скорость больше 1, скорость должна быть вычтена на координату Y прямоугольника, а затем скорость должна стать ниже, так как я умножаю ее на гравитацию, которая меньше 1

else if (keyCode == UP|| key == 'w') {
    while (speed >1 ) { 
      playerYPosition = playerYPosition-speed;
      speed = speed * gravity;
    }

Гравитация становится больше 1, но становится отрицательной, так что число, которое я вычитаю, складывается в финале, и прямоугольник становится меньше. Чтобы набрать скорость, скорость умножается на силу тяжести.

    gravity = -1.25;
    speed = speed * gravity;
    playerYPosition = playerYPosition-speed;

Теперь скорость должна быть около -1,2 ..., поэтому она меньше -1, и это while(...) должно работать. Опять же, он должен со временем набирать скорость, пока не достигнет начальной скорости, просто отрицательной и, следовательно, отправной точки.

while (speed < -1 && speed > -10) {
      playerYPosition = playerYPosition-speed;
      speed = speed * gravity;

Затем сила тяжести снова должна снизиться до 0,75, а скорость - до 10.

gravity = 0.75;
speed = 10;

Вместо этого прямоугольник просто постоянно подпрыгивает (я думаю) на 10 пикселей, не более того.

float gravity = 0.75;
float speed = 10;

else if (keyCode == UP|| key == 'w') {
    while (speed >1 ) { 
      playerYPosition = playerYPosition-speed;
      speed = speed * gravity;
    }
    gravity = -1.25;
    speed = speed * gravity;
    playerYPosition = playerYPosition-speed;

    while (speed < -1 && speed > -10) {
      playerYPosition = playerYPosition-speed;
      speed = speed * gravity;
    }
    gravity = 0.75;
    speed = 10;
3
Lukas 30 Дек 2019 в 18:31
Почему speed = speed * gravity;? В свободном падении скорость увеличивается линейно с постоянным наклоном.
 – 
John Coleman
30 Дек 2019 в 18:44
speed = speed * gravity; должен все время немного увеличивать скорость, чтобы объект, который падает, чем дольше он падает, тем быстрее становится.
 – 
Lukas
30 Дек 2019 в 18:48
3
Но - это физически нереально, и это именно та проблема, о которой вы говорите. Я рекомендую книгу Дэниела Шиффмана «Природа кода», чтобы узнать, как справиться с ускорением силы тяжести в обработке. Есть несколько хороших видеороликов на Youtube, основанных на природе кода. Ускорение должно быть добавлено к скорости, а не умножено на скорость.
 – 
John Coleman
30 Дек 2019 в 18:55

1 ответ

Лучший ответ

Если вы используете цикл while для вычисления позиции Y, вы не сможете визуализировать симуляцию прыжка, поскольку все математические вычисления будут вычисляться в одном кадре. Чтобы выполнить это физическое моделирование прыжка, вам понадобится переменная, представляющая землю (которая является вашей начальной переменной Y), а также, как только ваш игрок щелкнет, вам нужно будет указать переменной скорости вашу полную скорость, а затем каждый кадр уменьшать ее. по величине вашей гравитации, проверяя каждый кадр, если вы еще не достигли земли. Вот пример, который я написал, чтобы продемонстрировать это, я попытался сохранить ваши имена переменных:

final float gravity = 0.5; 
final float jmp_speed = 10; //the speed which the square is going to jump
float speed = 0; //the actual speed every frame
final float ystart = 280; //the initial Y position ( which also represent the Y of the ground )
float playerYPosition = ystart; //give the player the Y of the ground on start

void setup(){
  size(300,300);
}

void keyPressed() {
    //also check that the player is on ground before jumping
   if( (keyCode == UP || key == 'w') && (playerYPosition == ystart) ) 
    {
      speed=-jmp_speed; //when the player press jump and he is on ground we give speed the max value
    }
}

void draw(){

    background(150);
    rect(150,playerYPosition,10,10);

    //this code will be executed every frame
    //check if the player Y position won't hit the ground if we increment it by speed
      if(playerYPosition+speed < ystart)
      {
        playerYPosition+=speed;
        speed+=gravity; //increment speed by gravity ( will make speed value go from negative to positive slowly)
      }
      else
      {
        //if the player is gonna hit the ground the next frame

        playerYPosition = ystart; // put back the player on ground
        speed=0; // make the speed 0
      }  
}
5
YOUSFI Mohamed Walid 31 Дек 2019 в 13:35