在项目开发中,我们做的大地图,一个手指头按下滑动可以拖动大地图,两个手指头按下张开或者闭合,可以放大和缩小地图
在实现这个功能的时候,需要使用到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++); } }
本人才疏学浅,如果有哪里写的不对的地方,还请指针,我马上修改!