【发布时间】:2013-02-02 00:49:52
【问题描述】:
我正在使用 cocos2d 和 Box2D 制作 iOS 游戏,我想知道如何最好地处理与硬币等可收集对象的碰撞。玩家是一个动态物体,但硬币和其他收藏品(通常)是静态物体。在玩家和这些对象之间创建接触侦听器会更好,还是只遍历游戏循环中的每个硬币(排除屏幕外的任何硬币等)并对它们执行循环碰撞检测?
后一种解决方案对我来说似乎是合理的,但我对 box2D 缺乏经验,并且不确定使用接触式侦听器时的优点/缺点和性能成本是什么,所以我不确定这是否会更好。
【问题讨论】:
-
两者都可以正常工作,很难说哪个更好,只要你获得恒定的 60 fps 就没什么关系
-
@LearnCocos2D 为了代码简单,你会推荐其中一个吗?我的第一个猜测是自定义碰撞检测可能更简单,因为我可以直接处理 CCPhysicsSprite 对象而不是 b2Body 对象。
-
@stackunderflow 这可能取决于有多少硬币,但我会让联系人监听器完成它的工作。当 Box2D 已经在执行自己的碰撞检测时,执行自己的碰撞检测似乎有点多余。只需将您在联系人侦听器中添加的代码保持在最低限度(就像您在自定义碰撞检测中所做的那样)。不能通过bodyDef.userData访问CCPhysicsSprite吗?
-
@stackunderflow userData 是一个星期参考。它并不真正知道或关心您传入的内容。它是联系侦听器将其转换为您的对象类型。来自 Box2D 文档:
User data is a void pointer. This gives you a hook to link your application objects to bodies. You should be consistent to use the same object type for all body user data.如果您真的不喜欢这样做,请创建一个包含 CCSprite 和 b2body 成员的父对象,并使用父对象来同步它们。然后 userData 将指向父对象。 -
有兴趣回答这个问题in this topic。
标签: objective-c cocos2d-iphone box2d