繁体   English   中英

LIBGDX平滑玩家运动

[英]LIBGDX Smoothing player movement

我的游戏(跳跃式游戏)有问题,当玩家摔倒或向左/向右移动时,它不平滑,我可以多次看到子画面(如某种阴影)。 搜索互联网后,我认为这与deltaTime有关,但是我找不到解决方法。 播放屏幕中的render方法的代码为:

@Override
public void render(float delta) {
    Gdx.gl.glClearColor(0,0,0,1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    //game running
    if(state == RUNNING){
        //make world step
        doPhysicsStep(delta);
    //update player and camera
        player.update(delta);
    if(player.getBody().getPosition().x < bottomLeft.x)
        player.getBody().setTransform(bottomRight.x, player.getBody().getPosition().y, player.getBody().getAngle());
    else if(player.getBody().getPosition().x > bottomRight.x)
        player.getBody().setTransform(bottomLeft.x, player.getBody().getPosition().y, player.getBody().getAngle());

    camera.position.y =player.getBody().getPosition().y > camera.position.y ? player.getBody().getPosition().y: camera.position.y;
    camera.update();
    levelGenerator.generate(camera.position.y + camera.viewportHeight /2,camera.position.y - camera.viewportHeight /2);
    }

    //game ended
    if(player.getBody().getPosition().y< camera.position.y - camera.viewportHeight/2 -player.HEIGHT/2 && state == RUNNING){
        gameOverScreen.updateScore(score.getText().toString().substring(7));
        state = END;
    }
    if(state == END){
        gameOverScreen.setVisible(true);
    }
    //drawing game
    batch.setProjectionMatrix(camera.combined);
    batch.begin();
    renderBackground();
    renderPlatform();
    renderPlayer();
    Assets.sparks.draw(batch, delta);
    batch.end();
}

public void renderPlatform(){
    //world.getBodies(tmpBodies);
    //for(Body body : tmpBodies)
    //  if(body.getUserData() != null && body.getUserData() instanceof Platform)
            for(int i=0;i<platforms.size();i++){

            Body body = platforms.get(i).getBody();
            Sprite sprite = platforms.get(i).getSprite();
            sprite.setPosition(body.getPosition().x - sprite.getWidth()/2, body.getPosition().y - sprite.getHeight()/2);
            sprite.setRotation(body.getAngle() * MathUtils.radiansToDegrees);
            sprite.draw(batch);
        }
}

public void renderPlayer(){
    world.getBodies(tmpBodies);
    for(Body body : tmpBodies)
        if(body.getUserData() != null && body.getUserData() instanceof Player){
            Player player = (Player) body.getUserData();
            Sprite sprite = player.getSprite();
            sprite.setPosition(body.getPosition().x - sprite.getWidth()/2, body.getPosition().y - sprite.getHeight()/2);
            //sprite.setRotation(body.getAngle() * MathUtils.radiansToDegrees);
            sprite.draw(batch);
            if(player.isPlayEffect()){
                Assets.sparks.setPosition(body.getPosition().x , body.getPosition().y - sprite.getHeight()/2);
                Assets.sparks.setDuration(200);
                Assets.sparks.start();
            }

        }
}

public void renderBackground(){
    world.getBodies(tmpBodies);
    for(Body body : tmpBodies)
        if(body.getUserData() != null && body.getUserData() instanceof Background){
            Background background = (Background) body.getUserData();
            Sprite sprite = background.getSprite();
            //sprite.setPosition(body.getPosition().x - sprite.getWidth()/2, body.getPosition().y - sprite.getHeight()/2);
            sprite.setBounds(bottomLeft.x, camera.position.y - camera.viewportHeight /2, camera.viewportWidth, camera.viewportHeight);
            sprite.draw(batch);
        }

}
private void doPhysicsStep(float deltaTime) {
    // fixed time step
    // max frame time to avoid spiral of death (on slow devices)
    float frameTime = Math.min(deltaTime, 0.05f);
    accumulator += frameTime;
    while (accumulator >= TIMESTEP) {
        world.step(TIMESTEP, VELOCITYITERATIONS, POSITIONITERATIONS);
        accumulator -= TIMESTEP;
    }
}

和播放器更新:

public void update(float delta) {
    stateTime += delta;
    if(state==JUMP){
        sprite.setRegion(jump.getKeyFrame(stateTime));
        if(jump.isAnimationFinished(stateTime)){
            state = IDLE;
            stateTime = 0;
        }
    }else{
        sprite.setRegion(idle.getKeyFrame(stateTime));
    }
    if(Gdx.app.getType() == ApplicationType.Android )
        velocity.x = -Gdx.input.getAccelerometerX() * (movementForce / 10f);
    if(applyJump){
    body.applyLinearImpulse(0, jumpPower, body.getWorldCenter().x, body.getWorldCenter().y, true);
    applyJump = false;}
    body.setLinearVelocity(velocity.x, body.getLinearVelocity().y);
}

其中applyJump变量是在postSolve()方法中的postSolve()设置的。

提前致谢

好吧,那是两个不同的问题,对吗? 它不是平滑的,是否应该绘制多个精灵?

让我们先解决第二个问题,这应该很明显。 您正在打多个电话以将精灵渲染到某个地方,或者您没有正确清除边框。 好像您正在清除它,因此您必须仔细阅读所有渲染代码,然后看一下如何两次绘制该纹理。 它发生的地方。

world.getBodies(tmpBodies);
    for(Body body : tmpBodies)

为什么存在此代码? 玩家角色有多个精灵吗? 我不会这样处理; 这个数字会随着时间变化吗? 是否有新的球员被创造? 您可能应该创建一个单独的Player类,并允许它管理自己的状态和数据。 使用OOP原则! 一个单一的GOD类(非常程序化的样式)在这里完成了太多工作。 错误的Java。

如果左右移动不平稳,则需要进行物理研究。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM