itsukichang

フロントエンドが得意なエンジニア.ダーツと旅行とギターが好き

Loaderクラスが面倒だったのでImageLoaderクラスたるものを作ってみた.

画像のリソースが多いと,

  • いっぱい URLRequest 作って,
  • ロードして,
  • ちゃんと読み込み完了したかチェックするイベント作って,
  • チェックしたら幅とか高さ取得したりして,
  • LoaderクラスのままだとaddEventListenerできないから,空のSprite作ってその上において,
  • 中心点ずらしたりして,


なんてことを一個一個のリソースに対してやってるコードが単調になる上にダサいなーとか思ったりしてました.

private var _img1:Loader;
_img1 = new Loader(new URLRequest("hoge.jpg");

↑みたいな書き方すれば若干短くはなるもののそれでもまだ面倒なので, リソースがあるURLをString型で渡してnewすると,

  • URLRequest作って画像読み込んで,
  • Sprite一個かませて,addChildして,
  • 読み込み完了したらdispatchEventでイベント発行して教えてくれて,
  • wid, hei プロパティにそれぞれ高さと幅入って,
  • centerPos() メソッド呼び出したら中心点を画像の中央に変更してくれる

インスタンスを生成してくれるちょっとだけ便利な気がするクラスを作ったりしてみた.

//ImageLoaderクラス
package {
	
	import flash.display.Loader;
	import flash.display.Sprite;
	import flash.net.URLRequest;
	import flash.events.Event;
	import flash.events.EventDispatcher;
	
	public class ImageLoader extends Sprite { 
		
		private var _url:String;
		private var _urlReq:URLRequest;
		private var _loader:Loader;
		private var _sp:Sprite;
		private var _centerFlag:Boolean;
		
		private var _wid:Number;
		private var _hei:Number;
		private var _comp:Boolean;
		
		public static const COMP:String = "complete";
		
		public function ImageLoader(s:String) {
			_url = s;
			init();
		}
		
		private function init():void {
			_urlReq = new URLRequest(_url);
			_loader = new Loader();
			_loader.load(_urlReq);
			_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComp);
		}
		
		private function onComp(e:Event):void {
			_comp = true;
			_wid = _loader.width;
			_hei = _loader.height;
			_sp = new Sprite();
			_sp.addChild(_loader);
			addChild(_sp);
			dispatchEvent(new Event(COMP));
		}
		
		public function centerPos():void { //中心点を画像中央に設定するメソッド
			if (!_centerFlag && _comp) {
				_loader.x = -_wid / 2;
				_loader.y = -_hei / 2;
				this.x = _wid / 2;
				this.y = _hei / 2;
				_centerFlag = true;
			}
		}	
			
		public function get wid():Number { //画像の幅
			return _wid;	
		}
		
		public function get hei():Number { //画像の高さ
			return _hei;
		}
		
		public function get comp():Boolean { //画像が完全に読み込まれたか否か.
			return _comp;
		}
	}
}

まぁ結局,読み込み完了した事を知らせるイベントをもっかい作ってたりして,なんか本末転倒な部分がある気がしないでもないんですが,
とりあえずこれでリソースを複数読み込まなきゃいけない時とかに,ちょっとだけコードがすっきりするかもね!!!11

こんな感じで使う

package {
	
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	
	public class Main extends Sprite {
		
		private var _img:ImageLoader;
		
		public function Main() {
			init();
		}
	
		private function init():void {
			_img = new ImageLoader("itsukichang.png");
			addChild(_img);
			_img.addEventListener(ImageLoader.COMP, onComp);
		}
		
		private function onComp(e:Event):void {
			_img.addEventListener(Event.ENTER_FRAME, onLoop);
			_img.addEventListener(MouseEvent.CLICK, onClick);
		}
		
		private function onLoop(e:Event):void {
			_img.rotation += 2;		
		}
			
		private function onClick(e:MouseEvent):void {
			_img.centerPos(); //クリックされたら中心点変更
		}
	}
}

wonderflって,ここに貼ろうと思ったら,リソースが外部のものになってクロスドメインがうわーっで面倒くさいのでそのうち貼ります.
まぁ要するに,ImageLoaderオブジェクト作って,マウスでクリックしたら中心点変わって,くるくる回るのが画像を中心に回り出すよってことさ!!!!11