0

さて、私はFlashでゲームをしています.これはプラットフォームゲームです.このゲームではスパイクを飛び越える必要があります.そこで私はスパイクを作成し、それをシンボルであるムービークリップに変換します.ムービークリップとして登録すると、そうではありません.三角形(スパイクのような)ではなく、長方形です。これは、プレーヤーがスパイクを避けてジャンプするときに、近すぎると死ぬことを意味しますが、スパイクに当たらない場合は、周囲の目に見えない長方形に当たりますスパイク.映画クリップの形状を変更して、スパイクとスパイクのみに合うようにする方法はありますか.

4

4 に答える 4

0

オブジェクト間の内部ヒット テストでは、オブジェクトのバウンディング ボックスがチェックされるため、うまくいきません。

プレイヤーエージェントをポイントとして使用できる場合(足の真ん中などの最も低いポイント)、使用できますspike.hitTestPoint(globalFootX, globalFootY, true);

それが機能しない場合は、アイテムのヒットテスト表現を手動で作成し、独自のヒットテスト ロジックを実行する必要があります。

もう 1 つの解決策は、アイテムを別のスプライトに描画してから、ピクセルが重なるかどうかを確認することです。これは、不規則な形の世界を動き回る不規則な形の AI ロボットを使用した古い AS2 プロジェクトで行ったことを知っています。

参照用にそのコードを提供します。AS3 に変換できる可能性があります。少なくとも、AS3 でそのソリューションを見つけるために何を検索するかのインスピレーションとしてそれを使用できます。

class messer_studios.utils.CollisionDetection {
    static public function checkForCollision(p_clip1:MovieClip, p_clip2:MovieClip, p_alphaTolerance:Number):Rectangle {     
        // set up default params:
        if (p_alphaTolerance == undefined) {
            p_alphaTolerance = 255;
        }

        // get bounds:   
        var bounds1:Object = p_clip1.getBounds(_root);
        var bounds2:Object = p_clip2.getBounds(_root);

        // rule out anything that we know can't collide:
        if (((bounds1.xMax < bounds2.xMin) || (bounds2.xMax < bounds1.xMin)) || ((bounds1.yMax < bounds2.yMin) || (bounds2.yMax < bounds1.yMin))) {
            return null;
        }
        //Debug.log("might collide");

        // determine test area boundaries:   
        var bounds:Object = {};
        bounds.xMin = Math.max(bounds1.xMin, bounds2.xMin);
        bounds.xMax = Math.min(bounds1.xMax, bounds2.xMax);
        bounds.yMin = Math.max(bounds1.yMin, bounds2.yMin);
        bounds.yMax = Math.min(bounds1.yMax, bounds2.yMax);

        // set up the image to use:
        var img:BitmapData = new BitmapData(bounds.xMax-bounds.xMin, bounds.yMax-bounds.yMin, false);

        // draw in the first image:
        var mat:Matrix = p_clip1.transform.concatenatedMatrix;
        mat.tx -= bounds.xMin;
        mat.ty -= bounds.yMin;
        img.draw(p_clip1, mat, new ColorTransform(1, 1, 1, 1, 255, -255, -255, p_alphaTolerance));

        // overlay the second image:
        mat = p_clip2.transform.concatenatedMatrix;
        mat.tx -= bounds.xMin;
        mat.ty -= bounds.yMin;
        img.draw(p_clip2, mat, new ColorTransform(1, 1, 1, 1, 255, 255, 255, p_alphaTolerance), "difference");

        // find the intersection:
        var intersection:Rectangle = img.getColorBoundsRect(0xFFFFFFFF, 0xFF00FFFF);
        // if there is no intersection, return null:
        if (intersection.width == 0) {
            return null;
        }

        // adjust the intersection to account for the bounds:   
        intersection.x += bounds.xMin;
        intersection.y += bounds.yMin;
        return intersection;
    };

    public static function hitTestShape(mc1:MovieClip, mc2:MovieClip, alphaTolerence:Number):Boolean {
        return checkForCollision(mc1, mc2, alphaTolerence) != null ? true : false;
    }
}
于 2013-03-31T15:40:00.930 に答える
0

BitmapDataと一緒に使用して、hitTestピクセルレベルの衝突をそのようにチェックできます。

(コードをテストするには、Flash ステージに「rectClip」と「spike」の 2 つのシンボルを配置します。また、最初にそれらを離してテストし、次にそれらに触れたままにしてテストします。)

(どちらの方法でも、ライブで設定MouseMoveまたはstartDrag()確認できます。)

var rect:Rectangle = rectClip.getBounds(this);
var rectClipBmpData = new BitmapData(rect.width, rect.height, true, 0);
rectClipBmpData.draw(rectClip);

var spikeRect:Rectangle = spike.getBounds(this);
var spikeBmpData = new BitmapData(spikeRect.width, spikeRect.height, true, 0);
spikeBmpData.draw(spike);

if(rectClipBmpData.hitTest(new Point(rectClip.x, rectClip.y),
                                 255,
                                 spikeBmpData,
                                 new Point(spike.x,spike.y),
                                 255 ))
{
     trace("hit");
}else
{
     trace("No hit");
}

幸運。

于 2013-03-31T20:02:17.120 に答える