在cocos2d-x的開發過程中有些時候也是需要用到雙擊的事件處理,那麼由於在cocos2d-x中沒有實現對雙擊的事件的處理,那麼我們就需要自己用代碼實現。
下面介紹兩種方式實現雙擊事件的處理。
(一)方法一
第一種方法就是利用兩次touch之間的時間間隔來判定是單擊或者是雙擊,一般來說,雙擊,兩次touch之間的時間間隔為250ms~300ms(毫秒)。所以利用這個條件就可以對雙擊進行判斷處理了。
注意到由於要擷取兩次touch之間的touch時間,而且是以毫秒為單位,所以需要用到下面這個方法:
//擷取系統的毫秒時間long millisecondNow(){ struct cc_timeval now; CCTime::gettimeofdayCocos2d(&now, NULL); return (now.tv_sec * 1000 + now.tv_usec / 1000);}
由於要擷取兩次touch的時間,所以要定義兩個long類型的變數用於記錄時間;而且定義了一個bool類型的變數記錄是否是雙擊。
long preTime; long nextTime; bool isClickTwo;
初始化為:
preTime = 0.0f; nextTime = 0.0f; isClickTwo = false;
接著就是要在 ccTouchesBegan(CCSet* touches,CCEvent*
event) 這個方法中(注意要在began這個方法中進行,而非ended這個方法中)進行單擊和雙擊的判斷處理了。代碼如下:
void HelloWorld::ccTouchesBegan(CCSet* touches, CCEvent* event){ isClickTwo = false; nextTime = millisecondNow(); if ((nextTime - preTime < 300) && (nextTime - preTime > 50)) { CCLog("double click"); isClickTwo = true; } //在回調方法中處理單擊事件 scheduleOnce(schedule_selector(HelloWorld::ff), 0.25f); preTime = millisecondNow();}void HelloWorld::ff(float tt){ if (! isClickTwo) { CCLog("single click"); }}
這樣,你單擊和雙擊螢幕的時候就會在終端輸出是單擊還是雙擊了。
(二)方法二
下面這種方法較第一種方法而言,比較簡潔,其並不是採用直接比較雙擊中兩次touch的時間間隔,而是比較巧妙的解決這個問題。解決的思路是這樣的,我們知道雙擊的時間間隔是0.25ms,所以設定了一個延時為0.25ms的schedule,如果在這0.25ms中又touch,那麼表示的是雙擊,否則表示的是單擊。具體的實現過程看代碼實現,應該是可以理解的。
這種方法只需要使用到一個bool變數表徵是否touch。
bool clicked;
初始化為:
clicked = false;
處理的代碼如下:
void HelloWorld::ccTouchesBegan(CCSet* touches, CCEvent* event){ if (clicked) { clicked = false; CCLog("double click"); } else { //延時0.25s執行(注意在這0.25s的延時過程中clicked已經為true), //如果在這個過程中再次click,那麼就執行上面的雙擊事件處理了 //否則,那麼就執行下面的回呼函數了,處理單擊事件 scheduleOnce(schedule_selector(HelloWorld::ff), 0.25f); clicked = true; }}//在回呼函數中處理單擊事件void HelloWorld::ff(float tt){ if (clicked) { clicked = false; CCLog("single click"); }}
同樣還是在終端中輸出是單擊還是雙擊的資訊。
通過比較二者實現的方法可以看到,其實二者的實現過程還是有點類似的,只不過判斷單擊,雙擊的具體實現過程有點差異,在實際使用過程中建議是使用第二種方法,比較簡潔。