第一种是采用函数回调,主要是用于MenuItem

  1. // a selector callback
  2. void menuCloseCallback(Object* pSender);
  3. auto closeItem = MenuItemImage::create("CloseNormal.png","CloseSelected.png",
  4. CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
  5. void HelloWorld::menuCloseCallback(Object* pSender)
  6. {
  7. Director::getInstance()->end();
  8. #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
  9. exit(0);
  10. #endif
  11. }

从上面的代码也可以看得到3.0的一些改变

用CC_CALLBACK_x代替了 按钮的 menu_selector(),update的 schedule_selector 回调接口,其中最后一个x代表着回调函数的参数有几个,0表示0个,1表示1个,2表示2个,上面的例子是1个参数,所以用CC_CALLBACK_1

第二种方法我也不是很明白,TouchEvent响应

这是新加入的响应方式。它主要是使用在UIWidget上的。可以将其看做是函数回调的一个扩展,为更多的响应处理提供可能。使用方法大致是:

  1. //声明
  2. void touchButton(Object* object,TouchEventType type);
  3. //挂接到控件上
  4. uiButton->addTouchEventListener(this,toucheventselector(HelloWorld::touchButton));
  5. //实现
  6. void HelloWorld::touchButton(Object* object,TouchEventType type)
  7. {
  8. LabelTTF* label;
  9. switch (type)
  10. {
  11. case TouchEventType::TOUCH_EVENT_BEGAN:
  12. label = static_cast(getChildByTag(11));
  13. label->setString("按下按钮");
  14. break;
  15. case TouchEventType::TOUCH_EVENT_MOVED:
  16. label = static_cast(getChildByTag(11));
  17. label->setString("按下按钮移动");
  18. break;
  19. case TouchEventType::TOUCH_EVENT_ENDED:
  20. label = static_cast(getChildByTag(11));
  21. label->setString("放开按钮");
  22. break;
  23. case TouchEventType::TOUCH_EVENT_CANCELED:
  24. label = static_cast(getChildByTag(11));
  25. label->setString("取消点击");
  26. break;
  27. default:
  28. break;
  29. }
  30. }

因为所有的UIWidget都要添加到UILayer上,而UILayer通常都会在最上层,所以可以“基本上”认为这种使用方式会优先于其他方式处理点击消息。因为UILayer也会有层级的改变,比如它和MenuItem之间的关系。所以说“基本上”。

第三种 触摸监听绑定

我觉得这种方法相当方便,不仅可以绑定在精灵上,还可以绑定在层上,触摸函数也可以用lambda来写。下面是方法

  1. auto listener1 = EventListenerTouchOneByOne::create();//创建一个触摸监听
  2. listener1->setSwallowTouches(true);//设置是否想下传递触摸
  3. Rect rect = Rect(qipanPoint.x,qipanPoint.y
  4. ,qipanSize.width,qipanSize.height);
  5. //3.0 后可以直接在touchBegan后添加它的实现代码,而不用特意去写一个touchBegan的函数
  6. listener1->onTouchBegan = [rect,this](Touch* touch, Event* event){ //[]中间的是传入的参数
  7. auto target = static_cast(event->getCurrentTarget());//获取的当前触摸的目标
  8. Point locationInNode = target->convertToNodeSpace(touch->getLocation());
  9. Size s = target->getContentSize();
  10. if (rect.containsPoint(locationInNode))//判断触摸点是否在目标的范围内
  11. {"white-space:pre"> //以下是我自定义的一些操作
  12. //创建锁定精灵
  13. auto lockSprite = Sprite::create("lock.png");
  14. lockSprite->setPosition(GetQiziPoint(locationInNode,rect));
  15. lockSprite->setTag(99);
  16. this->addChild(lockSprite);
  17. return true;
  18. }else
  19. return false;
  20. };
  21. //拖动精灵移动
  22. listener1->onTouchMoved = [rect,this](Touch* touch, Event* event){
  23. auto target = static_cast(event->getCurrentTarget());//获取的当前触摸的目标
  24. Point locationInNode = target->convertToNodeSpace(touch->getLocation());
  25. Size s = target->getContentSize();
  26. if (rect.containsPoint(locationInNode))//判断触摸点是否在目标的范围内
  27. {
  28. //锁定精灵移动
  29. Sprite *lockSprite = (Sprite*)this->getChildByTag(99);
  30. lockSprite->setPosition(GetQiziPoint(locationInNode,rect));
  31. }
  32. };
  33. listener1->onTouchEnded = [=](Touch* touch, Event* event){ // =在c++11里面代表这个lambda表达式中能使用外面的变量
  34. this->removeChildByTag(99);//移除锁定精灵
  35. };
  36. //将触摸监听添加到eventDispacher中去
  37. _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1 ,layer);

第四种

  1. auto listener = EventListenerTouchOneByOne::create();//创建一个触摸监听(单点触摸)
  2. listener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this);//指定触摸的回调函数
  3. _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,listen_layer);//将listener和layer绑定,放入事件委托中
  4. bool HelloWorld::onTouchBegan(Touch* touch, Event  *event)
  5. {
  6. auto point = Director::getInstance()->convertToGL(touch->getLocationInView());//获得当前触摸的坐标
  7. auto rect = Rect(160-30,400-30,60,60);//设置框坐标和大小处于close 按钮的位置上
  8. if(rect.containsPoint(point))//如果触点处于rect中
  9. {
  10. auto menu = (Menu*)this->getChildByTag(99);//通过tag获取到menu
  11. auto item = (MenuItem*)menu->getChildByTag(99);//通过tag从menu中获取item
  12. item->activate();//让item响应
  13. }
  14. return true;//返回true表示接收触摸事件
  15. }

