Input LibGdx输入处理和冲突检测

Input LibGdx输入处理和冲突检测,input,libgdx,collision-detection,Input,Libgdx,Collision Detection,我正在玩libGdx,创建一个简单的平台游戏。我正在使用“平铺”创建贴图和LibGdx平铺贴图渲染器。 它的设置与SuperKoalio libgdx示例类似 我现在的碰撞检测,只是确定玩家是否撞到了右边的瓷砖,上面还是下面。当它检测到右侧碰撞时,会将玩家状态设置为站立。 玩家的控制是通过InPurthandler完成的。当按下D键时,它会将玩家状态设置为步行,当松开该键时,它会将状态设置为站立 我的问题是,如果我按住D键,我跳到平台上并停下来,即使玩家已经倒下并应该能够继续移动,它也不会,直到

我正在玩libGdx,创建一个简单的平台游戏。我正在使用“平铺”创建贴图和LibGdx平铺贴图渲染器。 它的设置与SuperKoalio libgdx示例类似

我现在的碰撞检测,只是确定玩家是否撞到了右边的瓷砖,上面还是下面。当它检测到右侧碰撞时,会将玩家状态设置为站立。 玩家的控制是通过InPurthandler完成的。当按下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速度设置为0,速度用于确定状态,这仍然会产生相同的问题

谢谢

由于您的碰撞检测已准备就绪,您需要更改的是碰撞处理。 您将玩家状态设置为站立。 不要这样做,而是设置一个标志冲突,并在更新中检查该标志:

if(state == State.Standing || collision) {
    velocity.x = 0;
} else if(state == State.Walking || state == State.Jumping) {
    velocity.x = MAX_VELOCITY;
}  
这样你就知道,如果你不移动,因为你不能碰撞==真,或者如果你不移动,因为你没有按状态键!=州议会 当然你也需要知道,当你不再碰撞的时候。
为此,您可以在设置速度后重置碰撞标志,并在下一帧重新计算它。

如果您要自己进行碰撞检测,则会很痛苦。我认为你需要更恰当地处理碰撞,而不是将玩家的状态设置为“站立”(如果他与任何平铺相交)。在你确定他是否站着之前,你需要检查他是如何与瓷砖发生碰撞的。谢谢,我查看了我对玩家状态所做的操作,并从枚举中跳出,因此你可以在空中同时跳跃和行走,并向右移动,这似乎解决了问题。不确定我是否完全理解它为什么现在起作用,但它起作用了,这是最主要的,:D