我正在玩libGdx,创建一个简单的平台游戏。我使用Tiled来创建地图和LibGdx tilesMap渲染器。 它与SuperKoalio libgdx示例类似。
此刻我的碰撞检测,它只是确定玩家是否已击中其右侧,上方或下方的方块。当它检测到右侧的碰撞时,它会将玩家状态设置为站立状态。 通过InputHandler控制播放器。当按下D键时,它将玩家状态设置为步行,当释放该键时,它将状态设置为站立状态。
我的问题是,如果我按住D,然后跳起并击中一个平台并停止,即使玩家已经退回并且应该能够继续移动,它也不会,直到我松开D键并再次按下它。我可以跳得很好,但不能走路。
关于为什么会这样以及我如何解决它的任何想法?我已经盯着它看了很长时间以至于我可能会遗漏一些明显的东西,在这种情况下,一双新眼睛可能会有所帮助。
这是我在我的player.update函数开始时使用的代码,以便让玩家移动。
if(state == State.Standing) {
velocity.x = 0;
} else if(state == State.Walking || state == State.Jumping) {
velocity.x = MAX_VELOCITY;
}
这是碰撞代码的摘录:
for (Rectangle tile : tiles) {
if (playerRect.overlaps(tile)) {
state = State.Standing;
break;
}
}
最初,碰撞响应将x velocity设置为0,并使用速度来确定状态,这仍然会产生同样的问题。
由于
答案 0 :(得分:0)
当你的Collision-detection
已经全部工作时,你需要改变的是碰撞处理
您将Player
s state
设置为Standing
你没有这样做,而是设置了一个标志collision
并在update
中检查了这个标志:
if(state == State.Standing || collision) {
velocity.x = 0;
} else if(state == State.Walking || state == State.Jumping) {
velocity.x = MAX_VELOCITY;
}
这样你知道,如果你不动,你不能(collision==true
)或者你不动,因为你没有按下键(state != State.Standing
)<登记/>
当然,当你不再碰撞时,你也需要知道
为此,您可以在设置collision
后重置velocity
标记,并在下一帧重新计算。