cocos2d x推斷sprite點選

2022-09-19 01:27:11 字數 1474 閱讀 8375

我們經常須要推斷使用者的點選操作是否落於某個sprite之上,進而讓這個sprite做出響應。

可是假設我們通過繼承ccsprite類來實現自己的sprite類的時候,產生的檢視尺寸會充滿螢幕。多個sprite在同一層的時候會發生重疊,導致我們通過**函式傳遞進的touch點是相對於最上層sprite來說的。

好在我們能夠通過ccdirector::shareddirector()->converttogl(cctouch* touch->locationinview());的方法來獲得touch point的絕對座標。

然後通過遍歷螢幕上全部的sprite,依次檢查落點來推斷使用者點選應該被哪個sprite接受。

但事實上cocos2d-x已經為我們提供了乙個很方便的方法來推斷使用者點選了哪個sprite。

假如在這裡我們有乙個mysprite繼承了ccsprite,同一時候為了響應點選事件,我們還須要繼承cctargetedtouchdelegate。

後者這個類為我們提供了三個virtual的**函式:

virtual bool cctouchbegan(cctouch* touch, ccevent* event);

virtual void cctouchmove(cctouch* touch, ccevent* event);

virtual void cctouchended(cctouch* touch, ccevent* event);

這三個函式分別在使用者「點選」。「點選拖動」,「抬起手指」的時候被呼叫。

當中cctouchbegan函式的返回值是bool型別,其原因就是系統會依據該**函式的返回值來推斷點選訊息是否已經傳遞給使用者須要的sprite。

詳細點兒:假設該**函式返回true,說明程式猿已經覺得須要接受到這個觸控訊息的sprite已經接收到了這個觸控訊息。那麼程式的觸控訊息傳遞就會到此為止,僅僅在本層被使用(也會被本層的cctouchmove,cctouchended所使用)。假設返回false,說明這個觸控訊息並沒有傳遞到須要接受這個訊息的sprite中去。這時系統會將這個觸控訊息傳遞到下一層sprite。而且由這一層的cctouchbegan來處理這個訊息。

貼個演示樣例**:

bool mysprite::cctouchbegan(cocos2d::cctouch *touch, cocos2d::ccevent *event){

if(containstouchlocation(touch)){

cout<<"touch:"當中containstouchlocation是使用者自己實現的:通過在該函式中獲取position,並與傳遞進函式的touch作比較,推斷使用者的觸控操作是否落於該sprite區域之內。

假設落在該區域,則返回true。中斷這個訊息鏈。同一時候這個sprite會對應對應的cctouchmove,cctouchended

假設沒有落在該區域,則返回false。而且將這個訊息傳遞給下一層的sprite。

cocos2d x 資源集合

官網 主席子龍山人 archive 2011 08 08 2131019.html kmyhy的專欄 老g的小屋 cocos2d xtouch事件cocos2d 事件冒泡規律 和 ccmenu一直響應事件的解決辦法 swallow touches how to setmultipletouchena...

cocos2d x 開篇介紹

關於cocos2d x這一遊戲引擎,現在受到了手機遊戲開發者的青睞。其實cocos2d一開始是由於cocos2d iphone的成功,然後帶動各類開源專案越來越火。由蘋果獨家的objective c到了流行的c 支援了更多平台。cocos2d x中的 x 是什麼意識呢,其實其中包含著兩層含義 1 代...

Cocos2d x 常見巨集

1 ns cc begin cocos2d命名空間開始 2 ns cc end cocos2d命名空間結束 3 using ns cc 宣告cocos2d命名空間 4 cc synthesize readonly vartype,varname,funname 宣告乙個成員變數以及getfunnam...