LibGdx输入处理和碰撞检测

问题描述:

我正在玩libGdx,创建一个简单的平台游戏。我使用Tiled创建地图和LibGdx tiledMap渲染器。 它与SuperKoalio libgdx示例类似。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,并且使用该速度来确定的状态下,其仍产生相同的问题。

感谢

+0

碰撞检测是一个痛苦,如果你打算自己做。我认为你需要更恰当地处理碰撞,而不是将球员状态设置为站立,如果他交叉任何瓦。在确定他是否站立之前,你需要检查他是如何与瓦片发生碰撞的。 – Barodapride 2014-10-06 17:40:00

+0

谢谢,我看了一下我在玩家状态中所做的事情,并且从枚举中跳出来,所以你可以同时跳跃和行走(在空中和向右移动),它似乎已经解决了它。不确定我是否完全理解它现在起作用的原因,但它是有效的,这是主要的,:D – Cerberus90 2014-10-06 18:14:34

当你Collision-detection被媒体链接工作,你需要改变的就是冲突处理。
您将Player的s state设置为Standing
而不是做这个的,你culd设置标志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标志并在下一帧重新计算它。