Chipmunk物理エンジンとの永続的な衝突を検出するにはどうすればよいですか
-
05-07-2019 - |
質問
「ボーイング」をプレイしようとしています。ボールの形状が他の種類の形状に当たったときに鳴るうまくいく。しかし、少しうまく機能します。...
ボールが止まるか、転がり始めると、ボールは触れているものと永久に衝突するため、「ボイン」は常に音が鳴ります。
シマリスのドキュメントには、2つのものが永続的に衝突していることを伝えるものが何も見つかりません。だから、おそらく最後の衝突と現在の衝突を比較する何らかのタイマーを使用して、自分で何らかの方法でそれを把握する必要があると考えています。しかし、それは私にはハッキーに聞こえます。
この問題に取り組んだ人はいますか?どのように解決しましたか?
解決
「ボイン」をプレイしてみませんか接触が壊れたときに音がしますか?
シマリスには、 typedef void(* cpCollisionSeparateFunc)(cpArbiter * arb、struct cpSpace * space、void * data)
バウンドするたびにボーイングを取得しますが、転がっているだけではありません。 「もちろん、シェイプから転がり落ちたときにも取得できますが、見方によっては機能になる可能性があります。
他のヒント
これから言いたいことは良いことではないと思いますが、それがあなたの問題を解決すると確信しています:
-
各オブジェクトについて、2つの状態変数を保持します。(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;
シマリスの形状には速度がありません。彼らはそれを持っているために接続されているボディ。次のようにベロシティにアクセスできます:" myShape.body-> v"。 「衝撃」がいつ発生するかを知るために、速度が特定のしきい値を超えているかどうかを確認できる必要があることに同意します。回転速度をチェックして、ボールが転がっているかどうかを確認することもできます。