日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Cocos 发射和监听事件 事件派送(TypeScript)

發布時間:2023/11/27 生活经验 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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名類型意義
typeString事件的類型(事件名)
targetcc.Node接收到事件的原始對象
currentTargetcc.Node接收到事件的當前對象,事件在冒泡階段當前對象可能與原始對象不同
getTypeFunction獲取事件的類型
stopPropagationFunction停止冒泡階段,事件將不會繼續向父節點傳遞,當前節點的剩余監聽器仍然會接收到事件
stopPropagationImmediateFunction立即停止事件的傳遞,事件將不會傳給父節點以及當前節點的剩余監聽器
getCurrentTarget Function獲取當前接收到事件的目標節點
detailFunction自定義事件的信息(屬于 cc.Event.EventCustom)
setUserDataFunction設置自定義事件的信息(屬于 cc.Event.EventCustom)
getUserDataFunction獲取自定義事件的信息(屬于 cc.Event.EventCustom)

完整的 API 列表可以參考 cc.Event 及其子類的 API 文檔。

系統內置事件

以上是通用的事件監聽和發射規則,在 Cocos Creator 中,我們默認支持了一些系統內置事件,可以參考我們后續的文檔來查看如何使用:

鼠標、觸摸:可參考 節點系統事件文檔
鍵盤、重力感應:可參考 全局系統事件文檔

總結

以上是生活随笔為你收集整理的Cocos 发射和监听事件 事件派送(TypeScript)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。