成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Cocos2d-X 3.0 事件分發(fā)機(jī)制

JerryC / 2623人閱讀

摘要:事件中事件分發(fā)機(jī)制進(jìn)行了重寫,事件可以與任意對(duì)象綁定,而不是只有才能獲取。這就形成了一個(gè)完整的事件分發(fā)機(jī)制。如果返回,且為,則事件被吞沒,事件的順序傳遞則被阻止。

這兩天在使用cocos2d-js做一個(gè)拔蘿卜游戲,研究了一番cocos2d的事件分發(fā)機(jī)制,總結(jié)分享一下。

事件

Cocos2d-JS v3.x中事件分發(fā)機(jī)制進(jìn)行了重寫,事件可以與任意對(duì)象綁定,而不是只有Layer才能獲取。對(duì)象創(chuàng)建自己的事件監(jiān)聽器,然后加入到全局的事件管理器統(tǒng)一管理。

事件監(jiān)聽器有以下幾種:

觸摸事件

鍵盤響應(yīng)事件

鼠標(biāo)響應(yīng)事件

自定義事件

加速計(jì)事件

事件分發(fā)

在了解事件分發(fā)機(jī)制之前,我們首先要明確什么是事件分發(fā)。

對(duì)于事件分發(fā),cocos2d官方定義為:當(dāng)事件發(fā)生(例如,用戶觸摸屏幕,或者敲鍵盤),EventDispatcher 會(huì)發(fā)布(Event objects)事件對(duì)象到合適的EventListeners,并調(diào)用你的回調(diào)。各個(gè)Event object包含事件的信息(比如,觸摸點(diǎn)所在的坐標(biāo))。

我的理解是對(duì)于一個(gè)事件(比如觸摸事件、鍵盤相應(yīng)事件等)可以與任意對(duì)象綁定,那么當(dāng)這個(gè)事件被用戶觸發(fā)時(shí),此時(shí)應(yīng)該執(zhí)行哪一個(gè)對(duì)象的回調(diào)函數(shù)(比如此時(shí)我們?cè)诤脦讉€(gè)sprite上同時(shí)綁定了touch事件,用戶此時(shí)點(diǎn)擊屏幕,用戶此時(shí)想點(diǎn)擊的到底是哪一個(gè)sprite),我們就需要作出判斷。EventDispatcher做的就是這個(gè)事情。

以touch事件(觸摸事件)為例,判斷用戶點(diǎn)擊的是哪一個(gè)sprite的方法很簡(jiǎn)單,其實(shí)就是在onTouchBegan方法中獲取點(diǎn)擊點(diǎn)的坐標(biāo)pos,然后通過cc.rectContainsPoint(target.getBoundingBox(),pos)判斷點(diǎn)擊的點(diǎn)是否在SushiSprite上。不過此時(shí)又會(huì)出現(xiàn)另外一個(gè)問題,就是如果兩個(gè)sprite有相互重疊的部分,而此時(shí)用戶點(diǎn)擊的恰恰是重疊部分,那么怎么判斷到底點(diǎn)擊的是哪一個(gè)sprite呢?這里是通過priority(分為兩種:SceneGraphPriority和FixedPriority)來解決的,優(yōu)先級(jí)高的sprite優(yōu)先執(zhí)行它所對(duì)應(yīng)的事件監(jiān)聽器的回調(diào)函數(shù)。這樣就形成了一個(gè)按照優(yōu)先級(jí)高低排列的sprite隊(duì)列等待依次執(zhí)行用戶觸發(fā)的事件,而這中間則通過swallowTouches(吞沒事件)屬性來控制是否繼續(xù)向優(yōu)先級(jí)低的sprite傳遞事件。這就形成了一個(gè)完整的事件分發(fā)機(jī)制。

tip:

SceneGraphPriority(顯示優(yōu)先級(jí)):根據(jù)屏幕顯示的“遮蓋”實(shí)際情況,進(jìn)行有序的函數(shù)回調(diào)。zOrder越大,優(yōu)先級(jí)越大。

