迄今為止,發現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的指令碼,用命令列定位到該指令碼所在目錄並執行它 或者...