AS3 Signals學習筆記01

        

        最近在工做中無心才接觸到了as3 signals這個玩意。AS3 Signals是個開源的輕量級框架,這個框架基本能夠代替as3中內置的事件這套工做機制。好棒!由於在項目中,使用as3內置事件框架必須經過自定義事件才能夠實現值的傳遞,大量自定義事件、定義常量和整個事件派發的管理、添加偵聽器、移除偵聽器,或多或少都會帶來大量的代碼,而signals這個框架思想原來在C#中本來就有,做者整合了C#中的signals思想,實現起來比as3內置的事件更快捷,能夠很輕鬆的實現多個強類型值的傳遞,的在必定程度上也會簡化不少代碼。有朋友測試,signals裏面用內置的事件居然是as3內置事件運行速度的4倍。這個我還沒測試。 數組

       

        咱們知道上圖就是as3中的事件流,而在as3中要想派發事件,那派發者必須繼承EventDispatcher或者實現IEventDispatcher接口。在Signals中就派發者就不用這麼麻煩了。
app

        Signals: Think Outside the Event 框架

        Signals:脫離事件思考 ide

        signal的中文意思是「信號」,那具體指的是什麼呢? 測試

什麼是Signal? 一個Signal其本質上是一個微型的針對某個事件的特定的派發者,附帶它自己的監聽者數組。 一個Signal的基本概念就是,不會使用相似內置事件那種方式、基於字符串的頻道,而是化爲一個類中具體的event/signal成員。這意味着咱們這些開發者,在對象之間如何鏈接和溝通等方面,有了更多的控制。咱們再也不須要字符串變量來表明咱們的Signals。Signals可以表達爲真正的對象。
        1.一個簡單的代碼片斷對比    

//使用EventDispatcher
button.addEventListener(MouseEvent.CLICK, onClick);

//等價signal;推薦過去式(clicked)
button.clicked.add(onClicked);

        2.簡單的例子實現 this

    效果看這裏
spa

        

Pig類: code

package  
{
	import flash.display.Bitmap;
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import org.osflash.signals.natives.NativeSignal;
	import org.osflash.signals.Signal;
	
	/**
	 * ...
	 * @author Childhood
	 */
	public class Pig extends Sprite 
	{
		[Embed(source = "../assets/pig.png")]
		private var PigImg:Class;
		private var pig:Bitmap;
		private var health:int;
		
		public var hitPig:Signal;
		public var killedPig:Signal;
		public var clicked:NativeSignal;
		public function Pig() 
		{
			//init img
			pig = new PigImg();
			addChild(pig);
			
			//init health
			health = 12;
			
			//init signals
			hitPig = new Signal(String, int);
			killedPig = new Signal(String);
			clicked = new NativeSignal(this, MouseEvent.CLICK, MouseEvent);
			
			this.buttonMode = true;
		}
		
		public function hit():void {
			health--;
			
			hitPig.dispatch("hit pig", health);
			if (health <= 0)
				killPig();
		}
		
		private function killPig():void {
			killedPig.dispatch("You killed the pig");
		}
		
	}

}

主類Main:
package 
{
	import flash.display.Bitmap;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.text.TextField;
	
	/**
	 * ...
	 * @author Childhood
	 */
	public class Main extends Sprite 
	{
		private var pig:Pig;
		private var showTxt:TextField;
		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);
			
			addPig();
			addShowTxt();
			
			//添加signals的偵聽器
			pig.hitPig.add(onHitPig);
			pig.killedPig.add(onKilledPig);
			pig.clicked.add(onClickedPig);
		}
		
		private function onHitPig(message:String, health:int):void 
		{
			showTxt.appendText(message + ", the pig's health now is " + health + "\n");
		}
		
		private function onKilledPig(message:String):void 
		{
			showTxt.appendText(message + "\n");
			
			//移除signals偵聽器
			pig.hitPig.remove(onHitPig);
			pig.killedPig.remove(onKilledPig);
			pig.clicked.remove(onClickedPig);
			
			removeChild(pig);
		}
		
		private function onClickedPig(evt:MouseEvent):void 
		{
			pig.hit();
		}
		
		private function addShowTxt():void 
		{
			showTxt = new TextField();
			with (showTxt) {
				x = 50;
				y = 150;
				width = 300;
				height = 300;
				border = true;
				borderColor = 0xffff00;
				textColor = 0xffffff;
			}
			addChild(showTxt);
		}
		
		private function addPig():void 
		{
			pig = new Pig();
			pig.x = 30;
			pig.y = 30;
			addChild(pig);
		}
	}
}

        先到這裏,後面再繼續深刻。 對象

相關文章
相關標籤/搜索