最近在工做中無心才接觸到了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"); } } }
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); } } }
先到這裏,後面再繼續深刻。 對象