今天, 我们来学习cocos2dX里面的触摸事件与触摸事件合集, 如今的手机游戏交互基本上都是通过触摸交互的, 所以大家明确这节的重要性了吧, 本节篇幅比較大, 所以我就不扯闲话了
先来看看经常使用函数:
触摸事件:
addTargeteDelegate( 谁使用, 优先级, 是否拦截触摸消息);
//注冊单点触摸
virtual bool ccTouchBegan(CCTouch * touch,CCEvent * event); //触摸開始
virtual void ccTouchMoved(CCTouch * touch,CCEvent * event); //触摸滑动
virtual void ccTouchEnded(CCTouch * touch,CCEvent * event); //结束触摸
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);//其它事件中断触摸
触摸事件集合:
virtual void registerWithTouchDispatcher( void); //注冊多点触摸
addStandardDelegate(); //加入托付
setTouchEnabled( bool); //开启多点触摸, 貌似使用了这个之后就不能使用单点
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);<span style="white-space:pre"> </span>//触摸開始函数 <span style="white-space:pre"> </span>virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);<span style="white-space:pre"> </span>//触摸移动函数 <span style="white-space:pre"> </span>virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);<span style="white-space:pre"> </span>//触摸结束函数
开启单点触摸, 而且创建三个标签用来显示信息:
注意: 一定要开启单点触摸, 不然没有效果
//开启单点触摸 CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate( this, 0, false); //创建三个标签 CCLabelTTF* begin = CCLabelTTF::create( "begin:-->X:0.0, -->Y:0.0", "Arial", 24); CCLabelTTF* move = CCLabelTTF::create( "move:-->X:0.0, -->Y:0.0", "Arial", 24); CCLabelTTF* end = CCLabelTTF::create( "end:-->X:0.0, -->Y:0.0", "Arial", 24); begin->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2 + 50)); move->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2)); end->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2 - 50)); addChild( begin, 0, 101); addChild( move, 0, 102); addChild( end, 0, 103);
我们来重写这三个函数:
getLocationInView()取得坐标系是以左上角为原点的哦
我们来看看效果:
看, 我们截取到了触摸事件的消息了吧
好了, 我们再来看看触摸事件集合:
为什么有了触摸事件之后我们还要使用触摸事件集合呢?如今的手机基本都支持多点触控, 而CCTouch不能获取多点触摸的事件, 所以触摸事件集合就应运而生了
我们 还是声明一下须要重写的函数:
virtual void registerWithTouchDispatcher(); virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent); virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent); virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);
在init里面开启多点触摸
//开启多点触摸 setTouchEnabled( true);
实现重写的函数:
void HelloWorld::registerWithTouchDispatcher() { //注冊多点触摸 CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate( this, 0); } void HelloWorld::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) { CCSetIterator iter = pTouches->begin(); for ( ; iter != pTouches->end(); ++iter) { CCTouch* pTouch = (CCTouch*)(*iter); switch ( pTouch->getID()) { case 0:{ CCLabelTTF* ttf1 = CCLabelTTF::create( "1", "Arial", 24); ttf1->setPosition( pTouch->getLocation()); addChild( ttf1, 0, 101); }break; case 1:{ CCLabelTTF* ttf1 = CCLabelTTF::create( "2", "Arial", 24); ttf1->setPosition( pTouch->getLocation()); addChild( ttf1, 0, 102); }break; case 2:{ CCLabelTTF* ttf1 = CCLabelTTF::create( "3", "Arial", 24); ttf1->setPosition( pTouch->getLocation()); addChild( ttf1, 0, 103); }break; case 3:{ CCLabelTTF* ttf1 = CCLabelTTF::create( "4", "Arial", 24); ttf1->setPosition( pTouch->getLocation()); addChild( ttf1, 0, 104); }break; case 4:{ CCLabelTTF* ttf1 = CCLabelTTF::create( "5", "Arial", 24); ttf1->setPosition( pTouch->getLocation()); addChild( ttf1, 0, 105); }break; default: break; } } } void HelloWorld::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent) { CCSetIterator iter = pTouches->begin(); for ( ; iter != pTouches->end(); ++iter) { CCTouch* pTouch = (CCTouch*)(*iter); switch ( pTouch->getID()) { case 0:{ CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 101); ttf->setPosition( pTouch->getLocation()); }break; case 1:{ CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 102); ttf->setPosition( pTouch->getLocation()); }break; case 2:{ CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 103); ttf->setPosition( pTouch->getLocation()); }break; case 3:{ CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 104); ttf->setPosition( pTouch->getLocation()); }break; case 4:{ CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 105); ttf->setPosition( pTouch->getLocation()); }break; default: break; } } } void HelloWorld::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent) { CCSetIterator iter = pTouches->begin(); for ( ; iter != pTouches->end(); ++iter) { CCTouch* pTouch = (CCTouch*)(*iter); switch ( pTouch->getID()) { case 0:{ removeChildByTag( 101); }break; case 1:{ removeChildByTag( 102); }break; case 2:{ removeChildByTag( 103); }break; case 3:{ removeChildByTag( 104); }break; case 4:{ removeChildByTag( 105); }break; default: break; } } }
看看效果:
额, 电脑上仅仅能显示一个触摸点, 我刚刚在手上測试了一下, 能够同一时候操作多个点的, 我等会上传安装文件,
我们来看看代码:
首先, 我们设置多点触控可用, 而且注冊了它, 这是必须的哦
我们在開始触摸的时候传了两个參数, 第一个參数是个容器, 我们将它取出来, 将begin()取出来作为開始标志, end()取出来作为结束标志, 遍历了这个容器, 在遍历的过程中, 我们取出了每一个对象的ID, 我们全部的触摸点都在这个容器里面, 和数组下标同样, 也是从0開始的, 所以我们取出当ID等于0的时候, 我们就绘制出第一个标签, 我们这里依次取出了5个, 同理, 在移动里面, 我们依据ID改动了他们的位置, 在结束触摸里面, 我们依据标记, 移除了对应的对象
好了, 今天的就到这里, 希望大家还是多多练习, 有什么疑问就加群: 223856254