我第一次在我正在开发的中型 Flash 游戏中认真使用 Box2D。我目前对 Box2D 的体验仅限于创建一个世界、身体并以功能性的方式将这些身体添加到世界中。
我发现将 Box2D 集成到我的游戏环境中很容易,维护编写良好的代码并完成了一些处理碰撞的教程。我现在面临的问题是我的游戏将有许多实体,每个实体都以不同的方式与其他实体交互,而且我发现很难编写自己的b2ContactListener
子类而不让它变得非常混乱。
根据我使用的教程,我创建了自己的子类并添加了该方法b2ContactListener
的覆盖。BeginContact()
调用时接收的参数BeginContact()
将引用 的一个实例b2Contact
,通过它我可以访问两个b2Fixture
实例(两个发生碰撞的实例)。然后我可以访问与这些sb2Body
中的每一个关联的实例。b2Fixture
问题:目前我有一个迂回的方法来找出两个东西相撞(即它们是墙和导弹,还是玩家和树等),它使用
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) }
如您所见,这最终会变得非常漫长且难以管理。我还必须编写每组操作以执行两次,以适应某个元素是 FixtureA 或 FixtureB,反之亦然(显然是以交换参数的函数调用的形式,而不是从字面上重写)。
这显然不是正确的方法,但我无法找到更彻底地解释碰撞检测管理的资源。
有没有人可以分享使用 Box2D 进行碰撞检测管理的经验?另外,是否使用SetUserData( entityThatOwnsTheBody );
正确的方法来使用该方法?