Andengine PhysicsHandler 让玩家看起来很迟钝
Andengine PhysicsHandler makes player look laggy
嘿,我的问题是,在 PhysicsHandler 的 onUpdate 中,pSecondsElapsed 经常从 0.016... 跳到 0.038,这使得玩家移动的步幅太大,看起来玩家会滞后。
这是来自 onUpdate 的重要代码:
@Override
protected void onUpdate(final float pSecondsElapsed, final IEntity pEntity) {
if(this.mEnabled) {
/* Apply linear acceleration. */
final float accelerationX = this.mAccelerationX;
final float accelerationY = this.mAccelerationY;
if(accelerationX != 0 || accelerationY != 0) {
this.mVelocityX += accelerationX * pSecondsElapsed;
this.mVelocityY += accelerationY * pSecondsElapsed;
}
/* Apply angular velocity. */
final float angularVelocity = this.mAngularVelocity;
if(angularVelocity != 0) {
pEntity.setRotation(pEntity.getRotation() + angularVelocity * pSecondsElapsed);
}
/* Apply linear velocity. */
final float velocityX = this.mVelocityX;
final float velocityY = this.mVelocityY;
if(velocityX != 0 || velocityY != 0) {
pEntity.setPosition(pEntity.getX() + velocityX * pSecondsElapsed, pEntity.getY() + velocityY * pSecondsElapsed);
}
}
}
顺便说一句,我只使用线速度。有人对此有解决方案吗?感谢您的帮助!
我继续查看该引擎的存储库,发现 class 可能对您有所帮助。基本引擎 class 有一个名为 Fixed Step Engine 的扩展,它应该允许您控制每帧的增量时间,这可能值得尝试(如果您还没有)以获得更流畅的物理效果。
与 FixedStepPhysicsWorld 结合,您将获得最佳结果,但是: FixedStepPhysicsWorld class:
内部有一个小的 "mistake"
更改onUpdate如下:
...
while(this.mSecondsElapsedAccumulator >= stepLength && stepsAllowed > 0) {
world.step(stepLength, velocityIterations, positionIterations);
this.mSecondsElapsedAccumulator -= stepLength;
stepsAllowed--;
}
this.mPhysicsConnectorManager.onUpdate(pSecondsElapsed);
至
...
while(this.mSecondsElapsedAccumulator >= stepLength && stepsAllowed > 0) {
world.step(stepLength, velocityIterations, positionIterations);
this.mSecondsElapsedAccumulator -= stepLength;
stepsAllowed--;
this.mPhysicsConnectorManager.onUpdate(stepLength);
}
原始代码中的问题是 PhysicsConnectors 在 PhysicsWorld 执行多个步骤后得到更新(大多数情况)。我的代码修复了这个问题。每当 UiThread 绘制连接的实体时,它们总是位于它们连接的主体所在的位置。他们不会跳过物理步骤。
嘿,我的问题是,在 PhysicsHandler 的 onUpdate 中,pSecondsElapsed 经常从 0.016... 跳到 0.038,这使得玩家移动的步幅太大,看起来玩家会滞后。 这是来自 onUpdate 的重要代码:
@Override
protected void onUpdate(final float pSecondsElapsed, final IEntity pEntity) {
if(this.mEnabled) {
/* Apply linear acceleration. */
final float accelerationX = this.mAccelerationX;
final float accelerationY = this.mAccelerationY;
if(accelerationX != 0 || accelerationY != 0) {
this.mVelocityX += accelerationX * pSecondsElapsed;
this.mVelocityY += accelerationY * pSecondsElapsed;
}
/* Apply angular velocity. */
final float angularVelocity = this.mAngularVelocity;
if(angularVelocity != 0) {
pEntity.setRotation(pEntity.getRotation() + angularVelocity * pSecondsElapsed);
}
/* Apply linear velocity. */
final float velocityX = this.mVelocityX;
final float velocityY = this.mVelocityY;
if(velocityX != 0 || velocityY != 0) {
pEntity.setPosition(pEntity.getX() + velocityX * pSecondsElapsed, pEntity.getY() + velocityY * pSecondsElapsed);
}
}
}
顺便说一句,我只使用线速度。有人对此有解决方案吗?感谢您的帮助!
我继续查看该引擎的存储库,发现 class 可能对您有所帮助。基本引擎 class 有一个名为 Fixed Step Engine 的扩展,它应该允许您控制每帧的增量时间,这可能值得尝试(如果您还没有)以获得更流畅的物理效果。
与 FixedStepPhysicsWorld 结合,您将获得最佳结果,但是: FixedStepPhysicsWorld class:
内部有一个小的 "mistake"更改onUpdate如下:
...
while(this.mSecondsElapsedAccumulator >= stepLength && stepsAllowed > 0) {
world.step(stepLength, velocityIterations, positionIterations);
this.mSecondsElapsedAccumulator -= stepLength;
stepsAllowed--;
}
this.mPhysicsConnectorManager.onUpdate(pSecondsElapsed);
至
...
while(this.mSecondsElapsedAccumulator >= stepLength && stepsAllowed > 0) {
world.step(stepLength, velocityIterations, positionIterations);
this.mSecondsElapsedAccumulator -= stepLength;
stepsAllowed--;
this.mPhysicsConnectorManager.onUpdate(stepLength);
}
原始代码中的问题是 PhysicsConnectors 在 PhysicsWorld 执行多个步骤后得到更新(大多数情况)。我的代码修复了这个问题。每当 UiThread 绘制连接的实体时,它们总是位于它们连接的主体所在的位置。他们不会跳过物理步骤。