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 件のコメント:
コメントを投稿