2013-06-25

ActionScript3.0で外部画像ファイルを読み込む

外部画像ファイル(32bitPNG) を読み込んで表示する。

http://f.hatena.ne.jp/itouhiro/20130624222235 の画像をFlashで読み込んで表示している。この画像は http://wonderfl.net/c/wu8f で提供されている素材をまとめた。

package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.display.Loader;
    
    /**
     * ...
     * @author itouhiro
     */
    [SWF(width="465", height="465", frameRate="30", backgroundColor="0x888888")]
    public class Main extends Sprite {
        private var preload:Preloader;
        static public var loading:int = 0;
        
        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
            
            preload = new Preloader();
            trace('preload');
            addEventListener(Event.ENTER_FRAME, enterFrameHandler);
        }
        
        private function enterFrameHandler(e:Event):void {
            if (loading <= 0) return;
            
            removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
            var img:Loader = preload.get();
            addChild(img);
        }
    }
}
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.net.URLRequest;
import flash.text.TextField;
import flash.text.TextFormat;

class Preloader extends Sprite{
    private var preloadText:TextField = null;
    private var ld:Loader;
    
    public function Preloader():void {
        trace('constructor');
        ld = new Loader();
        ld.load(new URLRequest('http://img.f.hatena.ne.jp/images/fotolife/i/itouhiro/20130624/20130624222235.png'));
        ld.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loadProgressHandler);
        ld.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompleteHandler);
    }
    
    public function get():Loader {
        return ld;
    }
    
    private function loadCompleteHandler(e:Event):void {
        removeChild(preloadText);
        Main.loading++;
    }
    
    private function loadProgressHandler(e:ProgressEvent):void {
        if ( ! preloadText) {
            //preloader
            preloadText = new TextField();
            preloadText.x = 160; preloadText.y = 12; preloadText.width = 160;
            preloadText.defaultTextFormat = new TextFormat('Verdana', 16);
            preloadText.text = 'Loading: 0 %';
            addChild(preloadText);
        }
        var percentLoaded:Number = Math.round(e.bytesLoaded / e.bytesTotal * 100);
        preloadText.text = 'Loading: ' + percentLoaded + ' %';
        trace('Loading: ' + percentLoaded + ' %');
    }
}

読み込んだ画像をBitmapとして扱う

読み込んだ画像をマップチップとして扱うには‥

Mainクラスだけ変更している。Preloaderクラスは変更してない。

package {
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.geom.Matrix;
    import flash.geom.Point;
    import flash.geom.Rectangle;
    
    /**
     * ...
     * @author itouhiro
     */
    [SWF(width="465", height="465", frameRate="30", backgroundColor="0x888888")]
    public class Main extends Sprite {
        private var preload:Preloader;
        static public var loading:int = 0;
        
        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
            
            preload = new Preloader();
            trace('preload');
            addEventListener(Event.ENTER_FRAME, enterFrameHandler);
        }
        
        private function enterFrameHandler(e:Event):void {
            if (loading <= 0) return;
            
            removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
            //画像を読み込み
            var img:Bitmap = Bitmap(preload.get().content);
            //画像の縦横比を3倍にしてmapDataにcopy
            var mapData:BitmapData = new BitmapData(img.width * 3, img.height * 3, true, 0x00000000);
            var matrix:Matrix = new Matrix(); matrix.scale(3, 3);
            mapData.draw(img, matrix);
            
            //地形をbgDataに配置
            var mapTable:Array = [
                 [ 0, 9, 0, 0, 0, 0, 1, 0, 0, 0],
                 [ 0, 9, 0, 0, 0, 0, 0, 0, 0, 0],
                 [ 0, 9, 0, 0, 0, 0, 0, 0, 0, 0],
                 [ 0, 9, 0, 0, 0, 0, 0, 0, 6, 0],
                 [ 0, 9, 0, 0, 0, 0, 0, 0, 0, 0],
                 [ 1, 9, 0, 0, 0, 0, 0, 0, 0, 0],
                 [ 1, 9, 9, 9, 9, 9, 9, 4, 4, 9],
                 [ 1, 0, 0, 0, 9, 9, 0, 0, 0, 0],
                 [ 1, 1, 0, 0, 5, 5, 0, 0, 0, 0],
                 [ 1, 1, 1, 9, 9, 9, 9, 0, 0, 1],
            ];
            var bgData:BitmapData = new BitmapData(mapTable[y].length * 48, mapTable.length * 48, false, 0x333333);
            for (var y:int = 0; y < mapTable.length; y++) {
                for (var x:int = 0; x < mapTable[y].length; x++) {
                    bgData.copyPixels(mapData, new Rectangle(mapTable[y][x]*48, 0, 48, 48), new Point(x*48, y*48));
                }
            }
            
            //勇者を配置
            bgData.copyPixels(mapData, new Rectangle(0, 48, 48, 48), new Point(mapTable[0].length * 48 / 2, mapTable.length * 48 / 2));
            
            //画面表示
            var bg:Bitmap = new Bitmap(bgData);
            bg.x = -16; bg.y = -16;
            addChild(bg);
        }
    }
}
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.net.URLRequest;
import flash.system.LoaderContext;
import flash.text.TextField;
import flash.text.TextFormat;

class Preloader extends Sprite{
    private var preloadText:TextField = null;
    private var ld:Loader;
    
    public function Preloader():void {
        trace('constructor');
        ld = new Loader();
        ld.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompleteHandler);
        ld.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loadProgressHandler);
        //ld.load(new URLRequest('http://assets.wonderfl.net/images/related_images/b/b7/b792/b79283aedf18f496ed0b3bbffbdb5165a389c381'), new LoaderContext(true));
        //ld.load(new URLRequest('https://sites.google.com/site/itouhiro/2013/20130624wfquest.png'), new LoaderContext(true));
        ld.load(new URLRequest('http://img.f.hatena.ne.jp/images/fotolife/i/itouhiro/20130624/20130624222235.png'), new LoaderContext(true));
    }
    
    public function get():Loader {
        return ld;
    }
    
    private function loadCompleteHandler(e:Event):void {
        removeChild(preloadText);
        Main.loading++;
    }
    
    private function loadProgressHandler(e:ProgressEvent):void {
        if ( ! preloadText) {
            //preloader
            preloadText = new TextField();
            preloadText.x = 160; preloadText.y = 12; preloadText.width = 160;
            preloadText.defaultTextFormat = new TextFormat('Verdana', 16, 0x000000);
            preloadText.text = 'Loading: 0 %';
            addChild(preloadText);
        }
        var percentLoaded:Number = Math.round(e.bytesLoaded / e.bytesTotal * 100);
        preloadText.text = 'Loading: ' + percentLoaded + ' %';
        trace('Loading: ' + percentLoaded + ' %');
    }
}

ただし、これはローカルPCでは動作するが、Webにswf掲載すると「セキュリティの都合でpng画像を読めない」。 wonderfl.netにAS3投稿すれば、wonderfl.netに添付した画像なら読み込めるようだ。 投稿した。

https://sites.google.com/site/itouhiro/2013/20130624wfquest.swf

(追記 2013-07-11) キャラを操作できるようにした。キャラチェンジも可能にして、キャラ画像をすべて確認できるようにした。

0 件のコメント:

コメントを投稿

人気記事