FixedPriority(固定優(yōu)先級(jí)):依據(jù)手動(dòng)設(shè)定的 Priority 值來決定事件相應(yīng)的優(yōu)先級(jí),值越小優(yōu)先級(jí)越高

總結(jié)一下:

通過點(diǎn)擊位置進(jìn)行點(diǎn)擊范圍判斷,來確定執(zhí)行哪一個(gè)sprite的事件監(jiān)聽器

如果該位置存在重疊的sprite綁定了相同的事件,則依據(jù)優(yōu)先級(jí)(SceneGraphPriority顯示優(yōu)先級(jí)或FixedPriority固定優(yōu)先級(jí))來順序執(zhí)行函數(shù)回調(diào)

通過設(shè)置swallowTouches屬性為true,并在onTouchBegan中返回true或者false來決定是否阻止事件的順序傳遞。如果onTouchBegan返回true,且swallowTouches為true,則事件被吞沒,事件的順序傳遞則被阻止。

實(shí)例

新建一個(gè)sprite,并為其添加一個(gè)touch事件:

var SushiSprite = cc.Sprite.extend({
    onEnter:function () {
        cc.log("onEnter");
        this._super();
    },
 
    onExit:function () {
        cc.log("onExit");
    }
});

addTouchEventListenser:function(){
    this.touchListener = cc.EventListener.create({
        event: cc.EventListener.TOUCH_ONE_BY_ONE,
        // When "swallow touches" is true, then returning "true" from the onTouchBegan method will "swallow" the touch event, preventing other listeners from using it.
        swallowTouches: true,
        //onTouchBegan event callback function                      
        onTouchBegan: function (touch, event) { 
            var pos = touch.getLocation();
            var target = event.getCurrentTarget();  
            if ( cc.rectContainsPoint(target.getBoundingBox(),pos)) {
                cc.log("touched")
                return true;
            }
            return false;
        }
    cc.eventManager.addListener(this.touchListener,this);
});

上面的代碼:

首先通過使用cc.EventListener.create創(chuàng)建了一個(gè)Touch事件監(jiān)聽器touchListener

然后,通過cc.eventManager.addListener注冊(cè)監(jiān)聽器到事件管理器。cc.EventListener.create擴(kuò)展出一個(gè)用戶監(jiān)聽器。

event屬性,定義這個(gè)監(jiān)聽器監(jiān)聽的類型。

swallowTouches屬性設(shè)置是否吃掉事件,事件被吃掉后不會(huì)遞給下一層監(jiān)聽器。

onTouchBegan方法處理觸摸點(diǎn)擊按下事件,我們?cè)谶@里可以獲取到觸摸點(diǎn)的坐標(biāo)pos。event.getCurrentTarget()獲取當(dāng)前事件的接受者,并判斷當(dāng)前的是否點(diǎn)擊到了SushiSprite。

在touch事件中,我們還可以添加onTouchMoved/onTouchEnded方法監(jiān)聽touch移動(dòng)和結(jié)束的回調(diào)。如果onTouchBegan返回false后onTouchMoved/onTouchEnded不會(huì)執(zhí)行。

tip: 在onTouchBegan方法中獲取點(diǎn)擊點(diǎn)的坐標(biāo)pos,然后通過cc.rectContainsPoint(target.getBoundingBox(),pos)判斷點(diǎn)擊的點(diǎn)是否在SushiSprite上。

博客文章地址:http://joebon.cc/cocos2d-event-dispatcher

參考文獻(xiàn)

[1] http://cn.cocos2d-x.org/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/framework/cocos2d-js/3-jumping-into-cocos2d-js/3-6-creating-user-interaction-with-event-manager/zh.md

[2] http://cn.cocos2d-x.org/article/index?type=wiki&url=/doc/cocos-docs-master/manual/framework/native/wiki/eventdispatcher-mechanism/zh.md

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

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

相關(guān)文章

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

0條評(píng)論

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