Cocos 发射和监听事件 事件派送(TypeScript)
監聽和發射事件
監聽事件
事件處理是在節點(cc.Node)中完成的。對于組件,可以通過訪問節點 this.node 來注冊和監聽事件。
事件監聽函數 on 可以傳第三個參數 target,用于綁定響應函數的調用者。
監聽事件可以通過 this.node.on() 函數來注冊,方法如下:
onLoad() {this.node.on(cc.Node.EventType.TOUCH_START, this._touchStart, this);this.node.on(cc.Node.EventType.TOUCH_END, this._touchEnd, this);}
除了使用 on 監聽,我們還可以使用 once 方法。once監聽在監聽函數響應后就會關閉監聽事件。
關閉監聽
當我們不再關心某個事件時,我們可以使用 off 方法關閉對應的監聽事件。需要注意的是,off 方法的參數必須和 on 方法的參數一一對應,才能完成關閉。
onDestroy() {this.node.off(cc.Node.EventType.TOUCH_START, this._touchStart, this);this.node.off(cc.Node.EventType.TOUCH_END, this._touchEnd, this);}
發射事件
發射事件有兩種方式:emit 和 dispatchEvent。兩者的區別在于,后者可以做事件傳遞。我們先通過一個簡單的例子來了解 emit 事件:
onLoad () {// args are optional param.this.node.on('say-hello', function (msg) {console.log(msg);});},start () {// At most 5 args could be emit.this.node.emit('say-hello', 'Hello, this is Cocos Creator');},
事件參數說明
在 2.0 之后,我們優化了事件的參數傳遞機制。 在發射事件時,我們可以在 emit 函數的第二個參數開始傳遞我們的事件參數。同時,在 on 注冊的回調里,可以獲取到對應的事件參數。
cc.Class({extends: cc.Component,onLoad () {this.node.on('foo', function (arg1, arg2, arg3) {console.log(arg1, arg2, arg3); // print 1, 2, 3});},start () {let arg1 = 1, arg2 = 2, arg3 = 3;// At most 5 args could be emit.this.node.emit('foo', arg1, arg2, arg3);},
});
需要說明的是,出于底層事件派發的性能考慮,這里最多只支持傳遞 5 個事件參數。所以在傳參時需要注意控制參數的傳遞個數。
派送事件
上文提到了dispatchEvent方法,通過該方法發射的事件,會進入事件派送階段。在 Cocos Creator 的事件派送系統中,我們采用冒泡派送的方式。冒泡派送會將事件從事件發起節點,不斷地向上傳遞給它的父級節點,直到到達根節點或者在某個節點的響應函數中做了中斷處理 event.stopPropagation()。
如上圖所示,當我們從節點 c 發送事件 “foobar”,倘若節點 a,b 均做了 “foobar” 事件的監聽,則 事件會經由 c 依次傳遞給 b,a 節點。如:
// 節點 c 的組件腳本中
this.node.dispatchEvent( new cc.Event.EventCustom('foobar', true) );
如果我們希望在 b 節點截獲事件后就不再將事件傳遞,我們可以通過調用 event.stopPropagation() 函數來完成。具體方法如下:
// 節點 b 的組件腳本中
this.node.on('foobar', function (event) {event.stopPropagation();
});
請注意,在發送用戶自定義事件的時候,請不要直接創建 cc.Event 對象,因為它是一個抽象類,請創建 cc.Event.EventCustom對象來進行派發。
事件對象
在事件監聽回調中,開發者會接收到一個 cc.Event 類型的事件對象 event,stopPropagation 就是 cc.Event 的標準 API,其它重要的 API 包含:
| API名 | 類型 | 意義 |
|---|---|---|
| type | String | 事件的類型(事件名) |
| target | cc.Node | 接收到事件的原始對象 |
| currentTarget | cc.Node | 接收到事件的當前對象,事件在冒泡階段當前對象可能與原始對象不同 |
| getType | Function | 獲取事件的類型 |
| stopPropagation | Function | 停止冒泡階段,事件將不會繼續向父節點傳遞,當前節點的剩余監聽器仍然會接收到事件 |
| stopPropagationImmediate | Function | 立即停止事件的傳遞,事件將不會傳給父節點以及當前節點的剩余監聽器 |
| getCurrentTarget Function | 獲取當前接收到事件的目標節點 | |
| detail | Function | 自定義事件的信息(屬于 cc.Event.EventCustom) |
| setUserData | Function | 設置自定義事件的信息(屬于 cc.Event.EventCustom) |
| getUserData | Function | 獲取自定義事件的信息(屬于 cc.Event.EventCustom) |
完整的 API 列表可以參考 cc.Event 及其子類的 API 文檔。
系統內置事件
以上是通用的事件監聽和發射規則,在 Cocos Creator 中,我們默認支持了一些系統內置事件,可以參考我們后續的文檔來查看如何使用:
鼠標、觸摸:可參考 節點系統事件文檔
鍵盤、重力感應:可參考 全局系統事件文檔
總結
以上是生活随笔為你收集整理的Cocos 发射和监听事件 事件派送(TypeScript)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 广告费的投入产出比怎么计算??
- 下一篇: 蒙娜丽莎的胡子是谁画的呢?