3

だから私は現在、2D 衝突チェックが必要な AS3 を使用してゲームに取り組んでいます。これを行うために、私は当然 bitmapData と hitTest を使用していましたが、それを適切に行うことができなかったため、freeactionscript.com の CollisionTest エンジンを使用することにしました。ただし、これを使用しても問題が発生するため、含まれている画像を使用して説明します。

  1. セットアップ - 黄色のキャラクターと灰色の四角があります。
  2. 黄色のキャラクターが灰色の四角で止まっているのがはっきりとわかります。この時点で、私はこれ以上歩くことができません。
  3. 広場の下もいいし、ここもこれ以上歩けない。
  4. さて、ここにジレンマがあります-衝突検出は右下隅でうまく機能します。正方形の他の部分では自由に歩き回ることができ、余分な衝突 (つまり、灰色の正方形の外側) は発生しません。

私はこのコードを使用しています:

public class CollisionTest 
{
    // vars
    private var _returnValue:Boolean;

    private var _onePoint:Point;
    private var _twoPoint:Point;

    private var _oneRectangle:Rectangle;
    private var _twoRectangle:Rectangle;

    private var _oneClipBmpData:BitmapData;
    private var _twoClipBmpData:BitmapData;

    private var _oneOffset:Matrix;
    private var _twoOffset:Matrix;

    /**
     * Complex collision test. Use this for objects that are rotated, scaled, skewed, etc
     * @param   clip1   Takes DisplayObjectContainer as argument. Can be a Sprite, MovieClip, etc.
     * @param   clip2   Takes DisplayObjectContainer as argument. Can be a Sprite, MovieClip, etc.
     * @return  Collision True/False
     */
    public function complex(clip1:DisplayObjectContainer, clip2:DisplayObjectContainer):Boolean
    {
        _returnValue = false;

        _twoRectangle = clip1.getBounds(clip1);
        _oneOffset = clip1.transform.matrix;
        _oneOffset.tx = clip1.x - clip2.x;
        _oneOffset.ty = clip1.y - clip2.y;  

        _twoClipBmpData = new BitmapData(_twoRectangle.width, _twoRectangle.height, true, 0);
        _twoClipBmpData.draw(clip1, _oneOffset);        

        _oneRectangle = clip2.getBounds(clip2);
        _oneClipBmpData = new BitmapData(_oneRectangle.width, _oneRectangle.height, true, 0);

        _twoOffset = clip2.transform.matrix;
        _twoOffset.tx = clip2.x - clip2.x;
        _twoOffset.ty = clip2.y - clip2.y;  

        _oneClipBmpData.draw(clip2, _twoOffset);

        _onePoint = new Point(_oneRectangle.x, _oneRectangle.y);
        _twoPoint = new Point(_twoRectangle.x, _twoRectangle.y);

        if(_oneClipBmpData.hitTest(_onePoint, 255, _twoClipBmpData, _twoPoint, 255))
        {
            _returnValue = true;
        }

        _twoClipBmpData.dispose();
        _oneClipBmpData.dispose();

        return _returnValue;
    }

どなたかお力添えいただければ大変助かります。必要に応じて、ここで自分で試すことができます。

事前に感謝します、-UPTX

tl;dr: ここに示すように、hitTest は灰色の正方形の 1/4 で機能します絵が含まれています

4

1 に答える 1

1

私があなたの問題を理解しているように:

public function complex(clip1:DisplayObjectContainer, clip2:DisplayObjectContainer):Boolean
{
    _returnValue = false;

    _twoRectangle = clip1.getBounds(clip1);

この時点で、クリップの変換されていない境界が得られます。たとえば、ボックスが回転すると別の境界があります。ユニットの形状が「箱」よりも「円」の方が多いという理由だけで、あなたの場合は大きな問題ではありません。

しかし、中央のスプライトを使用すると、主な問題 (写真のように) が発生します。コンテンツの半分が「負の」空間座標にある場合です。この場合、メソッドgetBoundsは負の左上隅を返します。したがって、このオブジェクトのビットマップデータには、スプライトの一部しかありません。

メソッドの迅速な修正が必要な場合は、マトリックスの設定を次のように変更します。

   _oneOffset.tx = clip1.x-clip2.x-_twoRectangle.x;
   _oneOffset.ty = clip1.y-clip2.y-_twoRectangle.x;

   _twoOffset.tx = clip2.x - clip2.x-_oneRectangle.x;
   _twoOffset.ty = clip2.y - clip2.y-_oneRectangle.y;

ただし、注意してください: この方法で交差点を正しく計算するには、次のものが必要です。

1) レンダリング方法を変更します。たとえば、オブジェクトを親に囲み、この親を描画すると、正しいバウンディング ボックスが得られます。

2) バウンディングを手動で計算できます:回転した長方形からバウンディング ボックスの座標を計算します。

うまくいけば、それは役に立ちます。

于 2012-09-14T10:09:24.860 に答える