首页 > 代码库 > cocos2dX 事件之触摸事件和触摸事件集合
cocos2dX 事件之触摸事件和触摸事件集合
今天, 我们来学习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