AS3消息机

来源:互联网 发布:小学教师 知乎 编辑:程序博客网 时间:2024/05/22 17:10
/** * VERSION: 3 * DATE: 2013-10-12 * CLK/陈泽丹 **/package MsgServer.DefineBag{import flash.utils.Dictionary;public interface IMsgListener{function OnEvt( _evt:Object ):Boolean;}}


/** * VERSION: 3 * DATE: 2013-10-12 * CLK/陈泽丹 **/package MsgServer.DefineBag{import flash.utils.Dictionary;public interface IMsgServer{function AddListener( _msg:String, _lst:IMsgListener ):Boolean;function RemoveListener( _msg:String, _lst:IMsgListener ):void;function DispatchEvt( _msg:String, _evt:Object ):Boolean;}}

/** * VERSION: 3 * DATE: 2013-10-12 * CLK/陈泽丹 **/package MsgServer.DefineBag{import flash.utils.Dictionary;public interface IMsgSvrManager{function AddListener( _msg:String, _lst_type:int, _lst:IMsgListener ):Boolean;function RemoveListener( _msg:String, _lst_type:int, _lst:IMsgListener ):void;function DispatchEvt( _msg:String, _evt:Object ):void;}}

/** * VERSION: 3 * DATE: 2013-10-12 * CLK/陈泽丹 **/package MsgServer.MsgListen{import MsgServer.DefineBag.IMsgListener;import MsgServer.MsgServerBag.MsgServerManagerHelper;public class ActionHelper extends BaseEvtHelper{public function ActionHelper( _msg_svr:MsgServerManagerHelper, _msg:String, _callback:Function, _condition:Object = null ){super(_msg_svr, _msg, _callback, _condition);}public function Init() : Boolean{return m_msg_svr.GetSvr().AddListener(m_msg, m_msg_svr.ACTION, this);}public function Uninit() : void{m_msg_svr.GetSvr().RemoveListener(m_msg, m_msg_svr.ACTION, this);}public override function OnEvt( _buf:Object ):Boolean{if( null != m_condition && null != _buf ){var sign:String = "";for( sign in m_condition ){if( m_condition[sign] != _buf[sign] ){return true;}}}m_fun(_buf);return true;}};}

/** * VERSION: 3 * DATE: 2013-10-12 * CLK/陈泽丹 **/package MsgServer.MsgListen{import MsgServer.DefineBag.IMsgListener;import MsgServer.MsgServerBag.MsgServerManagerHelper;public class BaseEvtHelper implements IMsgListener{protected var m_msg_svr:MsgServerManagerHelper = null;protected var m_msg:String = "";protected var m_fun:Function = null;protected var m_condition:Object = null;public function BaseEvtHelper( _msg_svr:MsgServerManagerHelper, _msg:String, _callback:Function, _condition:Object = null ){m_msg_svr = _msg_svr;m_msg = _msg;m_fun = _callback;m_condition = _condition;}public function OnEvt( _buf:Object ):Boolean{ return true; }}}

/** * VERSION: 3 * DATE: 2013-10-12 * CLK/陈泽丹 **/package MsgServer.MsgListen{import MsgServer.DefineBag.IMsgListener;import MsgServer.MsgServerBag.MsgServerManagerHelper;public class VoteHelper extends BaseEvtHelper{public function VoteHelper( _msg_svr:MsgServerManagerHelper, _msg:String, _callback:Function, _condition:Object = null ){super(_msg_svr, _msg, _callback, _condition);}public function Init() : Boolean{return m_msg_svr.GetSvr().AddListener(m_msg, m_msg_svr.VOTE, this);}public function Uninit() : void{m_msg_svr.GetSvr().RemoveListener(m_msg, m_msg_svr.VOTE, this);}public override function OnEvt( _buf:Object ):Boolean{if( null != m_condition && null != _buf ){var sign:String = "";for( sign in m_condition ){if( m_condition[sign] != _buf[sign] ){return false;}}}return m_fun(_buf);}};}

/** * VERSION: 3 * DATE: 2013-10-12 * CLK/陈泽丹 **/package MsgServer.MsgServerBag{import MsgServer.DefineBag.IMsgListener;import flash.utils.Dictionary;public class ActionMsgSvr extends BaseMsgSvr{protected override function DoDispatchEvt( _msg:String, _evt:Object ):Boolean{++run_count;var msg_lst:Vector.<IMsgListener> = m_msg_table[_msg];for( var id:int = 0, len:int = msg_lst.length; id < len; ++id ){if( null != msg_lst[id] ){msg_lst[id].OnEvt(_evt)}if( null == msg_lst[id] ){had_null_node = true;}}--run_count;return true;}}}

