亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

cocos creator 事件

since1986 / 1663人閱讀

摘要:事件在做一個(gè)消除類游戲時(shí),需要對(duì)點(diǎn)擊的方塊做出響應(yīng)。普通節(jié)點(diǎn)注冊事件在中如果需要相應(yīng)事件,需要為該節(jié)點(diǎn)添加一個(gè)組件。,事件冒泡利用自定義事件的屬性,實(shí)現(xiàn)冒泡。

cocos creator 事件

在做一個(gè)消除類游戲時(shí),需要對(duì)點(diǎn)擊的方塊做出響應(yīng)。代碼很簡單,可背后的原理還多著呢。

1. 普通節(jié)點(diǎn)注冊click事件

在cc中如果需要相應(yīng)click事件,需要為該節(jié)點(diǎn)添加一個(gè)Button組件?;蚴褂妙愃菩Ч氖录热?/p>

cc.Node.EventType.MOUSE_DOWN

cc.Node.EventType.TOUCH_END

//author herbert qq:464884492
//注冊按鈕click事件
btn.node.on("click", event=>{cc.log("button click")});
//注冊MOUSE_DOWN 
btn.node.on(cc.Node.EventType.MOUSE_DOWN,event=>{cc.log("button MOUSE_DOWN")});
//注冊TOUCH_END
btn.node.on(cc.Node.EventType.TOUCH_END,event=>{cc.log("button TOUCH_END")})
2. 應(yīng)該減少事件注冊量

是否沒有問題了?在寫juqery時(shí),有事件委托(delegate)的概念。啥意思呢,就是在節(jié)點(diǎn)的父級(jí)注冊事件,來響應(yīng)子節(jié)點(diǎn)的事件源。為啥可以實(shí)現(xiàn),主要?dú)w功于js事件的兩大機(jī)制

事件冒泡,事件響應(yīng)從子節(jié)點(diǎn)往上冒泡到頂層節(jié)點(diǎn)

事件捕獲,事件響應(yīng)沖頂層節(jié)點(diǎn)依次傳遞到最末級(jí)節(jié)點(diǎn)

所以問題來了,消除類游戲都是通過預(yù)制資源生成不同樣式的方塊。若在每一方塊上都注冊事件,勢必導(dǎo)致內(nèi)存上漲(雖然現(xiàn)在內(nèi)存很大了)。看看cc文檔,事件機(jī)制完全是一樣的(最終都是JS),然而我想在我的Canvas上注冊一個(gè)click事件,問題出現(xiàn)了。

3.問題來了

問題就是我在Canvas上注冊了click事件,點(diǎn)擊button時(shí),Canvas 上居然沒有收到我的click事件。由此我查看cc源碼,寫了一堆測試代碼,最終得出以下結(jié)

click事件確實(shí)Button組件特殊存

click事件不會(huì)向上或向下傳遞

node.emit觸發(fā)事件不會(huì)向上或向下傳遞

node.dispatchEvent支持事件向上或向下傳遞

使用node.dispatchEvent參數(shù)必須是 cc.Event.EventCustom對(duì)象

4.click事件特殊在哪里

cc.Button 組件中的click事件,其實(shí)是cc的自定義事件,源碼為證

//author:herbert wx:464884492
...
 this.node.on(cc.Node.EventType.TOUCH_END, this._onTouchEnded, this);
...
_onTouchEnded (event) {
 if (!this.interactable || !this.enabledInHierarchy) return;
 if (this._pressed) {
 cc.Component.EventHandler.emitEvents(this.clickEvents, event);
 this.node.emit("click", this);//觸發(fā)事件
 }
 this._pressed = false;
 this._updateState();
 event.stopPropagation(); //停止冒泡
},
...

所以,之所Button能響應(yīng)click事件,是因?yàn)榻M件注冊了TOUCH_END事件,并在響應(yīng)該事件函數(shù)中發(fā)射一個(gè)click事件。

5. javascript 自定義事件

參考mdn文檔,js自定事件方式如下

// author:herbert wx:464884492
6.了解下cc.node.emit

cc.node.emit 最終調(diào)用的是CallbacksInvoker.prototype.invoke 方法,從源碼來看,是從對(duì)應(yīng)的緩存對(duì)象中找到注冊的回調(diào)方法,依次調(diào)用回調(diào)函數(shù)。

//author herbert wx:464884492
CallbacksInvoker.prototype.invoke = function (key, p1, p2, p3, p4, p5) {
var list = this._callbackTable[key];
if (list) {
var rootInvoker = !list.isInvoking;
list.isInvoking = true;
var callbacks = list.callbacks;
var targets = list.targets;
for (var i = 0, len = callbacks.length; i < len; ++i) {
    var callbmhtack = callbacks[i];
    if (callback) {
        var target = targets[i];
        if (target) {
            callback.call(target, p1, p2, p3, p4, p5);
        }
        else {
            callback(p1, p2, p3, p4, p5);
        }
    }
}
if (rootInvoker) {
    list.isInvoking = false;
    if (list.containCanceled) {
        list.purgeCanceled();
    }
}}};

所以click自然不會(huì)往上或往下傳遞。

7.dispatchEvent,事件冒泡

dispatchEvent 利用自定義事件的 bubbles 屬性,實(shí)現(xiàn)冒泡。至于為啥使用 btn.node.dispatchEvent(new cc.Event.EventMouse(cc.Node.EventType.MOUSE_DOWN, true))沒有觸發(fā)事件是因?yàn)閏c在底層,將事件類型統(tǒng)一改成了 cc.Event.MOUSE,源碼為證

