cocos2d-x touch屏蔽層的設(shè)計(jì)

cocos2d-x版本: 3.8.1

需求

游戲邏輯中有需要添加touch屏蔽層的需求菩帝,比如說現(xiàn)在要點(diǎn)擊按鈕發(fā)送一條內(nèi)部消息創(chuàng)建A界面笛园,創(chuàng)建動(dòng)作實(shí)際是在下一幀或者下一個(gè)定時(shí)器調(diào)度時(shí)才開始執(zhí)行尝哆,如果快速點(diǎn)擊按鈕則會(huì)發(fā)送多條消息绊含。這種情況是需要規(guī)避的市殷。

Cocos2d-x引擎是建立在Layer概念上的纫事,多層layer有上下關(guān)系渗鬼;屏蔽層應(yīng)該設(shè)計(jì)在最上層担锤,而且屏蔽層應(yīng)該有swallow和unswallow的接口;但是調(diào)用時(shí)機(jī)需要把握準(zhǔn)確乍钻。

設(shè)計(jì)思路肛循、需要注意的問題

思路:點(diǎn)擊按鈕時(shí)發(fā)送消息顾稀,同時(shí)設(shè)置屏蔽層swallow镣陕,下一幀或者下一個(gè)定時(shí)調(diào)度時(shí)設(shè)置屏蔽層unswallow

這個(gè)思路一般情況下不會(huì)出問題,在這個(gè)swallow->unswallow的時(shí)間內(nèi)知纷,所有的touch事件都會(huì)被屏蔽層吸收浩考;但是在單點(diǎn)Listener和多點(diǎn)Listener混合使用時(shí)會(huì)有一點(diǎn)小問題夹孔,根源在于:

1、touch事件的執(zhí)行不依賴幀循環(huán)

2析孽、幀事件或者時(shí)間調(diào)度都依賴幀循環(huán)

3搭伤、單點(diǎn)Listener的onTouchMoved、onTouchEnded袜瞬、onTouchCancelled事件依賴onTouchBegan怜俐;只有onTouchBegan返回true,后續(xù)的事件才會(huì)觸發(fā)

4邓尤、多點(diǎn)Listener的onTouchesMoved拍鲤、onTouchesEnded、onTouchesCancelled事件不依賴onTouchesBegan汞扎,也就是說就算onTouchesBegan沒有執(zhí)行季稳,后續(xù)的moved,ended澈魄,cancelled事件一樣會(huì)被觸發(fā)

根據(jù)事件派發(fā)機(jī)制景鼠,考慮下面情況:

1、touch屏蔽層在最高層

2痹扇、中間有多個(gè)注冊(cè)了單點(diǎn)Listener的層, 其中有設(shè)置為swallow的層

3铛漓、再下面是一個(gè)或多個(gè)注冊(cè)了多點(diǎn)Listener的層,并且設(shè)置為swallow

這時(shí)會(huì)有這樣一種情況:began事件發(fā)生時(shí)帘营,屏蔽層swallow掉當(dāng)前touch票渠,接下來下一幀或者下一個(gè)定時(shí)器執(zhí)行逐哈,設(shè)置屏蔽層為unswallow芬迄;那么后續(xù)該touch的moved、ended操作都會(huì)傳遞到注冊(cè)了多點(diǎn)Listener的層中昂秃,這種情況并不是我們希望的

這時(shí)可能會(huì)覺得中間的層會(huì)swallow掉相關(guān)的事件禀梳,而不會(huì)傳遞到上面描述3中的層中杜窄;但因?yàn)橹虚g層只是注冊(cè)單點(diǎn)Listener,began事件被屏蔽層swallow掉了算途,中間層注冊(cè)的Listener Began事件并沒有觸發(fā)塞耕,所以后續(xù)的moved、ended等事件也不會(huì)觸發(fā)嘴瓤;根據(jù)上面提到的 根源4扫外,多點(diǎn)Listener的moved、ended等事件將觸發(fā)

改進(jìn)

原思路是在下一幀或者下一個(gè)定時(shí)調(diào)度時(shí)設(shè)置屏蔽層unswallow廓脆,改成:下一幀或者下一個(gè)定時(shí)調(diào)度時(shí)設(shè)置一個(gè)標(biāo)記筛谚,在屏蔽層的onTouchBegan方法中根據(jù)該標(biāo)記設(shè)置屏蔽層為unswallow,并且清除標(biāo)記

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末停忿,一起剝皮案震驚了整個(gè)濱河市驾讲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌席赂,老刑警劉巖吮铭,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異颅停,居然都是意外死亡谓晌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門癞揉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扎谎,“玉大人,你說我怎么就攤上這事烧董』侔校” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵逊移,是天一觀的道長(zhǎng)预吆。 經(jīng)常有香客問我,道長(zhǎng)胳泉,這世上最難降的妖魔是什么拐叉? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮扇商,結(jié)果婚禮上凤瘦,老公的妹妹穿的比我還像新娘。我一直安慰自己案铺,他們只是感情好蔬芥,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般笔诵。 火紅的嫁衣襯著肌膚如雪返吻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天乎婿,我揣著相機(jī)與錄音测僵,去河邊找鬼。 笑死谢翎,一個(gè)胖子當(dāng)著我的面吹牛捍靠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播森逮,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼剂公,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了吊宋?” 一聲冷哼從身側(cè)響起纲辽,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎璃搜,沒想到半個(gè)月后拖吼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡这吻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年吊档,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唾糯。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡怠硼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出移怯,到底是詐尸還是另有隱情香璃,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布舟误,位于F島的核電站葡秒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嵌溢。R本人自食惡果不足惜眯牧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赖草。 院中可真熱鬧学少,春花似錦、人聲如沸秧骑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至阀坏,卻和暖如春如暖,著一層夾襖步出監(jiān)牢的瞬間笆檀,已是汗流浹背忌堂。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酗洒,地道東北人士修。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像樱衷,于是被迫代替她去往敵國(guó)和親棋嘲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容