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

【2014-01-26】cocos2dx学习笔记:触摸响应

[历史归档]本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。
发布时间:2014-01-26| 标题:cocos2dx学习笔记:触摸响应分类:编程 / C && C++ / cocos2dx |标签:cocos2dx·事件响应


cocos2dx学习笔记:触摸响应

    • cocos2dx事件响应源码摘录:
      • CCLayer关于事件响应的代码:
      • CCTouchDispatcher:

最近项目中用到了cocos2dx来开发一个基于陀螺仪的demo,忙了半个星期,一边学习一边开发,总算搞了出来。这里备份下开发中学习到的一些cocos2dx知识。

cocos2dx事件响应源码摘录:

基于版本:2.2.1,代码版权属于cocos原作者。

CCLayer关于事件响应的代码:

setTouchEnabled:

voidCCLayer::setTouchEnabled(boolenabled){if(m_bTouchEnabled!=enabled){m_bTouchEnabled=enabled;if(m_bRunning){if(enabled){//注册事件响应this->registerWithTouchDispatcher();}else{//去除注册事件响应// have problems?CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);}}}}

registerWithTouchDispatcher:

voidCCLayer::registerWithTouchDispatcher(){CCTouchDispatcher*pDispatcher=CCDirector::sharedDirector()->getTouchDispatcher();// Using LuaBindingsif(m_pScriptTouchHandlerEntry){//lua相关,先略去。。。。。}else{//从此处可以发现,TouchMode和TouchPriority可以决定注册事件响应的类型。//而Mode和Priority可以通过get/set设置。if(m_eTouchMode==kCCTouchesAllAtOnce){pDispatcher->addStandardDelegate(this,0);}else{pDispatcher->addTargetedDelegate(this,m_nTouchPriority,true);}}}//TouchMode的枚举定义如下:typedefenum{kCCTouchesAllAtOnce,kCCTouchesOneByOne,}ccTouchesMode;//get set 如下:voidCCLayer::setTouchMode(ccTouchesMode mode){if(m_eTouchMode!=mode){m_eTouchMode=mode;if(m_bTouchEnabled){setTouchEnabled(false);setTouchEnabled(true);}}}voidCCLayer::setTouchPriority(intpriority){if(m_nTouchPriority!=priority){m_nTouchPriority=priority;if(m_bTouchEnabled){setTouchEnabled(false);setTouchEnabled(true);}}}intCCLayer::getTouchPriority(){returnm_nTouchPriority;}intCCLayer::getTouchMode(){returnm_eTouchMode;}

代码看到此处,根据前文【 cocos2dx学习笔记:吞噬事件相应 】提到的方法,也可以使用下面代码:

//CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, -210, true);this->setTouchPriority(-210);this->setTouchMode(kCCTouchesOneByOne);this->setTouchEnabled(true);

CCTouchDispatcher:

voidCCTouchDispatcher::touches(CCSet*pTouches,CCEvent*pEvent,unsignedintuIndex){CCAssert(uIndex>=0&&uIndex<4,"");CCSet*pMutableTouches;m_bLocked=true;// optimization to prevent a mutable copy when it is not necessaryunsignedintuTargetedHandlersCount=m_pTargetedHandlers->count();unsignedintuStandardHandlersCount=m_pStandardHandlers->count();boolbNeedsMutableSet=(uTargetedHandlersCount&&uStandardHandlersCount);pMutableTouches=(bNeedsMutableSet?pTouches->mutableCopy():pTouches);structccTouchHandlerHelperDatasHelper=m_sHandlerHelperData;//// process the target handlers 1st//if(uTargetedHandlersCount>0){CCTouch*pTouch;CCSetIterator setIter;for(setIter=pTouches->begin();setIter!=pTouches->end();++setIter){pTouch=(CCTouch*)(*setIter);CCTargetedTouchHandler*pHandler=NULL;CCObject*pObj=NULL;CCARRAY_FOREACH(m_pTargetedHandlers,pObj){pHandler=(CCTargetedTouchHandler*)(pObj);if(!pHandler){break;}boolbClaimed=false;if(uIndex==CCTOUCHBEGAN){bClaimed=pHandler->getDelegate()->ccTouchBegan(pTouch,pEvent);//如果该触摸began返回true,说明handler开始处理这个事件(,但是不代表handler要吞噬这个事件!!!)if(bClaimed){pHandler->getClaimedTouches()->addObject(pTouch);}}else//经过测试发现,当一个触摸事件生成之后,从began,到end和cancel,都是同一个对象。if(pHandler->getClaimedTouches()->containsObject(pTouch)){// moved ended canceledbClaimed=true;switch(sHelper.m_type){caseCCTOUCHMOVED:pHandler->getDelegate()->ccTouchMoved(pTouch,pEvent);break;caseCCTOUCHENDED:pHandler->getDelegate()->ccTouchEnded(pTouch,pEvent);pHandler->getClaimedTouches()->removeObject(pTouch);break;caseCCTOUCHCANCELLED:pHandler->getDelegate()->ccTouchCancelled(pTouch,pEvent);pHandler->getClaimedTouches()->removeObject(pTouch);break;}}if(bClaimed&&pHandler->isSwallowsTouches()){if(bNeedsMutableSet){pMutableTouches->removeObject(pTouch);}//注意这里的break,如果目标触摸被响应而且被设置吞噬,那么直接跳出内层循环,后续handler均不能响应这个触摸。break;}}}}//// process standard handlers 2nd////当目标触摸全部结束之后,将挑剩下的touch事件一次性丢给标准触摸相应。if(uStandardHandlersCount>0&&pMutableTouches->count()>0){CCStandardTouchHandler*pHandler=NULL;CCObject*pObj=NULL;CCARRAY_FOREACH(m_pStandardHandlers,pObj){pHandler=(CCStandardTouchHandler*)(pObj);if(!pHandler){break;}switch(sHelper.m_type){caseCCTOUCHBEGAN:pHandler->getDelegate()->ccTouchesBegan(pMutableTouches,pEvent);break;caseCCTOUCHMOVED:pHandler->getDelegate()->ccTouchesMoved(pMutableTouches,pEvent);break;caseCCTOUCHENDED:pHandler->getDelegate()->ccTouchesEnded(pMutableTouches,pEvent);break;caseCCTOUCHCANCELLED:pHandler->getDelegate()->ccTouchesCancelled(pMutableTouches,pEvent);break;}}}if(bNeedsMutableSet){pMutableTouches->release();}//// Optimization. To prevent a which is expensive// the add/removes/quit is done after the iterations//m_bLocked=false;。。。。。。 。。。。。。}
http://www.jsqmd.com/news/1213308/

相关文章:

  • Pyecharts实战:5种交互式数据可视化图表制作
  • 【Devin AI工程师跃迁路线图】:从Prompt Engineer到AI系统架构师的4阶晋升模型(含GitHub实战项目库)
  • 亨得利官方钟表服务中心|全部网点地址与客服热线权威信息通知(2026年7月最新) - 亨得利官方
  • 如何高效使用N_m3u8DL-RE:跨平台流媒体下载完整指南
  • 2026最新高性价比的GEO优化工具测评排行榜:新手小白看完不踩坑 - 资讯快报
  • 北京嵌入式培训机构多维度测评报告 - 教育品牌推荐官
  • 2026 宁波海曙管道疏通实测推荐|下水道 / 马桶 / 地漏 / 化粪池疏通、高压清洗、改管打捞口碑榜全维度测评(7 月宁波海曙区深度测评) - 热点速览
  • 嵌入式低功耗设计:时钟门控技术原理与TM4C实战配置
  • ROS2导航系统(Jetson Orin NX)-第一章-底盘松灵Ranger Mini V3.0 gs_usb
  • Tiva TM4C定时器GPTM寄存器实战:从配置到中断与PWM应用
  • 经济研究LaTeX模板终极指南:5分钟搞定专业学术排版
  • 终极解决方案:Keyboard Chatter Blocker - 精准消除键盘连击的免费开源工具
  • 多智能体大语言模型实现一句话生成生产级网页的技术解析
  • Reloaded-II终极指南:5分钟掌握跨平台游戏模组加载框架
  • Adobe-GenP 3.0:三步激活Adobe全家桶的完整指南
  • 人形机器人26小时自主运行:系统集成、能源管理与异常处理全解析
  • Hypermesh如何恢复模型浏览器的树状结构
  • INNOVUS Floorplan核心技术解析与优化实践
  • 终极Unity资源解密方案:AssetStudio如何高效提取加密游戏资产
  • 如何用Telegraf解决企业级监控数据孤岛问题:插件化架构与3个实战场景
  • 2026年7月成都联想笔记本门店地址电话整理|键盘触控板与接口场景到店指南|设备登记要点 - 品牌售后
  • Mixxx免费DJ软件:如何用开源神器打造专业混音工作室
  • GPT-5.6性能解析:多场景效率提升与成本优化指南
  • 3分钟掌握思源宋体CN:开源中文设计字体的完全指南
  • 5个高效技巧:用GanttProject项目管理工具轻松掌控项目进度
  • Royal TSX 5步轻松实现完整中文界面本地化:终极免费汉化包指南
  • 如何快速掌握PCL2:5个步骤打造专属Minecraft启动体验
  • 三极管开关电路原理与设计实践指南
  • 亲身探访北京伯爵官方售后服务中心|全部地址与售后服务热线(2026年7月最新) - 亨得利钟表维修中心
  • 2026年7月成都苹果设备维修网点查询参考|iPhone屏幕触控与资料核对|设备登记要点 - 数码品牌推荐