/** * VERSION: 3 * DATE: 2013-10-12 * CLK/陈泽丹 **/package MsgServer.MsgServerBag{import MsgServer.DefineBag.IMsgListener;import MsgServer.DefineBag.IMsgServer;import flash.utils.Dictionary;public class BaseMsgSvr implements IMsgServer{private const IS_DEBUG:Boolean = false;protected var m_msg_table:Dictionary = new Dictionary();public function AddListener( _msg:String, _lst:IMsgListener ):Boolean{if( null == m_msg_table[_msg] )m_msg_table[_msg] = new Vector.<IMsgListener>();var msg_lst:Vector.<IMsgListener> = m_msg_table[_msg];if( IS_DEBUG ){var i:int = msg_lst.indexOf(_lst);if( -1 != i ){trace("<--------------  警告!!!  相同对象相同监听执行多次! -------------->");return false;}}msg_lst.push(_lst);return true;}public function RemoveListener( _msg:String, _lst:IMsgListener ):void{if( null != m_msg_table[_msg] ){var msg_lst:Vector.<IMsgListener> = m_msg_table[_msg];var i:int = msg_lst.indexOf(_lst);if( -1 != i ){msg_lst[i] = null;}}}private var msg_backups:Vector.<IMsgListener> = new Vector.<IMsgListener>();protected var run_count:int = 0;protected var had_null_node:Boolean = false;public function DispatchEvt( _msg:String, _evt:Object ):Boolean{if( null != m_msg_table[_msg] ){if( run_count >= 10 ){trace("消息相互调用超过10层,极有可能是游戏逻辑的实现有BUG!");}var ret:Boolean = DoDispatchEvt(_msg, _evt);if( 0 == run_count && had_null_node  ){//非递归层的情况,才进行清理垃圾操作的结点var msg_lst:Vector.<IMsgListener> = m_msg_table[_msg];for( var id:int = 0, len:int = msg_lst.length; id < len; ++id ){if( null != msg_lst[id] )msg_backups.push(msg_lst[id]);}var msg_temp:Vector.<IMsgListener> = m_msg_table[_msg];m_msg_table[_msg] = msg_backups;msg_backups = msg_temp;msg_backups.splice(0, msg_backups.length);had_null_node = false;}return ret;}return true;}protected function DoDispatchEvt( _msg:String, _evt:Object ):Boolean{return true;}}}

/** * VERSION: 3 * DATE: 2013-10-12 * CLK/陈泽丹 **/package MsgServer.MsgServerBag{public class MsgServerManagerHelper{public const VOTE:int = 1;public const INIT:int = 2;public const ACTION:int = 3;public const UNINIT:int = 4;private var g_msg_svr_mng:MsgSvrManager = new MsgSvrManager();private var g_vote_msg_svr:VoteMsgSvr = new VoteMsgSvr();private var g_init_msg_svr:ActionMsgSvr = new ActionMsgSvr();private var g_action_msg_svr:ActionMsgSvr = new ActionMsgSvr();private var g_uninit_msg_svr:ActionMsgSvr = new ActionMsgSvr();public function Init():void{g_msg_svr_mng.PushSvr(VOTE, g_vote_msg_svr);g_msg_svr_mng.PushSvr(INIT, g_init_msg_svr);g_msg_svr_mng.PushSvr(ACTION, g_action_msg_svr);g_msg_svr_mng.PushSvr(UNINIT, g_uninit_msg_svr);}public function UnInit():void{g_msg_svr_mng.Clear();}public function GetSvr():MsgSvrManager{return g_msg_svr_mng;}}}

/** * VERSION: 3 * DATE: 2013-10-12 * CLK/陈泽丹 **/package MsgServer.MsgServerBag{import MsgServer.DefineBag.IMsgListener;import MsgServer.DefineBag.IMsgServer;import MsgServer.DefineBag.IMsgSvrManager;import flash.utils.Dictionary;public class MsgSvrManager implements IMsgSvrManager{private var svr_vct:Vector.<MakePair> = new Vector.<MakePair>();public function PushSvr( _sign:int,  _msg_svr:IMsgServer ):void{var lst:MakePair = new MakePair(_sign, _msg_svr);svr_vct.push(lst);}public function Clear():void{svr_vct.splice(0,svr_vct.length);}public function AddListener( _msg:String, _lst_type:int, _lst:IMsgListener ):Boolean{for( var id:int = 0, len:int = svr_vct.length; id < len; ++id ){var node:MakePair = svr_vct[id];if( node.SIGN == _lst_type ){return node.MSG_SVR.AddListener(_msg, _lst);}}return false;}public function RemoveListener( _msg:String, _lst_type:int, _lst:IMsgListener ):void{for( var id:int = 0, len:int = svr_vct.length; id < len; ++id ){var node:MakePair = svr_vct[id];if( node.SIGN == _lst_type ){return node.MSG_SVR.RemoveListener(_msg, _lst);}}}public function DispatchEvt( _msg:String, _evt:Object ):void{for( var id:int = 0, len:int = svr_vct.length; id < len; ++id ){var node:MakePair = svr_vct[id];if( false == node.MSG_SVR.DispatchEvt(_msg, _evt) ){return;}}}}}import MsgServer.DefineBag.IMsgServer;class MakePair{public var SIGN:int = 0;public var MSG_SVR:IMsgServer = null;public function MakePair( _sign:int,  _msg_svr:IMsgServer ):void{SIGN = _sign;MSG_SVR = _msg_svr;}}

/** * VERSION: 3 * DATE: 2013-10-12 * CLK/陈泽丹 **/package MsgServer.MsgServerBag{import MsgServer.DefineBag.IMsgListener;import flash.utils.Dictionary;public class VoteMsgSvr extends BaseMsgSvr{protected override function DoDispatchEvt( _msg:String, _evt:Object ):Boolean{++run_count;var ret:Boolean = true;var temp:Boolean = false;var msg_lst:Vector.<IMsgListener> = m_msg_table[_msg];for( var id:int = 0, len:int = msg_lst.length; id < len; ++id ){if( null != msg_lst[id] ){temp = msg_lst[id].OnEvt(_evt)}if( null == msg_lst[id] ){had_null_node = true;}if( temp ){break;}}--run_count;return ret;}}}


原创粉丝点击