0

バックグラウンド

  • 指を使って画面上でボールをドラッグできる、子供向けの 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: ボールは実際に壁に何度も跳ね返っています。
  • ステップ サイズの縮小: 物理エンジンは、実際には収束に時間がかかります。
  • 効果音の速度制限: より良いですが、ボールが静止しているように見えても、ボールはまだノイズを出します。

質問

トラップされたボディの衝突をフィルタリングする方法はありますか?

4

2 に答える 2

1

シンプルで効果的な解決策は、サウンドを立て続けに再生しないことです。

ボールが壁に接触したら、ボールの「最後の接触」タイマーが現在の時間よりも小さいかどうかを確認します。その場合は、サウンドを再生し、ボールの「最後の接触」時間を現在の時間に x を加えた時間に設定します。ここで、x はサウンドが再度再生されないタイムアウト時間 (つまり 0.5 秒) です。

cocos2d-iphone では、更新メソッドの deltaTime を加算して時間を追跡できます。システム時刻を取得する方法もいくつかあります。たとえば[NSDate date].timeIntervalSince1970、1970 年以降の現在の秒数が得られます。ばかげているように思えますが、しばらくしてからその数値を再度取得し、前の秒数を引くと、次のようになります。秒単位の違い、それがすべてです。

于 2013-10-28T16:59:26.707 に答える