cocos creator之自定義事件
阿新 • • 發佈:2019-01-22
概念
cocos creator中的自定義事件類是cc.Event.EventCustom,類似於觀察者模式
作用
能使傳送者傳送某一訊號後,接受者能執行某一動作,能降低傳送者和接受者之間的耦合度
場景假設
為方便後續的討論,假設節點O上有兩個指令碼元件a、b,並假設在指令碼a中監聽指令碼b中的事件
事件註冊
指令碼a中的程式碼
onLoad () { this.node.parent.on("CustomName", function (event) { let data = event.getUserData(); cc.log("已經獲得:", data); }); }
注意這裡是在指令碼a上繫結的節點的父節點,也就是節點O上註冊監聽事件。為什麼要這麼做呢?後面解釋原因
例外,CustomName是自定義事件的事件名,後面的function (event)是回撥函式,在接收到事件CustomName時被自動呼叫
事件分發
指令碼b中的程式碼
onTouchStart(event){ let testEvent = new cc.Event.EventCustom("CustomName", true);//建立自定義事件 testEvent.setUserData("abc"); //設定自定義事件中包含的資料 this.node.dispatchEvent(testEvent); //用節點分發事件 }
注意,這裡要通過指令碼b上繫結的節點來分發事件
cc.Event.EventCustom
cc.Event.EventCustom是自定義事件類,其建構函式是constructor(type: string, bubbles: boolean)
其中type是自定義事件的標籤,用來標識自己,bubbles標識是否進行冒泡傳送
冒泡派送:事件從發起節點開始,不斷迭代地向父節點傳遞,直到遇到根節點或者在響應函式中進行了中斷處理的節點。
取消監聽
指令碼a中的程式碼
this.node.parent.off("CustomName"); //取消掉了對事件CustomName的監聽
重要規律
分發事件後,只有本節點或者本節點的祖先節點能接受到事件分發的訊號
因此如果在指令碼a中用this.node.on來註冊對事件CustomName的監聽,是無法監聽到事件CustomName的,必須使用其父節點來註冊監聽