バックグラウンド
- 指を使って画面上でボールをドラッグできる、子供向けの iOS アプリを作成しています。
- 物理シミュレーションには Chipmunk 7.0.0 を使用しています。
- ドラッグ機能を実装するために、 Chipmunk デモ コードを調整しました。
- 私は2ミリ秒の固定時間ステップを使用しています。(私のアプリが何か良いことをしているわけではありません...)
問題
最近、ボールが互いに衝突したり、壁に衝突したりするたびにサウンドを再生するコードを追加しました。これは、postSolve
コールバック内で行っています。
static void postSolve(cpArbiter *arb, cpSpace *space, cpDataPointer userData)
{
GameLayer *layer = (__bridge GameLayer *)userData;
[layer collisionHandler:arb];
}
-(void) collisionHandler:(cpArbiter*)arb
{
if(cpArbiterIsFirstContact(arb)) {
[[SimpleAudioEngine sharedEngine] playEffect:kCollisionEffectFilename];
}
}
ここに問題があります... ボールを壁にドラッグすると、 でフィルタリングしても非常に多くの衝突が発生し、cpArbiterIsFirstContact
ひどく聞こえます。ボールが壁に跳ね返り、制約によって壁に押し戻され、すすぎ、繰り返しているように見えます。このシナリオでは、1 回か 2 回だけ衝突音を再生したいと考えています。
私が試したことはうまくいかないようです...
cpArbiterTotalKE
、 、または相対速度を使用したフィルタリングcpArbiterTotalImpulse
: インパルス、運動エネルギー、および相対速度はすべて、典型的な衝突の範囲内にあります。- コールバックの使用
separate
: ボールは実際に壁に何度も跳ね返っています。 - ステップ サイズの縮小: 物理エンジンは、実際には収束に時間がかかります。
- 効果音の速度制限: より良いですが、ボールが静止しているように見えても、ボールはまだノイズを出します。
質問
トラップされたボディの衝突をフィルタリングする方法はありますか?