关于在2D游戏中编写重力代码的问题
Question about writing gravity code in a 2D game
我是初学者,正在按照教程在 android studio 中编写 flappy bird。我对下面的代码有 2 个问题。第一帧鸟落下 10 像素(=重力)。然后帧数乘以每帧 10 个像素,因此他每帧下降得更快。但是velocity.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
满鸟class:
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;
}
首先dt是delta time渲染第一帧和第二帧的渲染时间差。在 1 秒内,此渲染方法执行了 60 次(即每秒帧数)。
因此,您应该将 delta 乘以您的速度以平滑移动。
示例
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
我是初学者,正在按照教程在 android studio 中编写 flappy bird。我对下面的代码有 2 个问题。第一帧鸟落下 10 像素(=重力)。然后帧数乘以每帧 10 个像素,因此他每帧下降得更快。但是velocity.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
满鸟class:
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;
}
首先dt是delta time渲染第一帧和第二帧的渲染时间差。在 1 秒内,此渲染方法执行了 60 次(即每秒帧数)。
因此,您应该将 delta 乘以您的速度以平滑移动。 示例
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