2

ここに問題があります: Tweens を使用して跳ねるボールがあり、ボールとプラットフォームの間の衝突を検出したい (ボールが落下している場合のみ)。

しかし、私の解決策はループ内で衝突をテストすることですENTER_FRAME。ボールの速度が速すぎると、ax フレームではボールがプラットフォームの上にあり、x+1 フレームではボールはプラットフォームの下にあるため、ループは検出されません。衝突 (ボールとプラットフォームが実際に衝突することはないため)。

これが私のボールのジャンプ方法です:

public function jump():void
{
    TweenLite.killTweensOf(this);
    TweenLite.to(this, jumpSpeed, {y:250, ease:Cubic.easeOut});
    TweenLite.to(this, jumpSpeed, {delay:jumpSpeed, y:stage.stageHeight-this.height, ease:Cubic.easeIn, onComplete:jump});
}

そして、これが私のENTER_FRAMEループで実行されるものです:

for each (var platform:Platform in platforms) 
{
    if (ball.hitTestObject(platform) &&  ballPreviousY < ball.y)
        ball.jump();
}
ballPreviousY = ball.y;

私はすでに物理エンジン Box2D を使用した解決策に取り組み始めましたが、その問題に対するより簡単な解決策があるかどうか知りたいです。

4

1 に答える 1

0

これは、衝突検出における一般的な問題です。小さくて高速なオブジェクトが薄い障害物を通過します。あなたが探しているのはスイープテストです

2 つの静的な形状の交差をテストする代わりに、元の形状を軌道に沿ってスイープし、これらのスイープされた形状間の重なりをテストすることで、新しい形状を作成できます。

N チュートリアル A - 高速移動オブジェクトから(衝突アルゴリズムの詳細に興味がある場合は、すべてのものを読むことをお勧めします)。

たとえば、1 ピクセル x 1 ピクセルの正方形があり、x 軸に沿って 1 フレームあたり 5 ピクセルで移動している場合、衝突テスト用に 6 ピクセル x 1 ピクセルの長方形になるように正方形を歪めます。次のフレームにヒットするものはすべてキャッチしますが、それ以上のものはキャッチしません。

円を伸ばすと楕円になるため、円は少し難しくなります (衝突をチェックするのははるかに困難です)。楕円ルートに進みたい場合は、この回答を参照してください。

于 2012-10-13T06:42:15.703 に答える