我第一次在我正在开发的中型 Flash 游戏中认真使用 Box2D。我目前使用 Box2D 的经验仅限于创建一个世界、实体,并以功能方式将这些实体添加到世界中。
我发现将 Box2D 集成到我的游戏环境中很容易,维护编写良好的代码并完成了一些处理碰撞的教程。我现在面临的问题是我的游戏将有很多主体,每个主体以不同的方式与其他主体进行交互,而且我发现很难编写自己的 b2ContactListener
没有它变得非常困惑的子类。
根据我使用的教程,我创建了自己的子类 b2ContactListener
并添加了 BeginContact()
的覆盖方法。 BeginContact()
的论点调用时接收将引用 b2Contact
的实例,通过它我可以访问两个 b2Fixture
实例(发生冲突的两个实例)。然后我就可以访问 b2Body
与每个相关联的实例 b2Fixture
s。
GetUserData()
看起来像这样:var f1Player:Boolean = contact.GetFixtureA().GetBody().GetUserData() is Player
var f2Player:Boolean = contact.GetFixtureB().GetBody().GetUserData() is Player
var f1Tree:Boolean = contact.GetFixtureA().GetBody().GetUserData() is Tree
var f2Tree:Boolean = contact.GetFixtureB().GetBody().GetUserData() is Tree
// ... continutes with all possible combinations.
// Example of managing a collision:
if(f1Player && f2Tree)
{
// Player (FixtureA) and Tree (FixtureB)
}
if(f2Player && f1Tree)
{
// Player (FixtureB) and Tree (FixtureA)
}
如您所见,这最终将非常漫长且无法管理。我还必须编写要执行两次的每组 Action ,以满足某个元素是 FixtureA 或 FixtureB,反之亦然(显然是以函数调用的形式,参数交换而不是字面上重新编写)。
这显然不是正确的方法,但我无法找到更彻底地解释碰撞检测管理的资源。
有没有人有使用 Box2D 进行碰撞检测管理的经验可以分享?另外,正在使用
SetUserData( entityThatOwnsTheBody );
使用该方法的正确方法是什么?
最佳答案
是的,确实有点麻烦。其实我觉得你的方式很典型。
fwiw Box2D 本身在测试夹具是否重叠时也必须处理类似的问题。有很多函数,例如 b2CollideCircles、b2CollidePolygonAndCircle、b2CollidePolygons 等,当两个夹具彼此靠近时,引擎会选择应该使用这些函数中的哪一个。
它通过将函数指针放在一个二维数组中,然后使用两种形状类型作为索引在这个数组中查找适当的函数来实现这一点。有关详细信息,请参阅 b2Contact.cpp 中的前三个函数。
当然,如果你不能在 AS3 中传递这样的函数引用,那么我想这个答案没有多大帮助,但我想我还是会发布,因为 C/C++/JS 用户可能会来。
关于actionscript-3 - 如何以干净、可管理的方式跟踪所有 Box2D 碰撞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12703824/