如何检测与Chipmunk Physics引擎的永久性碰撞

时间:2009-10-21 20:14:45

标签: cocoa-touch cocos2d-iphone chipmunk

当球形击中任何其他形状时,我正试图发出“boing”声。哪个有效。但是工作得太好了......

当球停下来或开始滚动时,它会与触碰的任何东西发生永久性碰撞,因此“boing”声会不断发出。

我在chipmunk文档中找不到任何东西告诉我两件事何时发生永久性碰撞。所以我想我必须以某种方式弄清楚自己,可能是某种计时器,将最后一次碰撞与当前碰撞进行比较。但这对我来说听起来很糟糕。

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

3 个答案:

答案 0 :(得分:2)

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

  1. 对于每个对象,保留两个状态变量:(1)最后一个对象与之碰撞,(2)最后一次碰撞时间。

  2. 碰撞时,如果碰撞的物体不同(和球)或者自上次碰撞后已经过了某个“增量时间”,则只播放声音。然后记录最后的碰撞统计数据。

  3. 这非常简单且非常有效:

    // 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;
    

答案 1 :(得分:2)

当联系人被破坏时,你不能只播放“boing”声音吗? 在花栗鼠中有一个回调,typedef void (*cpCollisionSeparateFunc)(cpArbiter *arb, struct cpSpace *space, void *data)

这样,无论什么时候弹跳都可以获得,但是当它刚刚滚动的时候就没有。 “当然,当你的形状滚动时你也会得到一个,但这可能是一个特征,取决于你如何看待它。

答案 2 :(得分:1)

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