跳跃速度增加我不知道为什么Libgdx

时间:2018-03-17 11:02:50

标签: java android libgdx

我正在制作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() {

    }
}

1 个答案:

答案 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;

另外,使用整数单位来表示重力和运动速度是很奇怪的。您希望浮点数的精确度能够将这些值调整为感觉良好的值。