在項目開發中,我們做的大地圖,一個手指頭按下滑動可以拖動大地圖,兩個手指頭按下張開或者閉合,可以放大和縮小地圖
在實現這個功能的時候,需要使用到cocos2d-x的多點觸控功能。
多點觸控事件,並不是說你按下了兩個手指,執行ccTouchesMoved的時候,pTouches的count為2,這樣如果單純的判斷函數傳入的參數,實現起來會比較困難。
我用一種方式實現了,感覺還是比較簡單明了的,拿出來分享一下
cocos2d-x版本:cocos2d-x 2.2.0
目標平台:ios
1、首先在AppController.mm中設定開啟多點觸控
[__glView setMultipleTouchEnabled:YES];
2、在HelloWorldScene.cpp中得init函數中開啟響應觸摸事件
setTouchEnabled(true);
3、重寫父類的三個函數
virtual void ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);virtual void ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);virtual void ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
4、在類標頭檔中定義一個CCArray,用來儲存CCTouch對象的指標
cocos2d::CCArray* m_touchPoints;
5、在建構函式和解構函式中對CCArray進行初始化retain和release
HelloWorld::HelloWorld(){ m_touchPoints = CCArray::create(); m_touchPoints->retain();}HelloWorld::~HelloWorld()
{
m_touchPoints->release();
m_touchPoints = NULL;
}
6、當一個手指按下以後,不論是剛按下的時候,調用的ccTouchesBegan,還是滑動的過程中調用的ccTouchesMoved,還是抬起的時候調用ccTouchesEnded,函數的參數都是同一個CCTouch對象。
所以,我們在執行ccTouchesBegan函數的時候,把該對象加入到我們定義的CCArray中,在ccTouchesMoved函數中判斷我們自訂的數組的長度,如果是1,就執行拖動地圖的動作,如果是2,就執行縮放的動作,更多的動作也都可以靈活的增加
在ccTouchesEnded的時候,在CCArray中移除掉當前的這個CCTouch對象。
void HelloWorld::ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent){ //將CCTouch對象加入數組 int count = pTouches->count(); CCSetIterator iter = pTouches->begin(); for (int i=0; i<count; i++) { CCTouch* pTouch = (CCTouch*)(*iter++); m_touchPoints->addObject(pTouch); }}void HelloWorld::ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent){ if (m_touchPoints->count() == 1)//移動 { CCLog("move"); } else if (m_touchPoints->count() == 2)//縮放 { CCLog("scale"); }}void HelloWorld::ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent){ //將CCTouch對象從數組中移除 int count = pTouches->count(); CCSetIterator iter = pTouches->begin(); for (int i=0; i<count; i++) { m_touchPoints->removeObject(*iter++); }}
本人才疏學淺,如果有哪裡寫的不對的地方,還請指標,我馬上修改!