2014-01-05 56 views
0

我的游戏出现问题(跳线类型游戏),当玩家摔倒或左右移动时不平滑,我可以多次看到精灵(如某种阴影) 。在搜索互联网后,我认为这是deltaTime的东西,但我找不出如何解决它。 在游戏屏幕呈现方法的代码是:LIBGDX平滑播放器运动

@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()方法设置好的。

在此先感谢

+0

你的想法很奇怪。你应该使用一个常量样式。没有人能一眼就明白这一点。此外,我没有看到任何渲染代码。 – noone

回答

1

那么,这是两个不同的问题呢?它不光滑,它不应该绘制多个精灵?

让我们先解决第二个问题,这应该是非常明显的。要么你正在进行多次调用来渲染精灵,要么你没有正确清理框架。它看起来像你正在清理它,所以你必须通过所有的渲染代码,看看你如何绘制纹理两次。它发生的地方。

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

为什么这个代码存在?玩家角色是否有多个精灵?我不会这样处理;这个数字会随着时间而改变吗?是否有新球员被创建?你应该创建一个单独的Player类,并允许它管理自己的状态和数据。使用面向对象的原则!一个单一的GOD课程正在做很多事情,非常程序化。糟糕的Java。

如果左/右移动不顺畅,您需要处理物理。

+0

我厌倦了通过截图来捕捉我的问题,它似乎只是多个精灵的视觉效果,而且在Android上,左右移动是正确的。你编写的代码是从世界中获得身体,然后找出哪一个是玩家(或平台)的身体,这是我通过教程学习的一种方式。还有一个Player类,其中没有渲染的所有逻辑都被处理。 –