【Cocos2d-x 学习笔记 目录链接】

1. 简介

control为其子类提供了touch回调函数,当子类触发EventType相关事件时,会调用相关的回调函数。

control对象接收到的事件类型分9类:

    enum class CC_EX_DLL EventType
{
TOUCH_DOWN = << ,
DRAG_INSIDE = << ,
DRAG_OUTSIDE = << ,
DRAG_ENTER = << ,
DRAG_EXIT = << ,
TOUCH_UP_INSIDE = << ,
TOUCH_UP_OUTSIDE = << ,
TOUCH_CANCEL = << ,
VALUE_CHANGED = <<
};

用二进制的不同位表示单一的事件类型,说明这些类型可以同时发生。我们用或运算对多个单一事件进行拼接,形成综合的事件。判断事件类型时,对二进制按位与运算检测,得出综合事件包含了哪些单一事件。

control所处的状态分为4种:

    enum class State
{
NORMAL = << ,
HIGH_LIGHTED = << ,
DISABLED = << ,
SELECTED = <<
};

std::unordered_map<int, Vector<Invocation*>*> _dispatchTable

该哈希表key为EventType的二进制int,value为容器Vector,里面存储了相同EventType的Invocation。

构造函数中未被create修改的变量:

_hasVisibleParents(false)
_isOpacityModifyRGB(false)
_state(State::NORMAL)

2. Invocation

Invocation直接继承Ref,为control而生,存储了control对象在某种EventType下执行的函数action。

create(Ref* target, Control::Handler action, Control::EventType controlEvent)

create方法调用了其构造函数,将三个参数赋给Invocation的_target _action _controlEvent。

3. 成员方法

- Control* create()

create方法调用了父类Layer的init方法,setContentSize为屏幕大小。之后调用init方法,_state设为NORMAL,_enabled为true,_selected _highlighted为false,定义了单点触摸监听器和4种回调函数,并将监听器加到事件分发器进行管理。

control是否启用(enabled),control是否被选中(Selected),control是否高亮(Highlighted)有对应的set get方法:

    virtual void setEnabled(bool bEnabled); //_enabled 会同步修改_state为NORMAL或DISABLED
virtual bool isEnabled() const; virtual void setSelected(bool bSelected); //_selected
virtual bool isSelected() const; virtual void setHighlighted(bool bHighlighted); //_highlighted
virtual bool isHighlighted() const;

三个set方法结束前都要执行needsLayout(),具体方法是由子类实现。

- Vector<Invocation*>& dispatchListforControlEvent(EventType controlEvent)

简要的说,该方法是通过参数EventType找到所有同EventType的Invocation。

该方法通过参数EventType,即control接收到的触摸类型,在_dispatchTable中根据EventType获取到Vector<Invocation*>*,将该Vector返回。如果没有EventType对应的Vector,则新建Vector,并在_dispatchTable新建项。

- void removeTargetWithActionForControlEvent(Ref* target, Handler action, EventType controlEvent)

简要的说,该方法删除符合参数要求的Invocation,从而删除三者之间的关联关系。

1. 先调用dispatchListforControlEvent,根据EventType获取Vector<Invocation*>。当参数target和action都为空时,对Vector执行clear清空。

2. 接下来,对Vector进行遍历,遍历到的每个Invocation通过参数target和action判断是否符合要求,如果符合要求,加入到容器vector tobeRemovedInvocations。

3. 遍历结束,从Vector中删除tobeRemovedInvocations里的每个Invocation。

- void removeTargetWithActionForControlEvents(Ref* target, Handler action, EventType controlEvents)

kControlEventTotalNumber是EventType类型的数量,Control头文件里定义为9。

1. 对controlEvents的二进制值分别通过9种EventType的二进制值按位与检测,得出“Events”包含了哪些“Event”。

2. 存在的每个EventType作为参数,调用了上面的removeTargetWithActionForControlEvent方法。

- void addTargetWithActionForControlEvent(Ref* target, Handler action, EventType controlEvent)

简要的说,该方法是新建了一个Invocation并存储。

该方法通过三个参数create一个Invocation,再调用dispatchListforControlEvent,通过参数EventType获取Vector<Invocation*>,再把Invocation加到Vector里。

- void addTargetWithActionForControlEvents(Ref* target, Handler action, EventType controlEvents)

通过按位与检测controlEvents包含的EventType, 对每种EventType和参数target action调用addTargetWithActionForControlEvent新建Invocation。

- Vec2 getTouchLocation(Touch* touch) 返回触摸点相对control的坐标。

- bool isTouchInside(Touch* touch) 判断Touch是否在control范围。

- bool hasVisibleParents()

当control的所有父节点都可见,返回true,存在不可见的父节点时返回false。

- void sendActionsForControlEvents(EventType controlEvents)

对controlEvents的每种EventType获得invocation,调用invocation->invoke(this)。

