cocos2d x 3 0點選響應

2022-04-09 04:52:29 字數 3422 閱讀 4482

迄今為止,發現cocos2d-x 3.0最讓人驚豔的地方就是更改了點選事件機制。(ps:迄今只看了點選事件這塊,捂嘴笑~~~)

cocos2d-x 2.0 只有cclayer有點選事件處理,需要註冊,需要實現ontouchbegan等方法,最坑爹的就是按照優先順序來傳遞點選事件,讓人詬病不已。每次遇到由於優先順序而造成的點選bug,都有一種崩潰之感。

讓人高興的是,從現在開始,這種情況應該就會很少遇到了。閒話不說,開始正文。

3.0版本中,處理點選事件有兩種方式:

函式**是最簡單的響應形式,一直以來被用於menuitem中的點選處理。在新版本中,此處發生了些小改變,也就是採用了cc_callback系列,有不明白的可以去看帖子:c++11特性與cocos2d-x 3.0之std::bind與std::function

1

//a selector callback

2void menuclosecallback(object*psender);

34 auto closeitem = menuitemimage::create("

closenormal.png

","closeselected.png",

5 cc_callback_1(helloworld::menuclosecallback, this

));6

7void helloworld::menuclosecallback(object*psender)

8

其中cc_callback_1巨集是將函式與物件繫結在一起,1表示這個函式有乙個引數。當點選這個按鈕時,會呼叫這個**函式。

除了基於c++11的這個形式的改變,使用方法與先前相同。

listener的加入,使得sprite可以很方便的就可以擁有處理點選事件的能力。再也不用為了寫個能夠響應事件的sprite而讓去繼承layer了。總覺得class testsprite : public cclayer這種定義sprite的方式是坑人的一種做法。終於可以將其摒棄了。

3.0版本,只需要為sprite建立乙個listener,然後將listener與sprite繫結,並新增到listener佇列內即可,方便至極。

另,每乙個listener也只能和乙個sprite進行繫結,而listener的clone方法,可以很方便的將listener複製為其他物件可用的listener。

廢話少說,上**最重要:

1

#ifndef __touchable_sprite_test_h__

2#define __touchable_sprite_test_h__

34 #include "

cocos2d.h"5

using_ns_cc;67

class touchablespritetest : public

layer8;

1415

#endif

1 #include "

touchablespritetest.h"2

3void

touchablespritetest::onenter()440

return

false;41

};42

43 listener1->ontouchmoved = (touch* touch, event* event

);47

48 listener1->ontouchended = [=](touch* touch, event* event)56

else

if(target ==sprite1)

5760

};61

62 _eventdispatcher->addeventlistenerwithscenegraphpriority(listener1, sprite1);

63 _eventdispatcher->addeventlistenerwithscenegraphpriority(listener1->clone(), sprite2);

64 _eventdispatcher->addeventlistenerwithscenegraphpriority(listener1->clone(), sprite3);

6566 rect s_visiblerect = director::getinstance()->getopenglview()->getvisiblerect();

67 point right = point(s_visiblerect.origin.x+s_visiblerect.size.width, s_visiblerect.origin.y+s_visiblerect.size.height/2

);68

69 auto removealltouchitem = menuitemfont::create("

remove all touch listeners

",[&]( ref*sender ));

7778 nextitem->setfontsizeobj(16

);79 nextitem->setposition(right + point(-100, -30

));80

81 auto menu2 =menu::create(nextitem, null);

82 menu2->setposition(point(0, 0

));83 menu2->setanchorpoint(point(0, 0

));84

this->addchild(menu2);

85});

86 removealltouchitem->setfontsizeobj(16

);87 removealltouchitem->setposition(right + point(-100, 0

));88

89 auto menu =menu::create(removealltouchitem, nullptr);

90 menu->setposition(point(0, 0

));91 menu->setanchorpoint(point(0, 0

));92

addchild(menu);93}

9495

void

touchablespritetest::onexit()

96

千里之行始於足下,一切才剛剛開始,想要理解cocos2dx 3.0的點選事件,還是需要深入理解其底層實現的。

大家可以去看  cocos2d-x3.0 刨根問底(七)----- 事件機制event原始碼分析   這應該是一篇好文。

另,本博文參考自:

本博主對一切都將不負任何法律責任。

cocos2d x 3 0 編譯問題

3.0最主要的問題是它引進了c 11 所有ndk版本必須是r8e版本以上,即使你已經有這些已經準備好,還要注意一點是ndk編譯的時候預設採用ndk toolchain version 4.6的形式去編譯,這個時候就會出現 error thread in namespace std does not ...

cocos2dx 3 0 學習資源

目前看見的cocos2dx 3.0 學習資源 官方的英文 我也在wiki上看了一會,有的還用有道詞典查詢的單詞什麼的。史上最坑爹的遊戲 holdtail 目前資料很少,mac下開發的資源就更少了。如果有朋友看見其他資源可以告訴我啊,謝謝 cocos2dx 3.0基礎知識 cocos2dx 3.0 a...

cocos2d x 3 0建立專案

之前一直用的是cocos2d x 2.3版本,使用tools裡面的create project.py指令碼可以很方便的建立專案。今天更新為3.0後,發現新版建立專案的方式有了很大的改變,於是在這裡記錄一下。在3.0的根目錄下有乙個setup.py的指令碼,用命令列定位到該指令碼所在目錄並執行它 或者...