在对精灵的运动进行推断之前,我的碰撞效果非常好。但是,在对精灵的运动进行推断(以使物体平滑)之后,碰撞不再起作用。
这是外推之前的工作方式:
但是,在执行推断后,碰撞例程将中断。我假设这是因为它作用于外推例程(位于我的render调用中)产生的新坐标。
应用推断后
如何纠正这种行为?
我尝试在推断后再进行一次额外的碰撞检查-这似乎确实解决了许多问题,但是我将其排除在外是因为将逻辑放入渲染中是不可能的。
我还尝试制作了spritesX位置的副本,对其进行推断并使用该位置而不是原始位置进行绘制,从而保留了原始位置以供逻辑使用-这似乎是一个更好的选择,但仍然会产生一些奇怪的效果与墙壁碰撞时。我很确定这也不是解决此问题的正确方法。
我在这里找到了几个类似的问题,但是答案并没有帮助我。
这是我的推断代码:
public void onDrawFrame(GL10 gl) {
//Set/Re-set loop back to 0 to start counting again
loops=0;
while(System.currentTimeMillis() > nextGameTick && loops < maxFrameskip){
SceneManager.getInstance().getCurrentScene().updateLogic();
nextGameTick+=skipTicks;
timeCorrection += (1000d/ticksPerSecond) % 1;
nextGameTick+=timeCorrection;
timeCorrection %=1;
loops++;
tics++;
}
extrapolation = (float)(System.currentTimeMillis() + skipTicks - nextGameTick) / (float)skipTicks;
render(extrapolation);
}
应用外推
render(float extrapolation){
//This example shows extrapolation for X axis only. Y position (spriteScreenY is assumed to be valid)
extrapolatedPosX = spriteGridX+(SpriteXVelocity*dt)*extrapolation;
spriteScreenPosX = extrapolationPosX * screenWidth;
drawSprite(spriteScreenX, spriteScreenY);
}
编辑
正如我上面提到的,我尝试专门复制精灵的坐标以进行绘制。
首先,无论复制如何,当精灵移动时,它都非常平滑,停止时,它会左右左右摆动-因为它仍在根据时间推断位置。这是正常的行为吗?当子画面停止播放时,我们可以“关闭”吗?
我尝试过为左/右设置标志,并且仅在启用这些标志时才进行推断。我也尝试过复制上一个和当前位置,看是否有任何区别。但是,就碰撞而言,这些都无济于事。
如果用户按下发言,则右按钮且精灵在向右移动,当碰到墙时,如果用户继续按住右键,则精灵将继续向右移动,同时被墙停住(因此实际上并没有移动),但是由于仍然设置了正确的标志,并且由于碰撞例程不断将精灵移出墙外,因此代码(而非播放器)仍然看到精灵仍在移动,因此推断仍在继续。所以玩家会看到的是精灵的“静态”(是的,它是动画的,但实际上并没有在屏幕上移动),并且随着推算试图做它的事情,它时不时地剧烈震动……。 ..希望有帮助