【问题标题】:Coin collision detection using cocos2d+box2d - contact listener or custom?使用 cocos2d+box2d 进行硬币碰撞检测 - 接触监听器还是自定义?
【发布时间】: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


【解决方案1】:

我会让接触侦听器完成它的工作,而不是尝试与 Box2D 已经在做的事情并行实施碰撞检测。

您可以使用 bodyDef.userData 存储对 CCPhysicsSprite 对象(或父对象)的周引用,以便您可以在联系侦听器中访问它。 来自 Box2D 文档:

用户数据是一个空指针。这为您提供了将应用程序对象链接到主体的挂钩。您应该一致地为所有正文用户数据使用相同的对象类型。

【讨论】:

    【解决方案2】:

    您可能希望查看传感器,因为您不希望硬币阻止您前进。

    【讨论】:

    • 是的,硬币标记为coinBody.isSensor = true;,但这并不能真正解决问题。
    • 你应该使用联系监听器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多