【问题标题】:How can I detect a permanent collision with the Chipmunk Physics engine如何检测与花栗鼠物理引擎的永久碰撞
【发布时间】:2009-10-21 20:14:45
【问题描述】:

当球的形状击中任何其他形状时,我正在尝试播放“boing”声音。哪个有效。但是效果有点太好了....

当球静止或开始滚动时,它会与接触的任何物体发生永久性碰撞,因此会不断发出“嘭”的声音。

我在花栗鼠文档中找不到任何东西来告诉我两件事情何时永久碰撞。所以我想我必须以某种方式自己弄清楚,可能使用某种计时器来比较上次碰撞与当前碰撞。但这对我来说听起来很奇怪。

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

【问题讨论】:

  • 不是可可坚果,但您不应该检查撞击的速度来弄清楚这一点吗?
  • 我想过,但我似乎无法访问花栗鼠中形状的速度。但有 99% 的可能性是因为我做错了,因为我是 C、Objective C 和 Cocoa 的新手。

标签: cocoa-touch cocos2d-iphone chipmunk


【解决方案1】:

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

这样一来,当它弹起时,你就会得到boings,但当它只是滚动时不会。 '当然,当它从你的形状滚落时你也会得到一个,但这可能是一个特征,这取决于你如何看待它。

【讨论】:

  • 如果一个球从斜坡上滚下来,而不是在斜坡上弹起,它在滚动时应该是无声的,但在弹起时应该是响亮的。这两种情况都是在碰撞分离之后,所以我不认为分离是一个好的地方,除非域是一个东西只反弹而从不滚动或滑动的地方。
【解决方案2】:

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

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

  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;

【讨论】:

  • 实际上,我认为您的建议是一个很好的做法,只是缺少一个警告以确保该 ID 不能被重用 - 想象一下点击“创建的最后一个对象”,让它爆炸,然后点击另一个对象并没有意识到它,因为它被分配了相同的“最高 ID”。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    相关资源
    最近更新 更多