Вопрос о написании гравитационного кода в 2D игре - PullRequest
0 голосов
/ 29 января 2020

Я новичок и следую учебному пособию по кодированию flappy bird в android studio. У меня есть 2 вопроса по поводу кода ниже. Первый кадр птицы падает на 10 пикселей (= GRAVITY). Затем количество кадров умножается на 10 пикселей каждого кадра, чтобы он падал быстрее с каждым кадром. Но какая польза от speed.scl (1 / dt)? Также возможно я понимаю что-то не так? И почему падение выглядит плавным? Я ожидал бы, что это выглядело более резким, потому что птица перемещается на много пикселей в каждом кадре.

    if(position.y>0){
        velocity.add(0, GRAVITY, 0); // bird falls 15 pixels above ground
    }

    velocity.scl(dt); //multiply gravity with dt (frame) -> gravity gets larger
    position.add(0, velocity.y, 0);

    if(position.y<0){
        position.y=0; // bird doesn't fall through ground
    }

    velocity.scl(1/dt); // what does this do

Полный класс птицы:

private static final int GRAVITY = -10;
private Vector3 position;
private Vector3 velocity;
private Texture bird;

public Bird(int x, int y){
    position = new Vector3(x,y,0);
    velocity=new Vector3(0,0,0);
    bird = new Texture("Flappy-midflap.png");
}

public void update(float dt){
    if(position.y>0){
        velocity.add(0, GRAVITY, 0); // bird falls 15 pixels above ground
    }

    velocity.scl(dt); //multiply gravity with dt (frame) -> gravity gets larger
    position.add(0, velocity.y, 0);

    if(position.y<0){
        position.y=0; // bird doesn't fall through ground
    }

    velocity.scl(1/dt); // what does this do
}

public void jump(){
    velocity.y = 250;
}

public Vector3 getPosition() {
    return position;
}

public Texture getTexture() {
    return bird;
}

1 Ответ

0 голосов
/ 29 января 2020

Прежде всего, dt - это разность времени рендеринга первого и второго кадра. За 1 секунду этот метод рендеринга выполняется примерно 60 раз (что означает частоту кадров в секунду).

Поэтому вам нужно умножить дельту на вашу скорость, чтобы сгладить движение. Пример

First render loop:
Velocity-Y: 250px
dt: 0.018
Result: 4.5px

Second render loop:
Velocity-Y: 240px
dt: 0.025
Result: 4 px

In result this will become 
250 px in 1 second.

If you do not use scale this will become 
First Render Loop: 
Velocity-Y: 250px
dt: 0.018: 
Result: 250px

Second Render Loop:
Velocity-Y: 240px
dt: 0.025
Result: 240px

In result there will be 250 + 240 + .... 10 + 0 px for 1 second
...