BONKURA BLOG

仕事のメモ帳ブログ。いまのところActionScriptメイン。たまにCSSとかJavaScriptとか。

順番に関数を実行する

ActionScript2.0で定番でつかっていた実行した関数が終了したら、また同じ関数を呼び出す処理をActionScript3.0で。

このブログのサイドメニューのような動きもこれで可能(上から順番に出てくる動き)。

package 
{
	import flash.display.DisplayObjectContainer;
	import flash.display.Sprite;
	import flash.events.Event;
	/**
	 * ...
	 * @author DefaultUser (Tools -> Custom Arguments...)
	 */
	public class Bars 
	{
		var container:DisplayObjectContainer;
		var stageW:int;
		var stageH:int;
		var barH:int;
		var barNo:uint = 0;
		var barCnt:uint = 10;
		
		public function Bars(theContainer:DisplayObjectContainer)
		{
			container = theContainer;
			stageW = container.stage.stageWidth;
			stageH = container.stage.stageHeight;
			barH = Math.ceil(stageH / barCnt);
			nextBar();
		}
		
		private function nextBar():void
		{
			barNo++;
			if (barNo <= barCnt)
			{
				var sp:Sprite = new Sprite();
				container.addChild(sp);
				sp.x = 0;
				sp.y = barH * (barNo - 1);
				sp.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
				drawBar(sp);
			}
		}
		
		private function drawBar(sp:Sprite):void
		{
			var color:uint = 0xFFFFFF * Math.random();
			var alpha:Number = 1.0;
			sp.graphics.beginFill(color, alpha);
			sp.graphics.drawRect(0, 0, 1, barH);
			sp.graphics.endFill();
		}
		
		private function enterFrameHandler(e:Event):void
		{
			var barSprite:Sprite = e.target as Sprite;
			var barW:Number = barSprite.width;
			if (barW < stageW)
			{
				barSprite.width = barW * 2;
			}
			else
			{
				barSprite.width = stageW;
				barSprite.removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
				nextBar();
			}
		}
	}
	
}

barSprite.removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
で終了したイベントは消去しているのに注意。
エンターフレームは、if (barNo <= barCnt)で実行に条件がついています。
条件外の場合はエンターフレームは動作しません。

このエントリーをはてなブックマークに追加 Save This Page to del.icio.us