我的游戏出现问题(跳线类型游戏),当玩家摔倒或左右移动时不平滑,我可以多次看到精灵(如某种阴影) 。在搜索互联网后,我认为这是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()
方法设置好的。
在此先感谢
你的想法很奇怪。你应该使用一个常量样式。没有人能一眼就明白这一点。此外,我没有看到任何渲染代码。 – noone