AS3 Signals学习笔记01

╄→гoц情女王★ 提交于 2020-02-29 21:43:33

        

        最近在工作中无意才接触到了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);
		}
	}
}

        先到这里,后面再继续深入。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!