1. 程式人生 > >cocos creator之自定義事件

cocos creator之自定義事件

概念

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的,必須使用其父節點來註冊監聽