cocos2d触摸事件处理机制(2.x和3.x变化)

本文详细介绍了Cocos2d-x中2.x及3.x版本的单点和多点触屏事件处理方法,包括事件注册、响应函数重写等关键步骤,并对比了不同版本间的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2.x的触摸事件的版本号

触摸事件处理有2种子。以下单点触摸的样本。(另一种多点触摸屏)。

创建cocos2d 该项目。

1. 重写下面虚函数。

  bool ccTouchBegan(cocos2d::CCTouch* touch, cocos2d::CCEvent* event);  
  void ccTouchMoved(cocos2d::CCTouch* touch, cocos2d::CCEvent* event);  
  void ccTouchEnded(cocos2d::CCTouch* touch, cocos2d::CCEvent* event); 


//注意不要和ccTouchesBegan函数混淆,这是多点触屏的响应事件。顾名思义。加了es。
  void onEnter(); 
  void onExit(); //这个函数是点击关闭button运行的函数,能够在里面加入有必要的代码,再退出之前。

,这里主要是退出前进行移除触屏事件。

  //假设有学过MFC的话,这个函数就是类似于OnCancel()函数。

 //以下就是简单地说明步骤。

2.然后为上面的函数加入内容。

void HelloWorld::onEnter()
{   
 CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,false);  //注冊事件
 CCLayer::onEnter();
 
}
void HelloWorld::onExit()
{

 CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
 CCLayer::onExit();
}
bool HelloWorld::ccTouchBegan(CCTouch* touch, CCEvent* event)  
  {  
       CCLOG("ccTouchBegan");  //后台输出
       return true;  
   } 
void HelloWorld::ccTouchMoved(CCTouch* touch, CCEvent* event){  
      CCLOG("ccTouchMoved");  
   } 
void HelloWorld::ccTouchEnded(CCTouch* touch, CCEvent* event)  
 {  
    CCLOG("ccTouchEnded");  
 } 


 

这里笔者感概一下、

//有人说

//“正确的应该使用setTouchEnabled(true)来注冊事件,对于上面的注冊事件的代码的简化。会出现逻辑问题,并且造成控制触屏事件的操作性减低”

// 我说,不然。既然你使用了自己的方法去注冊事件,你就不是必需再次使用他们封装好的setTouchEnabled()函数。里面函数有他们的逻辑推断。(你能够

不断寻找到那个函数的内容看看的)。我们也有自己的逻辑推断。

所以不是正确与错的问题。而是你的游戏需求,需不须要。另外。我更喜欢懂其然,

知其理,还有我想说,这个cocos2d框架已经减低非常大的门槛了,把非常多底层的操作封装,所以不懂opengl和dx的人也能够上手,这里我想说。

对于不懂opengl和dx,还是有必要去加强基础。虽说。你不去学习。也没有什么大问题,可是非常多大问题通常是建立在细节上。

 

经过了上面2个步骤,简单实现了单点触屏事件的处理。

以下顺便也讲一下多点触屏事件的处理。

步骤差点儿相同。只是就是重写函数有点差别。

1.重写下面函数。

<pre name="code" class="cpp">virtual <span style="font-family: Arial, Helvetica, sans-serif;">void ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);</span>
virtual <span style="font-family: Arial, Helvetica, sans-serif;">void ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);</span>
virtual <span style="font-family: Arial, Helvetica, sans-serif;">void ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);</span>
virtual void onEnter();virtual void onExit();



 

2.为上面的函数加入内容。

void HelloWorld::onEnter()
{

CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, kCCMenuHandlerPriority -1,true); //这里和第一个有差别
 CCLayer::onEnter();
}
void HelloWorld::onExit()
{

CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
 CCLayer::onExit();
}


其它的3个事件响应内容自己写。笔者不再反复上面的了。

3.x版本号的触屏事件

谈到3.x版本号的cocos,这变化不是一般的大,各种处理方式都改变了,算了,你懂得,不谈他的变化有多大。下面是3.x版本号的触屏事件处理方式。

尽管是改变比較大,但处理方式和思维给开发人员一个非常方便的处理方式。3.x的版本号我认为规范性比2.x好了好多。下面直接给代码。不进行解析
多点触摸类似
//单点触摸  
	virtual bool onTouchBegan(Touch *touch, Event * pEvent);
	virtual void onTouchMoved(Touch *touch, Event * pEvent);
	virtual void onTouchEnded(Touch *touch, Event * pEvent); 
	virtual void onTouchCancelled(Touch *touch, Event * pEvent);  

     auto dispatcher = Director::getInstance()->getEventDispatcher();  
	auto TouchListener = EventListenerTouchOneByOne::create();   
	TouchListener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan,this);  
	TouchListener->onTouchMoved = CC_CALLBACK_2(HelloWorld::onTouchMoved,this);   
	TouchListener->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded,this);   
	TouchListener->onTouchCancelled = CC_CALLBACK_2(HelloWorld::onTouchCancelled,this);   
	TouchListener->setSwallowTouches(true);  
	dispatcher->addEventListenerWithSceneGraphPriority(TouchListener,this);

bool HelloWorld::onTouchBegan(Touch *touch, Event * pEvent)
{
	CCLOG("onTouchBegan");
	return 1;
}
void HelloWorld::onTouchMoved(Touch *touch, Event * pEvent)
{
	CCLOG("onTouchMoved");
}
void HelloWorld::onTouchEnded(Touch *touch, Event * pEvent)
{
	CCLOG("onTouchEnded");
}
void HelloWorld::onTouchCancelled(Touch *touch, Event * pEvent)
{
	CCLOG("onTouchCancelled");
}




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值