我正在制作2D游戏。我有一个可以移动左,右和跳跃的角色。但每次跳跃都会更快,我不知道为什么。
当我首先开始游戏时,跳跃就可以了。但每次下一次跳跃都会更快。我认为有些事情正在提高速度,但我不知道是什么。
有人可以查看我的代码吗?
这是我的MainCharacter类:
public class MainCharacter {
private static final int GRAVITY = -5;
private static final int MOVEMENT = 5;
private Vector3 position;
private Vector3 velocity;
private Texture character;
public MainCharacter(int x, int y){
position = new Vector3(x,y,0);
velocity = new Vector3(0,0,0);
character = new Texture("character.png");
}
public void update(float dt)
{
if(position.y>50)
velocity.add(0,GRAVITY,0);
velocity.scl(dt);
position.add(0,velocity.y,0);
if(position.y<=50)
position.y=50;
velocity.scl(1/dt);
}
public void moveLeft(){position.x=(position.x-MOVEMENT);}
public void moveRight(){position.x=(position.x+MOVEMENT);}
public void jump(){
if(position.y==50){
position.y=150;
}
}
public Vector3 getPosition(){ return position; }
public Texture getTexture(){ return character; }
}
这是我的PlayState:
public class PlayState extends State {
private Texture bg;
private MainCharacter character;
public PlayState(GameStateManager gsm){
super(gsm);
bg = new Texture("bg.png");
character = new MainCharacter(500,50);
cam.setToOrtho(false,State.WIDTH,State.HEIGHT);
}
@Override
protected void handleInput() {
for(int i=0;i<3;i++) {
if (Gdx.input.isTouched(i)) {
int x = Gdx.input.getX(i);
int y = Gdx.input.getY(i);
if (x < State.WIDTH / 2 && y > State.HEIGHT / 2) {
character.moveLeft();
} else if (x >= State.WIDTH / 2 && y > State.HEIGHT / 2) {
character.moveRight();
} else if (x < State.WIDTH / 2 && y < State.HEIGHT / 2) {
character.jump();
}
}
}
}
@Override
protected void update(float dt) {
handleInput();
character.update(dt);
}
@Override
public void render(SpriteBatch sb) {
sb.setProjectionMatrix(cam.combined);
sb.begin();
sb.draw(bg,0,0);
sb.draw(character.getTexture(), character.getPosition().x,character.getPosition().y);
sb.end();
}
@Override
public void dispose() {
}
}
答案 0 :(得分:0)
在更新方法中,向当前速度添加一些内容,然后按dt缩放新的当前速度。所以你要反复按dt缩放你的速度,这是没有意义的。
如果你想象用一些任意单位来做这件事,那就是这样的:
if(position.y>50)
velocity.add(0,GRAVITY,0); // Velocity is 120 m/s. Add -1 m/s to it (regardless
// of how much time has passed since last frame!) so now
// it is 119 m/s.
velocity.scl(dt); // Scale the velocity by the time passed since last frame, probably
// about 1/60 s, so now the velocity is 119/60 = 1.98 m/s.
现在在下一帧,大约60秒后你再次这样做:
if(position.y>50)
velocity.add(0,GRAVITY,0); // Velocity is 1.98 m/s. Add -1 m/s to it so now it's 0.98m/s.
velocity.scl(dt); // Scale by dt (about 1/60 s), so now the velocity is 0.98/60 = 0.0163 m/s.
此示例将迅速缩小为零,但它可能会以不同的单位增长。
您需要考虑以每秒平方单位为单位的加速度,并在将其加到速度之前将其乘以dt。在将变量添加到位置之前,不应缩放存储在变量中的实际速度。您的更新方法应如下所示:
public void update(float dt)
{
if(position.y > 50)
velocity.add(0, GRAVITY * dt, 0);
position.add(0, velocity.y * dt, 0);
if(position.y <= 50)
position.y = 50;
}
你的移动还需要基于将速度(你的MOVEMENT
变量)乘以dt,所以你的输入控制器应该告诉你的角色类当前是否应该左移,右移,或者根本没有。您可以通过向变量方向-1,1或0(无论何时不触及输入)传递它存储在成员变量direction
中来执行此操作。然后在角色的更新方法中,您可以使用以下内容更新位置:
position.x += direction * MOVEMENT * dt;
另外,使用整数单位来表示重力和运动速度是很奇怪的。您希望浮点数的精确度能够将这些值调整为感觉良好的值。