如何判断游戏精灵是否顺利移动?

时间:2014-07-03 23:39:30

标签: android libgdx box2d frame-rate

我正在使用libgdx和box2d为Android制作一个简单的跳跃游戏,我无法弄清楚如何使精灵移动得非常顺畅。我已经检查了几篇关于时间步长修复和同步渲染器和物理仿真的文章,但没有一种建议方法真的有帮助(http://gafferongames.com/game-physics/fix-your-timestep/)。

最后我决定运行最简单的测试设置box2d世界步长等于帧速率(在稳定fps的情况下应该提供最佳性能),但仍然运动不是完全平滑。我已在PC和Android设备上测试过,稳定的60-61 FPS。这是伪代码:

在渲染中:

world.step(Gdx.graphics.getDeltaTime(), 6, 2);  
stage.act();
stage.draw();

舞台基本上只有一个带有动作和绘画覆盖的角色:

@Override
    public void draw(Batch batch, float arg1) {

        float x = this.getX() - width/2;
        float y = this.getY() - height/2;

        batch.draw(sprite, x, y, width, height);

    }

    @Override
    public void act (float delta) {

         ...

        //get body position
        position = body.getPosition();
        this.setPosition(position.x, position.y);

    }

演员有box2d身体贴在上面,没有重力,身体的速度设定为常数:

BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyType.DynamicBody;
bodyDef.position.set(world_position);
bodyDef.linearDamping = 0f; 
bodyDef.angularDamping = 0f;
bodyDef.fixedRotation = true;
bodyDef.gravityScale = 0f;

...fixure added to the body 

body.setLinearVelocity(0, -2f);

相机没有移动,这种情况似乎很简单但精灵并没有完全移动。 (虽然在使用时间累加器和插值时它仍然看起来更平滑)

是否有可能实现绝对平稳的运动?我的方法有误吗? 我在相同的Android设备上检查了一些类似的游戏 - 看起来对象移动得非常顺畅,但也许只是看起来如此,因为屏幕上发生的事情太多而且我没有时间注意。

任何建议都将受到赞赏。

2 个答案:

答案 0 :(得分:1)

经过进一步测试和研究后我发现了问题 - 它与FPS无关,而与像素舍入有关。 Box2d实体具有浮点坐标 - 将它们转换为圆形像素值后,动画效果更加平滑。

答案 1 :(得分:0)

如何使用CCPhysicsSprite而不是按时间改变精灵的位置?您也可以使用批次。只是

sprite = [CCPhysicsSprite spriteWithTexture:batch.texture]; [batch addChild:sprite];

CCPhysicsSprite class 示例:

#import "CCPhysicsSprite.h"

CCPhysicsSprite *sprite = [CCPhysicsSprite spriteWithFile:@"sprite.png"];
[self addChild:sprite];

b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position.Set(300/PTM_RATIO, 200/PTM_RATIO);
body = world->CreateBody(&bodyDef);

b2CircleShape circleShape;
circleShape.m_radius = 0.3;

b2FixtureDef fixtureDef;
fixtureDef.shape = &circleShape;
fixtureDef.density = 1;
fixtureDef.friction = 0.3f;
body->CreateFixture(&fixtureDef);

[sprite setPTMRatio:PTM_RATIO];
[sprite setB2Body:body];
[sprite setPosition: ccp(300, 200)];