最近在工做中无心才接触到了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); } } }
先到这里,后面再继续深刻。 对象