原作者:有缘人  来源:新浪微博 地址:http://blog.sina.com.cn/s/blog_6ac2c7260102vvdu.html

一、touch事件响应分为单点触摸响应和多点触摸响应。

单点触摸响应需要重载的方法:

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);

多点触摸需要重载的方法:

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);

二、单点触摸本质上需要调用的方法,即设置touch的代理

CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,-129,true);

多点触摸本质上需要调用的方法

CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this,-129);

所以,只要调用了以上方法,就可以实现触摸响应,就不再需要调用setTouchEnabled(true);

三、setTouchEnabled的方法实现

void CCLayer::setTouchEnabled(bool enabled)

{

    if (m_bTouchEnabled != enabled)

    {

        m_bTouchEnabled = enabled;

        if (m_bRunning)

        {

            if (enabled)

            {

                this->registerWithTouchDispatcher();

            }

            else

            {

                // have problems?

                CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);

            }

        }

    }

}

这段代码最主要的一句this->registerWithTouchDispatcher();

这个方法中就是调用第二点中提到的两个delegate添加方法。

所以,咱们实现touch响应的话,需要重载 registerWithTouchDispatcher()方法,并在这个方法中添加实现

void HelloWorld::registerWithTouchDispatcher()

{

   CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this,-129);

   //CDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,-129,true);

}

由此,实现touch事件响应需要做的操作:

1.重载registerWithTouchDispatcher()并实现

2.setTouchEnabled(true);

3.重载touch或者touches系列方法

四、在CCLayer的registerWithTouchDispatcher()中有关于m_eTouchMode的判断,并且有setTouchMode()方法,参数有两种:kCCTouchesOneByOne 和 kCCTouchesAllAtOnce,分别代表单点触摸和多点触摸

当touchMode为kCCTouchesOneByOne 时,调用的是addTargetedDelegate方法;当touchMode为kCCTouchesAllAtOnce时,调用的是addStandardDelegate方法

所以,“重载registerWithTouchDispatcher()并实现”可以由setTouchMode()方法来替换

欢迎关注关东升新浪微博@tony_关东升。

关注智捷课堂微信公共平台,了解最新技术文章、图书、教程信息

更多精品iOS、Cocos、移动设计课程请关注智捷课堂官方网站:http://www.zhijieketang.com

智捷课堂论坛网站:http://51work6.com/forum.php

最新文章

  1. 重置EntityFramework数据迁移到洁净状态
  2. 传统开发模型vs敏捷开发模型——过程模型的变革
  3. java的值传递和引用传递
  4. VMware+Fedora20+secureCRT7.0配置心得
  5. js学习总结
  6. poj-3056 http://poj.org/problem?id=3056
  7. 为什么switch...case语句比if...else执行效率高
  8. Nlpir Parser智能语义平台全文搜索
  9. CENTOS6.6下redis3.2集群搭建
  10. Linux中LAMP构架的实现
  11. 爬坑之路---Google map
  12. python中文件读写
  13. jsfl 删除库指定内容
  14. Spring:AOP
  15. arcgis javascript api 事件的监听及移除
  16. 第六次作业-my Backlog
  17. [py]类的专有方法
  18. 设计模式之模板方法模式&&迪米特法则(代码Objective-C展示)
  19. Node.js从入门到实战ECMAScript6一页纸总结(很大的一页纸)
  20. easyui表单提交验证form

热门文章

  1. SQL优化- 数据库SQL优化——使用EXIST代替IN
  2. Android开发SDK接入机智云,智能家居实现APP远程控制多设备
  3. lucene 加速索引建立速度
  4. 转用Jmeter测试RabbitMQ
  5. opengl剪裁空间和视口空间中不遵从右手定则,而是遵从左手定则
  6. OA项目之权限设计②
  7. C# 通过 AppDomain 应用程序域实现程序集动态卸载或加载
  8. nginx源码学习_数据结构(ngx_int_t)
  9. 345. Reverse Vowels of a String【easy】
  10. shell脚本之微信报警功能的实现