3

ボールの形が他の種類の形に当たったときに「ボイン」音を鳴らそうとしています。どちらが機能しますか。しかし、少しうまく機能しすぎます。

ボールが静止するか、転がり始めると、ボールが触れているものと永続的に衝突するため、「ボーリング」音が絶えず鳴ります。

シマリスのドキュメントには、2つのものが永続的に衝突していることを示すものが見つかりません。ですから、おそらく最後の衝突と現在の衝突を比較するある種のタイマーを使って、どういうわけか自分でそれを理解する必要があると思います。しかし、それは私にはハッキーに聞こえます。

誰かがこの問題に取り組んだことがありますか?どのようにそれを解決しましたか?

4

3 に答える 3

2

接触が壊れたときに「ボイン」サウンドを再生できませんでしたか? シマリスにはそのためのコールバックがあり、typedef void (*cpCollisionSeparateFunc)(cpArbiter *arb, struct cpSpace *space, void *data)

そうすれば、バウンドするたびにボインが発生しますが、転がっているときは発生しません。もちろん、あなたの形から転がり落ちたときにも1つ得られますが、それは見方によっては特徴になる可能性があります.

于 2010-01-05T08:42:49.143 に答える
2

私が言おうとしていることは良い習慣だとは思いませんが、あなたの問題を解決すると確信しています:

  1. オブジェクトごとに、2 つの状態変数を保持します。(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;
于 2009-10-25T02:59:17.577 に答える