author:herbert wx:464884492
 ...
 var EventMouse = function (eventType, bubbles) {
 cc.Event.call(this, cc.Event.MOUSE, bubbles);
 ...
};

場景

運(yùn)行效果

8.總結(jié)

做開發(fā),不管是開發(fā)游戲還是其他應(yīng)用程序。思路基本是一樣的。再簡單的事,多想想,再發(fā)散一下,你會(huì)收獲更多。
需要進(jìn)cocos游戲開發(fā)群的朋友,請(qǐng)?zhí)砑游椅⑿呕貜?fù)cocos

歡迎感興趣的朋友關(guān)注我的訂閱號(hào)“小院不小”,或點(diǎn)擊下方二維碼關(guān)注。我將多年開發(fā)中遇到的難點(diǎn),以及一些有意思的功能,體會(huì)都會(huì)一一發(fā)布到我的訂閱號(hào)中。如需本文demo請(qǐng)?jiān)谟嗛喬?hào)中回復(fù)ccevent

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/106976.html

相關(guān)文章

  • cocos creator游戲開發(fā)

    摘要:自從調(diào)整游戲難度后我的最高分重來就沒有超過生命最高分來點(diǎn)實(shí)際的做技術(shù)嘛,大多都是做點(diǎn)總結(jié)吧開源地址在基本中定義的屬性,切記在編輯器中拖動(dòng)綁定多看官網(wǎng),多開實(shí)例代碼發(fā)布微信小游戲一定不要有英文,會(huì)導(dǎo)致審核不通過 1.初來乍到 打開 Cocos Creator 點(diǎn)擊新建空白項(xiàng)目,在默認(rèn)布局的左下區(qū)域,一個(gè)黃黃assets文件夾映入眼簾。作為前端的你對(duì)這個(gè)文件是不是再熟悉不過了。是的,和你想...

    SoapEye 評(píng)論0 收藏0
  • 小游戲開發(fā)上手體驗(yàn) - Cocos Creator

    摘要:但開發(fā)的游戲是無法通過網(wǎng)頁發(fā)給別人在線玩的,更不能做成微信小游戲。它使用作為開發(fā)語言,開發(fā)出的游戲可以直接生成微信小游戲網(wǎng)頁安卓等平臺(tái)上的版本。 微信群里最大的騷擾源有兩種: 一是轉(zhuǎn)發(fā)#吱口令#~!@#¥%……&*,長按復(fù)制此消息領(lǐng)紅包之類的 另一種就是各種小程序和小游戲的分享 前天有同學(xué)無意間把一個(gè)小游戲分享到了答疑群中,我看了一下,其實(shí)游戲的代碼邏輯并不復(fù)雜(簡化版的跳一跳,套上個(gè)...

    zhiwei 評(píng)論0 收藏0
  • cocos creator 簡單實(shí)戰(zhàn)

    摘要:錨點(diǎn)位置確定后,所有子節(jié)點(diǎn)就會(huì)以父節(jié)點(diǎn)錨點(diǎn)所在位置作為坐標(biāo)系原點(diǎn)。觀察實(shí)際效果以下為實(shí)際效果,左側(cè)打開欄目為不同手機(jī)分辨率模式。巨坑因?yàn)榉直媛拾l(fā)生變化,導(dǎo)致節(jié)點(diǎn)大小位置都會(huì)發(fā)生變化。 項(xiàng)目地址:https://github.com/Iroha1024/... 一個(gè)小游戲的demo,以下簡單地介紹了我關(guān)于cocos creator的一點(diǎn)理解和開發(fā)流程 版本:cocos creator v...

    taowen 評(píng)論0 收藏0
  • Cocos Creator—如何給資源打MD5版本號(hào)

    摘要:從年底開發(fā)組就說要支持,等了大半年,新的內(nèi)測版本終于增加了的功能,但效果也是差強(qiáng)人意。實(shí)際上我不會(huì)把這幾個(gè)和打版本號(hào)的。最后產(chǎn)出會(huì)把這幾個(gè)文件合并到中。 Cocos Creator 是Cocos最新一代的游戲開發(fā)者工具,基于 Cocos2d-x,組件化,腳本化,數(shù)據(jù)驅(qū)動(dòng),跨平臺(tái)發(fā)布。Cocos Creator的開發(fā)思路已經(jīng)逐步跟Unity 3D靠攏,寫起來也更方便快捷,開發(fā)效率更高。 ...

    lk20150415 評(píng)論0 收藏0
  • Cocos Creator—最佳構(gòu)建部署實(shí)踐

    摘要:本篇我們會(huì)基于的官方示例做分析,我在原的基礎(chǔ)上增加了部署的腳本,部署到又拍云和騰訊云。文件資源增加版本號(hào)版本號(hào)的方案跟之前的文章基本一致,這個(gè)流程在版本應(yīng)該可以忽略了。 這篇文章主要是我們團(tuán)隊(duì)在使用Cocos Creator過程中的一些關(guān)于部署方面的實(shí)踐總結(jié),標(biāo)題黨了一回,嚴(yán)格來說,應(yīng)該是《快看漫畫游戲研發(fā)團(tuán)隊(duì)使用Cocos Creator構(gòu)建部署最佳實(shí)踐》,對(duì)于其他團(tuán)隊(duì)可能并不是。 ...

    caohaoyu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<