2014-06-10

Flashで外部swfに埋め込んだMovieClipを使う

Flash(ActionScript3)で外部swfに埋め込んだMovieClipをMapTipとして使うことができたのでメモ。

環境 * Windows7 64bit * Flash Pro CS3 * FlashDevelop 4.6.1

まずはベクター素材でMapTipを作成。サイズは 32x32 にしておいた(W:32, H:32)。

ポイントは

  • 「ActionScriptに書き出し」チェックボックスをON。(←MovieClipを選べばチェック可能)
  • maptip左端を原点(0,0)にする。
  • 「MapPlayer」の横幅じたいは22くらいしかないが、32x32の矩形を下に敷いて、その左右真ん中にくるように配置した。その下敷きはlayer非表示にしてもswfでは表示されるから、あとで削除。

これをパブリッシュして、swfを生成。

次にFlashDevelopで、そのswfを読み込み、画面に配置するプログラムを作成。

Main.as

package {
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.events.Event;

    /**
     * ...
     * @author itouhiro
     */
    [SWF(width = "160", height = "160", frameRate = "30", backgroundColor = "0x888888")]
    public class Main extends Sprite {
        private var preload:Preloader;
        static public var isLoaded:Boolean = false;
        static public var maptip:Object;
        private var maptipNames:Array = ['MapGrass','MapPlayer','MapSand','MapSea'];

        public function Main():void {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
            maptip = {};
            preload = new Preloader(maptipNames);
            addChild(preload);
            addEventListener(Event.ENTER_FRAME, enterFrameHandler);
        }

        private function enterFrameHandler(e:Event):void {
            if ( ! isLoaded) return;
            removeEventListener(Event.ENTER_FRAME, enterFrameHandler);

            var mapTable:Array = [
                [ 'MapGrass', 'MapGrass', 'MapSand', 'MapSand'],
                [ 'MapGrass', 'MapGrass', 'MapGrass', 'MapSand'],
                [ 'MapSea', 'MapGrass', 'MapGrass', 'MapSand'],
                [ 'MapSea', 'MapSea', 'MapSea', 'MapSand']
            ];
            var mc:MovieClip;
            for (var ay:int = 0; ay < mapTable.length; ay++) {
                for (var ax:int = 0; ax < mapTable[ay].length; ax++) {
                    mc = new maptip[mapTable[ay][ax]];
                    mc.x = ax * 32;
                    mc.y = ay * 32;
                    addChild(mc);
                }
            }
            mc = new maptip['MapPlayer'];
            mc.x = 32;
            mc.y = 32;
            addChild(mc);
        }
    }
}

Preloader.as

package  {
    import adobe.utils.CustomActions;
    import flash.display.Loader;
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.ProgressEvent;
    import flash.net.URLRequest;
    import flash.system.ApplicationDomain;
    import flash.system.LoaderContext;
    import flash.text.TextField;
    import flash.text.TextFormat;
    /**
     * ...
     * @author itouhiro
     */
    public class Preloader extends Sprite {
        private var url:String = 'https://sites.google.com/site/itouhiro/2013/20140610maptipData.swf';
        private var ld:Loader;
        private var preloadText:TextField;
        private var classNames:Array;

        public function Preloader(arr:Array):void {
            classNames = arr;
            ld = new Loader();
            ld.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loadProgressHandler);
            ld.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompleteHandler);
            ld.load(new URLRequest(url));
        }

        private function loadCompleteHandler(e:Event):void {
            if (preloadText) removeChild(preloadText);
            var dmn:ApplicationDomain = ld.contentLoaderInfo.applicationDomain;
            for (var i:int = 0; i < classNames.length; i++) {
                var c:Class = dmn.getDefinition(classNames[i]) as Class;
                Main.maptip[classNames[i]] = c;
            }
            Main.isLoaded = true;
        }

        private function loadProgressHandler(e:ProgressEvent):void {
            if ( ! preloadText) {
                preloadText = new TextField();
                preloadText.x = 16; preloadText.y = 64; preloadText.width = 144;
                preloadText.defaultTextFormat = new TextFormat('Verdana', 14, 0xffffff, true);
                preloadText.text = 'Loading:   0 %';
                addChild(preloadText);
            }
            var percent:int = Math.round(e.bytesLoaded / e.bytesTotal * 100);
            preloadText.text = 'Loading: ' + ('  '+percent.toString()).substr(-3) + ' %';
        }

        public function get():Loader {
            return ld;
        }
    }
}

実Flash。操作不可。

0 件のコメント:

コメントを投稿

人気記事