0

こんにちは、次のコードが組み込まれているときに、かなりの遅延が発生していることに気付きました。

    public function impassable_collisions():void { //prevent player from moving through impassable mcs

        for each(var mc:MovieClip in impassable) {

        var bitmap = createBitmapClone(mc); //return clone of bitmap of mc, accounting for transformations

        var bounds:Rectangle = player.getRect(bitmap);
        var playerCenterX:Number = bounds.left + bounds.width * .5;
        var playerCenterY:Number = bounds.top + bounds.height * .5;

        //Test for a pixel perfect collision against a shape based on a point and radius, 
        //returns the angle of the hit or NaN if no hit.
        var hitAngle:Number = hitTestPointAngle(bitmap, playerCenterX, playerCenterY, player.height/2);

        if(!isNaN(hitAngle)){
            // move player away from object
            player.x -= int(Math.cos(hitAngle) * player.speed*timeDiff);
            player.y -= int(Math.sin(hitAngle) * player.speed*timeDiff);
        }
    }
}

したがって、この関数は、enterFrame リスナーから呼び出される別の関数から呼び出されます。任意の時点でおそらく 5 ~ 30 個のムービークリップを含む配列をループしています。次に、指定された mc がビットマップに複製され、そのビットマップを使用して、それ自体と別のビットマップ (「プレーヤー」) との間の衝突をテストします。 . 私は、かなり非効率的な何かが起こっていると想定しています。その結果、「プレイヤー」が動いたときにラグが発生します。問題が何であるか/それに対する解決策を知っている人はいますか?

かなりあいまいな質問のタイトルで申し訳ありません

ありがとう

4

1 に答える 1

1

ピクセル パーフェクトの衝突検出はコストがかかります。それが唯一の問題とは言えませんが、処理の面でコストがかかることは言えます。

このループの反復ごとに新しいビットマップを作成することもコストがかかります。

より集中的なチェックを行う前に、オブジェクトを削除することを試みることができます。たとえば、非常に迅速な距離チェックにより、オブジェクトが特定の距離内にない場合にオブジェクトをテストする必要がなくなります。

if (distance <= threshold)
{
    // create the bitmap for the check
    // do the expensive pixel perfect collision check
}

あなたの目標は、明らかに衝突するほど近くにないオブジェクトを排除することです。

于 2013-04-19T23:16:35.973 に答える