想象一下以下场景:我有一个级别,其物理结构是由一组边界矩形构建的,并结合了预渲染的位图背景。我的演员,包括玩家角色,都有自己的边界矩形。 如果一个演员设法陷入一个等级块,部分或其他方面,它将需要再次移出,以便它与该块齐平。
我在生物休息期间想到的未经测试的技术如下:
如果发现演员的盒子与水平盒相交,则确定每个矩形的中心点在哪里。如果演员的中心更高而不是级别框,则移动演员以使演员的rect的底部与级别的rect的顶部齐平,反之亦然,如果它更低。然后横向做一个类似的事情。
对此有何看法?关于更好方法的建议?
实际上,边界是XNA BoundingBoxes,其Z从-1到1,但它仍然是2D游戏。
答案 0 :(得分:5)
您是否阅读过N Tutorials?它们是基于Separating Axis Theorem碰撞检测和简单投影响应的精彩介绍,完整的小演示。 (它们实际上在N game中使用效果很好。)教程涵盖的内容超出了你的需要,但它们非常通用(可扩展到许多其他形状),并开始涉及快速移动的问题对象和其他响应技术。
即使您决定采用比SAT实施更简单的方法,这可能会为您提供很多好主意。
(如果你已经完成了这项工作,如果你想让自己的思绪受到影响,请尝试查看游戏开发者大会物理教程日的一些演示文稿,包括realtimecollisiondetection.net publications,essentialmath.com tutorial slides,两者这些书籍和/或从这些网站链接的其他东西。我也强烈推荐GDC会议本身。虽然我们仍然不需要或特别想要花钱GJK在我们合作的掌上游戏平台上扫过船体,一些更简单的概念,如“配置空间”和Minkowski总和和差异,极大地影响了我对物理和碰撞检测的看法以及我们如何实现它。)
答案 1 :(得分:1)
“真正的”物理引擎所做的是找到最小穿透向量。也就是说 - 最小的矢量,表示两个物体相互穿透的距离。
对于AABB(轴对齐的边界框),这非常容易计算。
(考虑制作自己的2D AABB结构,它会更小,因此性能更好。)
一旦获得最小穿透矢量,就可以执行碰撞响应。最简单的响应是简单地用该向量分隔两个对象(如果另一个对象是静态的,则将它们分开)。
Here is a good reference, by the makers of N关于如何为凸多边形和圆形执行此操作。您应该能够为AABB简化此操作。
答案 2 :(得分:0)
很大程度上取决于细节。完整的解决方案可以考虑速度或其他问题。但这简单地对待......
您不希望始终先垂直解析。想象一下,演员水平地轻推到一个街区。如果你先垂直分辨,那么当一个小的水平移动就足够了时,演员将弹出该区块之上。
找出“脱离碰撞”所需的垂直和水平移动,然后应用具有最小绝对值的移动。
然后重复几次,以防机芯将演员放入另一个街区。但是不要永远重复,因为演员可能被楔入一个永不解决的地方。
也许如果你的最后一次动作仍然让你发生碰撞,你可以将最后两个动作平均并留在那里。
答案 3 :(得分:0)
另一种可能的方法是,不是等待碰撞然后移出,在移动物体之前检查可能的碰撞,如果有碰撞,只将玩家移动到挡块的边缘。
即,对比冒险与墙壁碰撞的对比:http://www.youtube.com/watch?v=I6-zN_eaRd8 大多数NES游戏如何与墙壁碰撞。