当前位置: 首页 > news >正文

Cocos2d-x之Touch事件处理机制

http://www.cppblog.com/Tongy0/archive/2013/03/10/198325.aspx


一、两种机制的四种不同的事件

CCStandardTouchDelegate 默认事件
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);处理打断事件
CCTargetedTouchDelegate
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);处理用户按下事件,true表示继续处理, 否则false.
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);处理按下并移动事件
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);处理松开事件
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);处理打断事件

两者的区别: CCSetCCTouch ,一个事件集合一个单个事件。

事件分发的顺序: CCTargetedTouchDelegateCCStandardTouchDelegate

默认情况下所有 CCLayer 都没有启用触摸事件,需要 this->setIsTouchEnabled(true); 启用。

如需更改事件: void registerWithTouchDispatcher(void) {}

class MyLayer: public cocos2d:CCLayer {
public:virtual void registerWithTouchDispatcher(void);// addStandardDelegate()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);// addTargetedDelegate()virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
}void MyLayer::registerWithTouchDispatcher(void) {// 委托,优先级CCTouchDispatcher::sharedDispatcher()->addStandardDelegate(this, kCCMenuTouchPriority);// 委托,优先级,是否继续处理CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, kCCMenuTouchPriority, true);// 2.0版本以后CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this, kCCMenuHandlerPriority);CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, kCCMenuHandlerPriority, true);
}

利用 ccTouchBeganccTouchesBegan 加以实现点击的回调

void MyLayer::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) {// 单点CCTouch *pTouch = (CCTouch*)(pTouches->anyObject());// 所有点for(CCSetIterator iterTouch = pTouches->begin(); iterTouch != pTouches->end(); iterTouch++) {CCTouch *pCurTouch =  (CCTouch*)(*iterTouch);}// 获取点在视图中的坐标(左上角为原点)CCPoint touchLocation = pTouch->getLocationInView();// 把点的坐标转换成OpenGL坐标(左下角为原点)touchLocation = CCDirector::sharedDirector()->convertToGL(touchLocation);// 把OpenGL的坐标转换成CCLayer的坐标CCPoint local = convertToNodeSpace(touchLocation)// 大小为100x100,坐标为(0, 0)的矩形CCRect * rect = CCRectMake(0, 0, 100, 100);// 判断该坐标是否在rect矩形内bool flag = rect.containsPoint(local)if(flag) {// 回调} else {// 不执行}
}

http://blog.sina.com.cn/s/blog_6c97abf10102v6hs.html


移动时代,手机很重要的一部分就是可以人机交互,玩家通过手指在屏幕上移动点击与游戏进行互动,传达信息。相比PC上鼠标的输入,这种触控能带给用户更真实的体验,所以触摸事件也是游戏中不可缺少的部分,并且随着手机硬件的不断提升,现在市场上大部分手机屏幕也支持多点触摸。本节视频将介绍在引擎中如何响应单点和多点触摸事件。

11111111111111 单点触控

class MyScene : public CCLayer
{
public:
 MyScene(void);
 ~MyScene(void);
 virtual bool init();
 static CCScene *scene();

 void menuCallback(CCObject* pSender);

 virtual voidonEnter();
 virtual void onExit();

 virtual boolccTouchBegan(CCTouch *pTouch,CCEvent*event); //第一次触屏事件
 virtual void ccTouchMoved(CCTouch *pTouch,CCEvent*event); //滑动操作
 virtual void CCTouchEnded(CCTouch *pTouch,CCEvent*event); //当离开屏幕时候,响应的事件
 virtual void ccTouchCancelled(CCTouch*pTouch,CCEvent *event); //取消

 CCSprite *sp;

 CREATE_FUNC(MyScene);

};
//
void MyScene:: onEnter()
{
 CCLayer::onEnter();
 CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,true);
  //1,委托目标,2,值越小,优先级别越高,如果0,按钮最先被响应。3,是否拦截后面的操作

}

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

bool MyScene:: ccTouchBegan(CCTouch *pTouch,CCEvent*event) //第一次触屏事件
{
 CCPoint pos =pTouch->getLocation();//返回OPenGL坐标
 
 sp =CCSprite::create("icon.png"); //创建一个精灵
 sp->setPosition(pos);
 addChild(sp);

 CCLOG("TouchBegan");


 returntrue;//true,继续响应后面的,false,就不响应后面的了
}

