0

クラスを作りました

import flash.display.BitmapData;
import flash.geom.ColorTransform;
import flash.geom.Matrix;
import flash.geom.Rectangle;

class com.classes.CollisionDetection {
    static public function checkForCollision(p_clip1:MovieClip,p_clip2:MovieClip,p_alphaTolerance:Number):Rectangle {
        p_clip1.lShots.text = "D";
        // 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;
        }

        // 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;
    }


}

そしてSWFで私は書きます

  import com.classes.CollisionDetection;

    function checkCollision(vMc1, vMc2, vT) {
        // check for collisions:
        var collisionRect:Rectangle = CollisionDetection.checkForCollision(vMc1, vMc2, vT);

        if (collisionRect) {
            return true;
        }
    }

ローカルでは問題なく動作しますが、オンラインでは動作しません。何か案は。クラスパスなどで遊んでみましたが、うまくいきませんでした。:( テスト「D」が表示されると動作しているように見えますが、HIT は動作していません...コードがローカルで動作するがインターネットでは動作しない理由がわかりません。何かアイデアはありますか?

4

1 に答える 1

1

これは、ブラウザでの Flash のスケーリングが原因である可能性があります。形状ベースの衝突検出で使用されるすべての座標は、最初にムービーを作成したときのステージのサイズに基づいているため、スケールすると混乱します。

解決策は、ムービーがスケーリングするときにスケーリングする非表示の参照長方形を作成することです。元のコードにいくつか追加するだけです。これを信用することはできません - Dave Pagrek は、Grant Skinner によるオリジナルのこの修正を作成しました。

import flash.geom.Rectangle;
import flash.display.BitmapData;
import flash.geom.ColorTransform;
import flash.geom.Matrix;
import flash.geom.Point;

checkForCollision = function(p_clip1:MovieClip, p_clip2:MovieClip, p_alphaTolerance:Number):Rectangle  {

    // our magic rectangle:
    if (stageMaskRect) {
        // if this rectangle exists, scale it:
        stageMaskRect._width = Stage.width;
        stageMaskRect._height = Stage.height;
        stageMaskRect._x = 0;
        stageMaskRect._y = 0;
    } else {
        // if not, create it:
        createEmptyMovieClip("stageMaskRect",0);
        stageMaskRect.beginFill(0xFF0000,0);
        stageMaskRect.moveTo(0,0);
        stageMaskRect.lineTo(Stage.width,0);
        stageMaskRect.lineTo(Stage.width,Stage.height);
        stageMaskRect.lineTo(0,Stage.height);
        stageMaskRect.endFill();
        stageMaskRect._x = 0;
        stageMaskRect._y = 0;
    }

    // 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;
    }

    // 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: Here's our magic rectangle:
    var img:BitmapData = new BitmapData(stageMaskRect._width, stageMaskRect._height, 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;
};

うまくいけば、それがあなたを始めさせ、他の誰かが私が解決策を見つけようとしていたフラストレーションを救うでしょう!

于 2014-02-04T14:58:41.670 に答える