加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

actionscript-3 – 如何以干净,易于管理的方式跟踪我的所有Box2D

发布时间:2020-12-15 07:28:56 所属栏目:百科 来源:网络整理
导读:我正在使用Box2D第一次认真对待我正在制作的中型Flash游戏.我目前使用Box2D的经验仅限于创建一个世界,身体并以功能性方式将这些身体添加到世界. 我发现将Box2D集成到我的游戏环境中很容易,维护编写良好的代码并完成了一些处理碰撞的教程.我现在面临的问题是
我正在使用Box2D第一次认真对待我正在制作的中型Flash游戏.我目前使用Box2D的经验仅限于创建一个世界,身体并以功能性方式将这些身体添加到世界.

我发现将Box2D集成到我的游戏环境中很容易,维护编写良好的代码并完成了一些处理碰撞的教程.我现在面临的问题是我的游戏会有很多身体,每个身体都以不同的方式与其他身体互动,而且我发现很难编写自己的b2ContactListener子类而不会变得非常混乱.

基于我使用的教程,我创建了自己的b2ContactListener子类,并添加了BeginContact()方法的覆盖. BeginContact()在调用时接收的参数将引用b2Contact的一个实例,通过它我可以访问两个b2Fixture实例(两个已经冲突的实例).然后,我可以访问与每个b2Fixtures相关联的b2Body实例.

>问题:目前我有找到了什么两样东西相撞的一种迂回的方式(即无论他们是一堵墙和导弹,或播放机和一棵树等),使用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);使用该方法的正确方法是什么?

解决方法

是的,这确实有点令人讨厌.实际上我认为你拥有它的方式很典型.

fwiw Box2D在测试夹具是否重叠时必须处理类似的问题.有一堆功能,如b2CollideCircles,b2CollidePolygonAndCircle,b2CollidePolygons等,当两个灯具相互靠近时,引擎会选择应该使用哪些功能.

它通过将函数指针放在一个二维数组中,然后使用两个形状类型作为索引来查找此数组中的相应函数.有关详细信息,请参阅b2Contact.cpp中的前三个函数.

当然,如果你不能在AS3中传递这样的函数引用,那么我猜这个答案没有多大帮助,但我想我会发帖,因为C/C++ / JS用户可能会来.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读