首页 > 代码库 > 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