首页 > 代码库 > 【原】cocos2d-x开发笔记:多点触控

【原】cocos2d-x开发笔记:多点触控

在项目开发中,我们做的大地图,一个手指头按下滑动可以拖动大地图,两个手指头按下张开或者闭合,可以放大和缩小地图

在实现这个功能的时候,需要使用到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++);    }}

 

本人才疏学浅,如果有哪里写的不对的地方,还请指针,我马上修改!