‎Cocos2d-x 学习笔记(19) Control Invocation的更多相关文章

  1. Ext.Net学习笔记19:Ext.Net FormPanel 简单用法

    Ext.Net学习笔记19:Ext.Net FormPanel 简单用法 FormPanel是一个常用的控件,Ext.Net中的FormPanel控件同样具有非常丰富的功能,在接下来的笔记中我们将一起 ...

  2. SQL反模式学习笔记19 使用*号,隐式的列

    目标:减少输入 反模式:捷径会让你迷失方向 使用通配符和未命名的列能够达到减少输入的目的,但是这个习惯会带来一些危害. 1.破坏代码重构:增加一列后,使用隐式的Insert插入语句报错: 2.查询中使 ...

  3. golang学习笔记19 用Golang实现以太坊代币转账

    golang学习笔记19 用Golang实现以太坊代币转账 在以太坊区块链中,我们称代币为Token,是以太坊区块链中每个人都可以任意发行的数字资产.并且它必须是遵循erc20标准的,至于erc20标 ...

  4. springmvc学习笔记(19)-RESTful支持

    springmvc学习笔记(19)-RESTful支持 标签: springmvc springmvc学习笔记19-RESTful支持 概念 REST的样例 controller REST方法的前端控 ...

  5. [原创]java WEB学习笔记19:初识MVC 设计模式:查询,删除 练习(理解思想),小结 ,问题

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  6. tornado学习笔记19 Tornado框架分析

    19.1 Http服务器请求处理流程图 (1) 调用HTTPServer的bind方法,绑定Socket的监听端口号: (2) 调用HTTPServer的listen方法,初始化一个listen so ...

  7. AMQ学习笔记 - 19. 问题解决 - 控制Atomikos的日志输出

    概述 在使用Atomikos为ActiveMQ提供JTA支持时,Atomikos在控制台打印了繁琐的日志.这里介绍如何控制Atomikos日志输出的粒度. 解决方案 基于以下三个事实: Atomiko ...

  8. Linux学习笔记19——信号2

    上一节中讲到了sigprocmask函数,它的作用是检查或修改它的进程信号掩码,这一节我们主要学习捕捉与忽略信号的函数sigaction和等待信号函数. 一  sigaction函数的作用 定义在接收 ...

  9. Oracle 学习笔记 19 -- 触发器和包浅析(PL/SQL)

    触发器是存放在数据库中的一种特殊类型的子程序.不能被用户直接调用,而是当特定事件或操作发生时由系统自己主动 调用执行.触发器不能接受參数.所以执行触发器就叫做触发或点火.Oracle事件指的是数据库的 ...

随机推荐

  1. 干货| 外卖点餐系统(App及后台)

    简单总结一下,这个系统是一个外卖点餐系统,也就是仿美团饿了么,也是当时我的毕业设计,花费了我很多精力,主要包括了移动端App.服务端(中台)和商家的后台管理.答辩完后我就将移动端源码放到了GitHub ...

  2. 亮剑.NET第二章

    第二章主要讲解C#中各种让人模糊不清的概念,用法,类型等等. 1.Equals()与==区别 当比较两个值类型时,二者基本一致,当比较引用类型时,==比较的是引用类型的地址是否一致,即两个引用是否指向 ...

  3. 07 (OC)* XIB原理和Xib、storyBoard、代码的优缺点

    1:可读性 2:可视化界面.立马看到 3:开发速度. 4:复用性 5:维护性差 本质 编译时对xml文件做了如下操作1,读取xml文件,生成所有界面对象,生成所有object(即自定义的control ...

  4. (java实现)单向循环链表

    什么是单向循环链表 单向循环链表基本与单向链表相同,唯一的区别就是单向循环链表的尾节点指向的不是null,而是头节点(注意:不是头指针). 因此,单向循环链表的任何节点的下一部分都不存在NULL值. ...

  5. Spring Data JPA 梳理 - JPA与“Spring、Spring Data JPA”的关系

    JPA其实也就是java实体对象和关系型数据库建立起映射关系,通过面向对象编程的思想操作关系型数据库的规范. Spring 框架对 JPA 提供的支持主要体现在如下几个方面: 首先,它使得 JPA 配 ...

  6. Maven 梳理 - 使用Maven构建多模块项目

    多模块实际案例 project |--business (核心业务) |--business-api |--business-service |--business-message |--busine ...

  7. Centos 6下使用cmake编译安装MariaDB

    写在前面 最近在学习Maria DB,为了方便查阅,又为了将所学的知识重新的梳理,特作此随笔一篇,希望过后阅读时能有所感,也希望对大家能够有所帮助. 安装前的准备 大家都知道,在Linux上安装软件一 ...

  8. mybatis 常用的jabcType与javaType对应

    一.jabcType与javaType对应   JDBC Type            Java Type CHAR                 String VARCHAR           ...

  9. 如何制作一个Nginx镜像

    1,从这里你将学到编写Dockerfile的4个重要指令RUN,EXPOSE,ADD,ENTRYPOINT2,在Dockerfile中编写拷贝文件至容器的方法3, 安装一个nginx server,并 ...

  10. (三)分布式数据库tidb-隔离级别详解

    tidb隔离级别详解: 1.TiDB 支持的隔离级别是 Snapshot Isolation(SI),它和 Repeatable Read(RR) 隔离级别基本等价,详细情况如下: ● TiDB 的 ...