最近在工作中无意才接触到了as3 signals这个玩意。AS3 Signals是个开源的轻量级框架,这个框架基本可以代替as3中内置的事件这套工作机制。好棒!因为在项目中,使用as3内置事件框架必须通过自定义事件才可以实现值的传递,大量自定义事件、定义常量和整个事件派发的管理、添加侦听器、移除侦听器,或多或少都会带来大量的代码,而signals这个框架思想原来在C#中原本就有,作者整合了C#中的signals思想,实现起来比as3内置的事件更快捷,可以很轻松的实现多个强类型值的传递,的在一定程度上也会简化很多代码。有朋友测试,signals里面用内置的事件竟然是as3内置事件运行速度的4倍。这个我还没测试。
我们知道上图就是as3中的事件流,而在as3中要想派发事件,那派发者必须继承EventDispatcher或者实现IEventDispatcher接口。在Signals中就派发者就不用这么麻烦了。
Signals: Think Outside the Event
Signals:脱离事件思考
signal的中文意思是“信号”,那具体指的是什么呢?
什么是Signal? 一个Signal其本质上是一个微型的针对某个事件的特定的派发者,附带它本身的监听者数组。 一个Signal的基本概念就是,不会使用类似内置事件那种方式、基于字符串的频道,而是化为一个类中具体的event/signal成员。这意味着我们这些开发者,在对象之间如何连接和沟通等方面,有了更多的控制。我们不再需要字符串变量来代表我们的Signals。Signals能够表达为真正的对象。1.一个简单的代码片段对比
//使用EventDispatcher
button.addEventListener(MouseEvent.CLICK, onClick);
//等价signal;推荐过去式(clicked)
button.clicked.add(onClicked);
2.简单的例子实现
效果看这里
Pig类:
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);
}
}
}
先到这里,后面再继续深入。
来源:oschina
链接:https://my.oschina.net/u/865151/blog/97811