cocos2d x學習筆記 觸屏事件詳解

2021-08-10 14:55:38 字數 2802 閱讀 4050

遊戲跟**最大的區別就是互動,玩家可以操控遊戲中的角色,現在的移動裝置幾乎人手一台,基本上全部都是基於觸屏操作的,今天就來學習一下cocos2d-x是怎麼實現對觸屏操作的處理的。

1.首先來了解一下相關的幾個類、處理觸屏事件時操作和執行的流程

cctouch:它封裝了觸控點,可以通過locationinview函式返回乙個ccpoint。

cctouchdelegate:它是觸控事件委託,就是系統捕捉到觸控事件後交由它或者它的子類處理,所以我們在處理觸屏事件時,必須得繼承它。它封裝了下面這些處理觸屏事件的函式:

virtual void cctouchesbegan(ccset *ptouches, ccevent *pevent);

virtual void cctouchesmoved(ccset *ptouches, ccevent *pevent);

virtual void cctouchesended(ccset *ptouches, ccevent *pevent);

virtual void cctouchescancelled(ccset *ptouches, ccevent *pevent);

virtual bool cctouchbegan(cctouch *ptouch, ccevent *pevent);

virtual void cctouchmoved(cctouch *ptouch, ccevent *pevent);

virtual void cctouchended(cctouch *ptouch, ccevent *pevent);

virtual void cctouchcancelled(cctouch *ptouch, ccevent *pevent);

cctouchescancelled和cctouchcancelled函式很少用,在接到系統中斷通知,需要取消觸控事件的時候才會呼叫此方法。如:應用長時間無響應、當前view從window上移除、觸控的時候來**了等。

,類結構圖如下:

ccstandardtouchdelegate用於處理多點觸控;cctargetedtouchdelegate用於處理單點觸控。

cctouchdispatcher:實現觸控事件分發,它封裝了下面這兩個函式,:

void addstandarddelegate(cctouchdelegate *pdelegate, int npriority);

void addtargeteddelegate(cctouchdelegate *pdelegate, int npriority, bool bswallowstouches);

cctouchhandler:封裝了cctouchdelegate和其對應的優先順序,優先順序越高,分發的時候越容易獲得事件處理權,。

下面分析一下觸屏事件處理和執行流程:

使用者自定義類繼承cctouchdelegate,重寫觸屏事件處理函式和registerwithtouchdispatcher函式,在init或者onenter函式中呼叫registerwithtouchdispatcher函式,如:

void gamelayer::registerwithtouchdispatcher()

把相應的cctouchdelegate新增到cctouchdispatcher的分發列表中。_ptargetedhandlers中,看原始碼:

void cctouchdispatcher::addtargeteddelegate(cctouchdelegate *pdelegate, int npriority, bool bswallowstouches)

else

}void cctouchdispatcher::forceaddhandler(cctouchhandler *phandler, ccmutablearray *parray)

parray->insertobjectatindex(phandler, u);

}事件分發時就是從m_ptargetedhandlers中取出cc***touchhandler,然後呼叫delegate的:phandler->getdelegate()->cctouchbegan(ptouch, pevent);,執行的是cctouchdispatcher的touches函式,考慮到篇幅問題,就不貼出具體**了。該函式首先會先處理targeted 再處理standard,。

那什麼時候觸發執行touches函式呢?cctouchdispatcher繼承了egltouchdelegate類,egltouchdelegate類原始碼:

class cc_dll egltouchdelegate

};cctouchdispatcher中實現了這四個函式,正是在這四個函式中呼叫了touches函式:

void cctouchdispatcher::touchesbegan(ccset *touches, ccevent *pevent)

}/**其他三個方法類似 **/

這幾個觸屏處理函式是由具體平台底層呼叫的,在appdelegate.cpp中有這段**:

ccdirector *pdirector = ccdirector::shareddirector();

pdirector->setopenglview(&cceglview::sharedopenglview());

繼續跟進setopenglview函式,發現了這段**:

cctouchdispatcher *ptouchdispatcher = cctouchdispatcher::shareddispatcher();

m_pobopenglview->settouchdelegate(ptouchdispatcher);

ptouchdispatcher->setdispatchevents(true);

測量學總結 2

第一章 測量的基本知識 鉛垂線 重力的方向線稱為鉛垂線。鉛垂線是外業測量工作的基準線 水準面 靜止而不流動的水面稱為水準面。也可以定義為處處與鉛垂線垂直的連續曲面 1.如果水面足夠大的話,那麼這個水準面將是乙個曲面 2.水準面是乙個處處與鉛垂線垂直的連續曲面 3.水準面有無數多個,既不平行也不相交。...

學本導學高效課堂之淺見 2

趙敏靈2014,12,4 摘要 基礎教育改革的具體目標之一改革課程實施過於強調接受學習,死記硬背,機械訓練的現狀,倡導學生主動參與,樂於研究,勤於當時 勤於動手,培養學生蒐集和處理資訊的能力,獲得新知識能力,分析問題,解決問題的能力以及交流與合作能力,高中新課程提倡小組合作學習。合作學習是學生自主 ...

氣象學與氣候學複習 2

氣象學與氣候學 提綱版 一部分1 天氣 某一地區,在某一瞬間或某一時間內大氣中的大氣狀態 氣溫 氣壓 溫度 和大氣現象 風 雲 霧 降水等 的綜合。是瞬時的 多變的 不穩定的。2 飽和水汽壓 e 空氣中的水汽壓不能無限制地增加,在一定的溫度下,如果水汽壓增大到某乙個極限值,空氣中水汽就達到飽和,空氣...