【问题标题】:LibGdx Input Handling and Collision DetectionLibGdx 输入处理和碰撞检测
【发布时间】:2014-10-06 15:35:42
【问题描述】:

我正在使用 libGdx,创建一个简单的平台游戏。我正在使用 Tiled 创建地图和 LibGdx tiledMap 渲染器。 它与 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速度为0,速度是用来判断状态的,还是产生了同样的问题。

谢谢

【问题讨论】:

  • 如果你要自己做碰撞检测是一件很痛苦的事情。我认为您需要更适当地处理碰撞,而不是将玩家状态设置为站立,如果他与任何瓷砖相交。在确定他是否站立之前,您需要检查他是如何与瓷砖碰撞的。
  • 谢谢,我查看了我对玩家状态所做的事情,并将 Jumping 从枚举中移出,这样你就可以同时跳跃和行走(在空中和向右移动)和它似乎已经解决了。不知道我是否完全理解为什么它现在有效,但它有效,这是主要的,:D

标签: input libgdx collision-detection


【解决方案1】:

由于您的 Collision-detection 已经正常工作,您需要更改的是碰撞处理。
您将Players 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)
当然,您还需要知道,什么时候不再发生碰撞。
为此,您可以在设置 velocity 后重置 collision 标志并在下一帧重新计算它。

【讨论】:

    猜你喜欢
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多