1

私は AS3.0 で achtung die kurve のようなゲームを作っています。これまでのところ、4 人の異なるプレーヤーの動きを実行しましたが、問題なく動作します。

私は今、「ワーム」、いわばワームが互いに衝突しているか、それとも自身の尾と衝突しているかをテストするために、衝突検出を行います。

私が理解しているように、hitTestObject(); を使用すると、オブジェクト全体の登録領域を使用しますが、これは大きな問題になります。この登録では、すべてのオブジェクトを含む 4 面登録が行われるためです。なのでこれを使えば、実際のワームに当たるのではなく、この四角形に入るだけで「衝突」します。これは正しく理解されていますか?

衝突検出のさまざまな方法を調べてきましたが、プロジェクトに最適な方法が見つからないようです。

私の考えは、「ワーム」が新しいスプライトを白い背景に描いているかどうかを確認することでした。そうでない場合は、何かに当たったに違いありません。

ここでコードをどのように使用したかを確認できます: .fla ファイルにリンクされた .as 形式のコード

私の定式化されていない質問で申し訳ありませんが、多少意味があることを願っています。どんな助けでも大歓迎です!!

宜しくお願いします - Jesper

4

3 に答える 3

5

効率的なCPU使用率でピクセルパーフェクト衝突検出が必要な場合は、この機能を試してください。

trace("Collided: " + (areaOfCollision(mc1, mc2) != null));
trace("Where: " + areaOfCollision(mc1, mc2));

function areaOfCollision(object1:DisplayObject, object2:DisplayObject, tolerance:int = 255):Rectangle {
    if (object1.hitTestObject(object2)) {
        var limits1:Rectangle = object1.getBounds(object1.parent);
        var limits2:Rectangle = object2.getBounds(object2.parent);
        var limits:Rectangle = limits1.intersection(limits2);
        limits.x = Math.floor(limits.x);
        limits.y = Math.floor(limits.y);
        limits.width = Math.ceil(limits.width);
        limits.height = Math.ceil(limits.height);
        if (limits.width < 1 || limits.height < 1) return null;

        var image:BitmapData = new BitmapData(limits.width, limits.height, false);
        var matrix:Matrix = object1.transform.concatenatedMatrix;
        matrix.translate(-limits.left, -limits.top);
        image.draw(object1, matrix, new ColorTransform(1, 1, 1, 1, 255, -255, -255, tolerance));
        matrix = object2.transform.concatenatedMatrix;
        matrix.translate(-limits.left, -limits.top);
        image.draw(object2, matrix, new ColorTransform(1, 1, 1, 1, 255, 255, 255, tolerance), BlendMode.DIFFERENCE);

        var intersection:Rectangle = image.getColorBoundsRect(0xFFFFFFFF, 0xFF00FFFF);
        if (intersection.width == 0) return null;
        intersection.offset(limits.left, limits.top);
        return intersection;
    }
    return null;
}

予備が成功した後hitTestObject()、この関数はバックグラウンドで、それぞれ異なる色でペイントされた両方のオブジェクトの形状からスナップショットを取得し、それらを新しいオブジェクトの色と交差してオーバーレイしRectangle、結果の形状のを返します。とてもクール。

Pixel Perfect Collision Detection詳細については、「 ActionScript Man」、「Troy Gilbert」、「Boulevart(wim)」、「Grant Skinner(gSkinner)」、「Senocular 」のいずれかの名前をグーグルで検索できます。ちなみに、それらの人は素晴らしいAS3リファレンスです。

于 2012-04-14T03:56:26.950 に答える
0

そのゲームのスクリーンショットを見ると、各ワームを一連の円として説明するのが最適なモデルだと思います。次に、ワールド/レベルを円の半径よりも若干大きいセルでグリッドに分割します。

衝突チェックは次のようになります。

  1. クリアグリッド
  2. 各円を 1 つ以上のグリッド セルに配置します。
  3. 各セルについて、すべてのセルを反復します。
    • このセル内の(部分的に)円の各ペアについて、それらが交差するかどうかを確認します。もしそうなら; 衝突。これにより、円 A と B の間で複数の衝突が発生する可能性があるため、重複を避けるためにも確認する必要があることに注意してください。

ステップ 1 と 2 は、グリッドをクリアせず、ステップ 2 の代わりに移動後に各円のセルを更新することで最適化できます。円のサイズの 5 倍のようにセルのサイズを変更すると、円は数フレームの間同じセルにとどまり、過剰な追加/削除操作を回避できます。

私は現在、私のプロジェクトで似たようなことをやっていますが、宇宙船は別です! 私のグリッド セルは現在 256x256 (あなたのプロジェクトには大きすぎると思います) で、ユニットの半径は約 20 です。

于 2012-04-14T04:49:41.443 に答える
0

あなたが説明する問題は、オブジェクトの幅と高さが設定されているため、オブジェクトとして長方形を定義するため、衝突検出の非常に一般的な問題です。

ただし、ピクセルレベルで衝突検出システムを作成するための解決策があります。公式サイトでこれを見つけたので、ピクセルレベルでビットマップの衝突検出を行うことができました。

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7d55.html

同じように役立つことを願っています。

于 2012-04-13T12:34:00.707 に答える