XNA平台游戏中的碰撞检测

4
我一直在开发一个简单的2D平台游戏引擎。目前,我已经让一个精灵在移动(但尚未进行动画处理),并且有3个像“Jetpac”类型游戏(旧的ZX Spectrum游戏)的平台(如果你谷歌一下,就可以在flash框中玩它)。
现在,我遇到了实现碰撞检测的问题,以便精灵实际上可以在平台上行走。我认为这将是最大的工作,然后继续就很容易了。但如何使用平台实现碰撞检测呢?
我为所有平台和角色都设置了边界框,以及以后会有敌人精灵的边界框,但可以稍后处理。基本上,允许精灵在平台上行走,并使用Bounding Box防止其穿过平台的最简单方法是什么?
更多信息:
- 角色类控制绘制精灵并使用Vector2位置变量更新精灵,该变量使用Vector2运动变量进行更新。 - 平台类控制平台的绘制(共有3个),因此plat1、plat2和plat3都是Platform类型。 - 平台需要在所有侧面完全坚固,但允许精灵行走。
有任何帮助吗?

是的 - 这是一款很棒的游戏,但被忽视和低估了。 - AllFallD0wn
我看到还没有答案。如果情况仍然如此,你可以尝试在gamedev发布。 - user180326
你看过这个问题吗:https://dev59.com/6kvSa4cB1Zd3GeqPhtvE - user180326
2个回答

4

使用矩形进行简单的碰撞检测:

使用矩形结构体作为包围盒。您可以使用相交方法将平台边界框与角色边界框进行比较。

维持性能的基础知识:

如果您的游戏有很多平台,并且级别较大,则可能会因为将所有平台与角色进行比较而导致游戏变慢。例如,您可以使用轴对齐包围盒技术来避免这种情况。 AABB的基本原理是沿着x和y轴对包围盒进行排序,从而获得BB的近似位置。

最后但并非最不重要的:

请查看平台游戏教程


我已经研究了intersects方法,但我需要一些帮助来弄清楚: if (character.bounds.intersects(plat1.bounds) { //do something }中的//do something是什么? - AllFallD0wn
2
基本上,如果角色正在移动并突然与某物相交,则停止其移动。你不能指望在这里得到完整的解决方案,因为你是开发者。不过我真的推荐平台教程。 - Samuel Müller
到目前为止,我已经尝试了这个: ` if (player.characterBounds.Intersects(plat1.platformBounds)) { player.motion.Y = 0; collision = true; } else collision = false; player.Update(collision); `但它仍然没有任何作用...我想知道这是否有助于给出提示? - AllFallD0wn
2
嗯,这并不是那么容易。首先,仅仅将玩家的运动设置为零是不够的,因为已经发生了碰撞,这意味着你必须通过向后移动一步来解决碰撞问题。 换句话说,首先计算玩家的新位置,然后检查是否有碰撞,最后根据是否检测到碰撞来决定是否将新位置应用于玩家。 此外,我在代码中看到的是,当没有碰撞时,你没有重置玩家的运动,所以玩家可能不会移动... - Samuel Müller
我已经解决了问题的一部分 - 我没有更新characterBounds,但现在它能够识别碰撞了。只需要纠正玩家的位置,使他不再半嵌入平台中!此外,我没有发布player.Update过程,该过程更新了.X运动,因此玩家可以左右移动,但不能垂直移动,这是想法。 - AllFallD0wn

0

你有考虑在游戏中使用物理引擎的选项吗?对于一个简单的平台游戏来说,这可能过于复杂,但你可以轻松地添加额外的物理效果。

我可以建议你研究的2D物理引擎包括:

  • Box2D,它有一个本地的XNA端口(请参见这里
  • Chipmunk,曾经有一个XNA端口,但似乎已经失踪了。

我并不想使用物理引擎 - 我想尽可能多地自己编程,而这确实是我完全不了解的唯一事情,但它是最重要的事情之一。 - AllFallD0wn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接