void MyScene::ccTouchMoved(CCTouch *pTouch,CCEvent*event) //滑动操作
{
 CCPoint pos =pTouch->getLocation();//返回OPenGL坐标
 sp->setPosition(pos);

 CCLOG("TouchMoved");
}
void MyScene::CCTouchEnded(CCTouch *pTouch,CCEvent*event) //当离开屏幕时候,响应的事件
{
 CCLOG("TouchEnded");
}
void MyScene::ccTouchCancelled(CCTouch *pTouch,CCEvent*event) //取消
{
 CCLOG("TouchCancelled");
}

//多点触控 

 

virtual void ccTouchesBegan(CCSet *pTouches,CCEvent *event);
 virtual void ccTouchesMoved(CCSet*pTouches,CCEvent *event);
 virtual void ccTouchesEnded(CCSet*pTouches,CCEvent *event);

 

//

void MyScene::ccTouchesBegan(CCSet *pTouches,CCEvent*event)//得到每个触摸点
{

 CCSetIterator iter = pTouches->begin();
 for(;iter != pTouches->end(); iter++)
 {
  CCTouch *pTouch =(CCTouch*)(*iter);
  CCPoint pos =pTouch->getLocation();

  CCSprite *sp =CCSprite::create("icon.png");
  sp->setPosition(pos);
  addChild(sp);
 }

 

}

//

void MyScene::ccTouchesBegan(CCSet *pTouches,CCEvent*event)//得到每个触摸点
{

 //多点触控也可设置成单点触控

CCTouch *touch =(CCTouch*)pTouches->anyObject();
 CCPoint pos = touch->getStartLocation();
 CCSprite *sp =CCSprite::create("icon.png");
 sp->setPosition(pos);
 addChild(sp);

}

 

void MyScene::ccTouchesMoved(CCSet *pTouches,CCEvent *event)
{

}

void MyScene::ccTouchesEnded(CCSet *pTouches,CCEvent *event)
{

}

//333333333333333

void MyScene::ccTouchesBegan(CCSet *pTouches,CCEvent*event)//得到每个触摸点
{
 
 CCSetIterator iter = pTouches->begin();
 for(;iter != pTouches->end(); iter++)
 {
  CCTouch *pTouch =(CCTouch*)(*iter);
  CCPoint pos =pTouch->getLocation();

  pTouch->getID();//可以得到有几个点

  
 }
 //CCTouch *touch =(CCTouch*)pTouches->anyObject();
 //CCPoint pos =touch->getStartLocation();
 //CCSprite *sp =CCSprite::create("icon.png");
 //sp->setPosition(pos);
 //addChild(sp);
}


http://www.xdnf.cn/news/806671.html

相关文章:

  • 全国各大学精品课程网站
  • 中秋祝福邮件模板来咯!自取不谢!
  • 科普:黑客盗QQ究竟是怎么回事?
  • 16个值得个人站长做的广告联盟[转自cnzz]
  • 市场复盘总结 20240321
  • 如何开启WinXP的IIS服务把z-blog安装到本地
  • 7000万个腾讯QQ群数据遭泄露
  • 如何架设NOD32升级服务器
  • 永恒之蓝漏洞原理
  • TOP Server教程:定义TOP Server管理员密码
  • 支付系统高可用架构设计实战,可用性高达99.999!
  • 如何用C#语言构造蜘蛛程序
  • XDelBox 1.5 公测版发布
  • 【CSS】CSS 文本样式 ② ( font 字体设置 | CSS 2.0手册使用 | font-weight 字体粗细设置 | font-style 字体斜体设置 | font 字体样式综合写法 )
  • 美国php空间推荐,美国php空间php空间推荐
  • hd2刷机详细步骤
  • Linux操作系统简介:为何成为全球开发者热门选择?
  • 收集struts2各种版本下载地址
  • 移动硬盘插服务器上坏了,移动硬盘接口坏了怎么办解决教程
  • 2017全国计算机ps版本,Adobe Photoshop v18.0.0 (PS CC 2017) 中文多语言版本 不断更新
  • 游戏开发之UDK引擎介绍和模型导入
  • android 百度浏览器内核,百度浏览器安卓6.2版上线:新一代内核更快更稳定
  • vs2013 InstallShield打包卸载程序
  • 百度SEO优化技巧与布局(提升网站排名的5种有效方法)
  • android手机分辨率整理
  • 待机异常篇
  • 4.4 Linux文件系统-挂载卸载和超级块
  • Linux虚拟机Apache服务器配置
  • 什么是3322域名?3322域名如何注册?
  • C++开发股票软件