Cocoa touch 如何检测与花栗鼠物理引擎的永久碰撞

Cocoa touch 如何检测与花栗鼠物理引擎的永久碰撞,cocoa-touch,cocos2d-iphone,chipmunk,Cocoa Touch,Cocos2d Iphone,Chipmunk,当球的形状击中其他形状时,我试着发出“砰砰”的声音。这很有效。但效果有点太好了 当球静止或开始滚动时,它与它所接触的任何东西都会发生永久性碰撞,因此“沸腾”的声音会不断发出 我在花栗鼠的文档中找不到任何东西可以告诉我什么时候两个东西永久性地碰撞。所以我想我必须自己去弄清楚,也许用某种计时器来比较上次碰撞和当前碰撞。但对我来说,这听起来很烦人 有人解决过这个问题吗?你是怎么解决的?形状在花栗鼠身上没有速度。他们所依附的身体拥有它。你可以这样访问速度:“myShape.body->v”。我同意,你应

当球的形状击中其他形状时,我试着发出“砰砰”的声音。这很有效。但效果有点太好了

当球静止或开始滚动时,它与它所接触的任何东西都会发生永久性碰撞,因此“沸腾”的声音会不断发出

我在花栗鼠的文档中找不到任何东西可以告诉我什么时候两个东西永久性地碰撞。所以我想我必须自己去弄清楚,也许用某种计时器来比较上次碰撞和当前碰撞。但对我来说,这听起来很烦人


有人解决过这个问题吗?你是怎么解决的?

形状在花栗鼠身上没有速度。他们所依附的身体拥有它。你可以这样访问速度:“myShape.body->v”。我同意,你应该能够检查速度是否超过某个阈值,以了解何时发生“碰撞”。你也可以检查旋转速度,看看球是否在滚动。

我不认为我要说的是一个好的练习,但我相信它会解决你的问题:

  • 对于每个对象,保留两个状态变量:(1)上次碰撞的对象,(2)上次碰撞时间

  • 碰撞时,仅当碰撞的对象不同(和一个球)或自上次碰撞后经过某个“增量时间”时,才播放声音。然后记录最后一次碰撞统计信息

  • 这非常简单且非常有效:

    // In your ball interface
    id lastCollisionObject;
    double lastCollisionTime;
    
    
    // When a collision occurs...
    double now = GetTime();
    id other = GetCollisionObject();
    if ((now - lastCollisionTime) > 0.3 || other != lastCollisionObject) {
        PlaySound(kBoingSound);
    }
    lastCollisionObject = other;
    lastCollisionTime = now;
    

    当触点断开时,你就不能播放你的“砰砰”声吗? 在花栗鼠中有一个回调,
    typedef void(*cpCollisionSeparateFunc)(cpArbiter*arb,struct cpSpace*space,void*data)


    这样一来,当它弹跳时,你就会听到砰砰声,但当它只是滚动时,你就不会听到砰砰声了当然,当它从你的形状上滚下来时,你也会得到一个,但这可能是一个特征,这取决于你如何看待它。

    不是可可坚果,但你不应该检查撞击的速度来解决这个问题吗?我想了想,但我似乎无法获得花栗鼠形状的速度。但有99%的可能性是因为我对C、目标C和Cocoa不熟悉,所以我做得不对。比如说,如果一个球从斜坡上滚下来,而不是在斜坡上反弹,那么它滚动时应该是无声的,反弹时应该是响亮的。这两种情况都是在碰撞被分离之后发生的,所以我不认为分离是一个好地方,除非域中的东西只会反弹,而不会滚动或滑动。事实上,我认为你的建议是一个很好的实践,只是缺少一个警告,以确保ID不能被重用-想象一下击中“最后创建的对象”,让它爆炸,然后击中另一个对象,却没有意识到它,因为它被分配了相同的“最高ID”。