3.x的触摸响应机制的更多相关文章

  1. 08 (OC)* 事件的传递和响应机制

    前言:苹果的官方文档<Event Handling Guide for iOS>对事件处理做了非常详尽清晰的解释,建议大家仔细研读 1. iOS中的事件介绍 2. 事件的产生和传递 3. ...

  2. MFC消息响应机制 q

    MFC消息响应机制分析 1 引言微软公司提供的MFC基本类库(Microsoft Foundation Classes),是进行可视化编程时使用最为流行的一个类 库.MFC封装了大部分Windows ...

  3. React-native 中的触摸响应功能

    我们在做APP的时候,与桌面应用系统不同的是触摸响应. web页面对触摸响应的支持和原生的APP有着很大的差异. 基本用法 componentWillMount: function() { this. ...

  4. Mfc资源消息的响应机制

    Mfc消息的响应机制 Mfc中有很多资源,如图标资源,菜单资源,工具栏资源等等:那么,资源是如何进行消息响应和消息映射的呢? 它们的流程是: 某种资源——对应的ID号——消息映射——响应函数的声明与实 ...

  5. MFC消息响应机制分析

    ---- 摘要: ---- MFC是Windows下程序设计的最流行的一个类库,但是该类库比较庞杂,尤其是它的消息映射机制,更是涉及到很多低层的东西,我们在这里,对它的整个消息映射机制进行了系统的分析 ...

  6. HTTP请求响应机制与响应状态码

    转载来源:http://blog.csdn.net/xyw591238/article/details/51907143 HTTP协议 Internate的基本协议是TCP/IP(传输控制协议和网际协 ...

  7. 关于cocostudio动态添加控件触摸响应无效的学习

    time:2015/04/19 1. 描述 * 把studio制作的ui加载之后,动态添加事件(比如说,单点触摸),结果回调函数(eg:onTouchBegan等)根本没有响应! * 另外,网上有朋友 ...

  8. Django的视图流式响应机制

    Django的视图流式响应机制 Django的响应类型:一次性响应和流式响应. 一次性响应,顾名思义,将响应内容一次性反馈给用户.HttpResponse类及子类和JsonResponse类属于一次性 ...

  9. 生产环境缺陷来源VS 缺陷管理响应机制

    生产环境缺陷主要来源于用户反馈.版本内遗留.内部反馈和监控后台报警,具体内容包含以下途径: 1.用户反馈: ①  前台电话方式 ②  意见反馈后台 ③  第三方平台:如微博.App Store等渠道 ...

随机推荐

  1. Sequel Pro 免费的MySQL管理客戶端(有SSH部分)

    官方站點:http://www.sequelpro.com Sequel Pro 的原名是 CocoaMySQL,是一个与 phpMyAdmin 類似的 MySQL 管理工具.它是由 Cocoa 和面 ...

  2. 你只是看起来很努力(只是做了一遍真题,草草的对了一遍答案,然后冲出自习室继续她学生会的事情了,骗自己更容易)good——想起了自己在六大时候的无奈

    (转)你只是看起来很努力一次上课,一个女孩子垂头丧气的跟我说,老师,我考了四次四级,还没过,究竟是为什么. 我说,你真题做了吗?单词背了吗?她拿出已经翻破了的真题,跟我说,你讲的所有的题目我连答案都记 ...

  3. SQL Server Mobile 和 .NET 数据访问接口之间的数据类型映射

      .NET 数据类型 SQL Server Mobile 数据类型 binary varbinary boolean bit byte tinyint byte[] varbinary dateti ...

  4. matlab 设置横纵坐标刻度的字体!!

    set(gca,'FontSize',16) %%设置横纵坐标字体的大小

  5. PHP实现浏览历史记录

    http://www.3a88.com/service/206.html http://www.1360.cc/ZhanChangJiaoCheng/6831.html http://www.osch ...

  6. IDE模式下安装Windows 7强行改回ACHI后不断重启的解决方法

    问题描述:用U盘启动进PE装的Win7,由于PE认不出硬盘,只好进BIOS设置硬盘模式为IDE才安装上.结果安装完系统后,在BIOS中强行修改硬盘模式为ACHI模式后,Win7开机不断重启,进不了系统 ...

  7. HAOI2011 problem b

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 1047  Solved: 434[Submit][ ...

  8. [VC6]ONMESSAGE()宏编译时出现"sytax error ;"错误时

    自定义消息时编译出错,经排查,在定义消息的头文件里 #define WM_XXX (WM_USER+1000); 最后多加了一个分号引起. 吐血.

  9. 【 D3.js 高级系列 — 1.1 】 封装文本自动换行

    在[高级 - 第 1.0 章]中讲解了在 SVG 中如何配合使用 text 和 tspan 来实现换行的功能,本文对此功能进行一下封装,以后就可以直接用了. 1. 引用 js 文件 下载地址:mult ...

  10. 【JSP】让HTML和JSP页面不缓存从Web服务器上重新获取页面

    用户退出后,如果点击浏览器上的后退按钮,Web应用将不能正确保护受保护的页面——在Session销毁后(用户退出)受保护的JSP页重新在浏览器中显示出来. 然而,如果用户点击返回页面上的任何链接,We ...