0

私はPureActionScript3.0プロジェクトに取り組んでおり、ユーザーはそこに独自のswfsをアプリケーションにアップロードできます。

私の目的は、swfをロードし、ステージに正確にフィットさせることです。問題は、ユーザーがマスクされたswfをアップロードすると、他のswfが正常に動作しているステージに正確に適合しないことです。

ユーザーがステージの幅と高さが600x550でマスクされたswfをアップロードしたが、コンテンツの幅と高さが900 x 800である場合、ステージの解像度が800x600であると考えてください。

この種のswfをステージに合わせるにはどうすればよいですか?

4

2 に答える 2

1

マスクされた SWF の境界を決定するには、 を使用しますBitmapData

たとえば、100x100 から始まる 200x200 にマスクされた 400x400 の swf を作成しました (ダウンロード)

マスクされた SWF

この SWF をロードすると、幅 / 高さとして 400x400 がレポートされます。

マスクされていないコンテンツの可視境界を取得するには、次を実装できます。

package
{
    import flash.display.BitmapData;
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.geom.Rectangle;
    import flash.net.URLRequest;

    [SWF(width = 400, height = 400, backgroundColor = 0xefefef, frameRate = 60)]
    public class X extends Sprite
    {

        private var loader:Loader;

        public function X()
        {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;

            loader = new Loader();
            var url:URLRequest = new URLRequest("http://jasonsturges.com/labs/stack-overflow/examples/swf-mask/masked.swf");
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
            loader.load(url);
        }

        protected function completeHandler(event:Event):void
        {
            var bitmapData:BitmapData = new BitmapData(loader.width, loader.height, true, 0);
            bitmapData.draw(loader);
            var bounds:Rectangle = bitmapData.getColorBoundsRect(0xff000000, 0xff000000, true);
            trace(bounds);
        }
    }
}

どのレポート:

(x=100、y=100、w=200、h=200)

したがって、表示されるコンテンツは 100x100 から始まる 200x200 です。

ステージのサイジングごとに、ステージ上の空白/空の領域を回避するための制約を決定する必要があります。

これは、比率変数を使用して実装できます。

var ratio:Number = 1.0;

比例スケーリング (幅による):

var ratio:Number = stage.stageWidth / bounds.width;

loader.scaleX = ratio;
loader.scaleY = ratio;
loader.x = -(bounds.x * ratio);
loader.y = -(bounds.y * ratio);

ステージに合わせて表示オブジェクトを引き伸ばす:

ader.scaleX = stage.stageWidth / bounds.width;
loader.scaleY = stage.stageHeight / bounds.height;
loader.x = -(bounds.x * (stage.stageWidth / bounds.width));
loader.y = -(bounds.y * (stage.stageHeight / bounds.height));

したがって、ロードされたコンテンツを合わせて、マスク オフセットを考慮してステージ全体を埋めるように引き延ばします。

package
{
    import flash.display.BitmapData;
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.geom.Rectangle;
    import flash.net.URLRequest;

    [SWF(percentWidth = 100, percentHeight = 100, backgroundColor = 0xefefef, frameRate = 60)]
    public class X extends Sprite
    {

        private var loader:Loader;

        public function X()
        {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;

            loader = new Loader();
            var url:URLRequest = new URLRequest("http://jasonsturges.com/labs/stack-overflow/examples/swf-mask/masked.swf");
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
            loader.load(url);
        }

        protected function completeHandler(event:Event):void
        {
            var bitmapData:BitmapData = new BitmapData(loader.width, loader.height, true, 0);
            bitmapData.draw(loader);
            var bounds:Rectangle = bitmapData.getColorBoundsRect(0xff000000, 0xff000000, true);
            trace(bounds);

            addChild(loader);

            loader.scaleX = stage.stageWidth / bounds.width;
            loader.scaleY = stage.stageHeight / bounds.height;
            loader.x = -(bounds.x * (stage.stageWidth / bounds.width));
            loader.y = -(bounds.y * (stage.stageHeight / bounds.height));
        }
    }
}
于 2012-10-30T05:41:01.090 に答える
0

正確な適合を得るには、コンテンツとホルダー比率の両方を比較する必要があります。外部 SWF をロードしている場合、幅/高さの情報はloaderInfo、ロードされた displayObject コンテンツのサイズではなく、SWF のメタデータから取得する必要があります。これが機能することを確認するための wonderfl へのリンクは次のとおりです: http://wonderfl.net/c/eRYv

そして、比率を比較する単純な関数は次のとおりです。

function makeItFit(cont:Sprite, hold:Sprite):void{
        var holderRatio:Number = hold.width/hold.height;
        var contentRatio:Number = cont.width/cont.height;
        //compare both ratios to get the biggest side
        if(holderRatio < contentRatio){
           cont.width = hold.width; //width bigger, lets make it fit
           cont.scaleY = cont.scaleX; //adjust scale to avoid distortion
        }else{
           cont.height = hold.height;
           cont.scaleX = cont.scaleY;
        }
        //now the size is ok, lets center the thing
        cont.x = (hold.width - cont.width)/2;
        cont.y = (hold.height - cont.height)/2;
}

loaderInfo外部 SWF をロードする場合は、幅/高さのデータを使用してください。これはほんの一例です。

于 2012-10-30T22:09:49.397 に答える