1. Event EventCustom

所有事件类继承了Event。

Event中的枚举,定义了事件的类型:

    enum class Type
{
TOUCH, //触摸
KEYBOARD, //键盘
ACCELERATION, //加速器
MOUSE, //鼠标
FOCUS, //
GAME_CONTROLLER, // 游戏手柄
CUSTOM //用户自定义
};

Event成员变量:

    Type _type; //事件类型
bool _isStopped; //事件暂停
Node* _currentTarget; //作用的node

Event构造方法:

Event::Event(Type type)
: _type(type)
, _isStopped(false)
, _currentTarget(nullptr)
{}  

EventCustom是自定义事件。比Event多出的成员变量:

    void* _userData;       ///< User data
std::string _eventName; //自定义事件名

EventCustom构造方法事件类型Type设为CUSTOM。设置_eventName。

EventCustom::EventCustom(const std::string& eventName)
: Event(Type::CUSTOM)
, _userData(nullptr)
, _eventName(eventName)
{
}

3. EventListener

监听器有自己的类型ID,是对该类型ID事件的监听。事件只会被分发到同ID的监听器进行处理。

除了自定义监听器、触摸监听器,其他的监听器ID和事件类型一一对应。自定义监听器ID是自定义事件的事件名。触摸类型是一种,对应两种监听器。

监听器类有枚举,定义监听的事件类型,和Event相比将触摸拆分为单点触摸和多点触摸:

    enum class Type
{
UNKNOWN,
TOUCH_ONE_BY_ONE, //单点触摸
TOUCH_ALL_AT_ONCE, //多点触摸
KEYBOARD,
MOUSE,
ACCELERATION,
FOCUS,
GAME_CONTROLLER,
CUSTOM
};

监听器成员变量: 

    std::function<void(Event*)> _onEvent;   /// 处理传入事件的回调函数 Event callback function

    Type _type;                             /// 事件类型 Event listener type
ListenerID _listenerID; /// 监听器ID Event listener ID
bool _isRegistered; /// 注册 Whether the listener has been added to dispatcher. int _fixedPriority; // 监听器优先级,数值越大优先级越高
Node* _node; // 监听器关联的node scene graph based priority
bool _paused; // 暂停监听器 Whether the listener is paused
bool _isEnabled; // 是否启用 Whether the listener is enabled

监听器的init方法对成员变量进行初始化。

场景图监听器优先级固定为0,在add方法中自动设置。自定义优先级的监听器优先级不得为0。

监听器3个参数

监听器的暂停与否仅用于场景图优先级的监听器。自定义优先级的监听器的暂停标志一直为false。当自定义优先级监听器需要“暂停”,不接收事件时,调用setEnabled(false)即可。

4. EventListenerCustom

自定义事件的监听器有成员:

    std::function<void(EventCustom*)> _onCustomEvent;

用create方法创建时,要监听的事件名作为监听器ID。回调函数作为_onCustomEvent。在init时,_onEvent被设为匿名函数:

auto listener = [this](Event* event){
if (_onCustomEvent != nullptr)
{
_onCustomEvent(static_cast<EventCustom*>(event));
}
};

该匿名回调函数是对我们设置的回调函数_onCustomEvent的包装,将事件类型转换成EventCustom。

‎Cocos2d-x 学习笔记(14.1) Event EventCustom EventListener的更多相关文章

  1. 【转】 C#学习笔记14——Trace、Debug和TraceSource的使用以及日志设计

    [转] C#学习笔记14——Trace.Debug和TraceSource的使用以及日志设计 Trace.Debug和TraceSource的使用以及日志设计   .NET Framework 命名空 ...

  2. Ext.Net学习笔记14:Ext.Net GridPanel Grouping用法

    Ext.Net学习笔记14:Ext.Net GridPanel Grouping用法 Ext.Net GridPanel可以进行Group操作,例如: 如何启用Grouping功能呢?只需要在Grid ...

  3. SQL反模式学习笔记14 关于Null值的使用

    目标:辨别并使用Null值 反模式:将Null值作为普通的值,反之亦然 1.在表达式中使用Null: Null值与空字符串是不一样的,Null值参与任何的加.减.乘.除等其他运算,结果都是Null: ...

  4. golang学习笔记14 golang substring 截取字符串

    golang学习笔记14 golang substring 截取字符串golang 没有java那样的substring函数,但支持直接根据 index 截取字符串mystr := "hel ...

  5. 学习笔记---Javascript事件Event、IE浏览器下的拖拽效果

    学习笔记---Javascript事件Event.IE浏览器下的拖拽效果     1. 关于event常用属性有returnValue(是否允许事件处理继续进行, false为停止继续操作).srcE ...

  6. mybatis学习笔记(14)-查询缓存之中的一个级缓存

    mybatis学习笔记(14)-查询缓存之中的一个级缓存 标签: mybatis mybatis学习笔记14-查询缓存之中的一个级缓存 查询缓存 一级缓存 一级缓存工作原理 一级缓存測试 一级缓存应用 ...

  7. Python3+Selenium3+webdriver学习笔记14(等待判断 鼠标事件 )

    !/usr/bin/env python -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记14(等待判断 鼠标事件 )'''from selenium im ...

  8. 并发编程学习笔记(14)----ThreadPoolExecutor(线程池)的使用及原理

    1. 概述 1.1 什么是线程池 与jdbc连接池类似,在创建线程池或销毁线程时,会消耗大量的系统资源,因此在java中提出了线程池的概念,预先创建好固定数量的线程,当有任务需要线程去执行时,不用再去 ...

  9. [C++学习笔记14]动态创建对象(定义静态方法实现在map查找具体类名对应的创建函数,并返回函数指针,map真是一个万能类)good

    [C++学习笔记14]动态创建对象   C#/Java中的反射机制 动态获取类型信息(方法与属性) 动态创建对象 动态调用对象的方法 动态操作对象的属性 前提:需要给每个类添加元数据 动态创建对象 实 ...

随机推荐

  1. apache ignite系列(八):问题汇总

    1,java.lang.ClassNotFoundException Unknown pair 1.Please try to turn on isStoreKeepBinary in cache s ...

  2. c语言运算优先级与结合方向的问题

    c语言运算的结合方向一直困扰我,不过我终于get到了哈哈 先附上c语言运算优先级和结合方向图片 以上有c语言一共的15个优先级,从上往下递增 c语言的运算符号有很多,当我们打代码或者看代码的时候符号多 ...

  3. linux无法用root账号ssh登录(putty)

    解决方法: 在kali打开终端,修改ssh配置文件. vi /etc/ssh/sshd_config 将PermitRootLogin, 改成PermitRootLogin yes.(允许用root登 ...

  4. switch对输入的运算符的判断

    import java.util.*; public class App3 { public static void main(String [] args) { int num1,num2,num; ...

  5. 【pymongo.errors】Cursor not found

    pymongo.errors.CursorNotFound: Cursor not found 故事背景:先从数据库中取得所有数据 db['test'].find(),然后对结果进行for循环,但是当 ...

  6. (转)阿里云CentOS 7下配置及使用mysql

    一.安装 1 正确的安装方法: 众所周知,Linux系统自带的repo是不会自动更新每个软件的最新版本(基本都是比较靠后的稳定版),所以无法通过yum方式安装MySQL的高级版本.所以我们需要先安装带 ...

  7. 转载:alpha测试和beta测试的区别;黑盒测试和白盒测试的区别;

    alpha测试版,有点相当于内部测试,一般开发人员在场   ,是由用户做测试,但开发人员在场,一般是请用户到开发现场去测试 beta测试版,完全交给用户,由用户做测试,返回测试报告,相当于发行前的一个 ...

  8. TCP通信 -C/S中的Socket与ServerSocket

    客户端类:Socket类 TCP通信的客户端:向服务器发送连接请求,给服务器发送数据,读取服务器的数据,两次IO流 java.lang.Object 继承者 java.net.Socket 构造方法: ...

  9. Nginx安装教程,ubuntu18.04

    本文介绍Nginx如何安装,操作系统为Ubuntu 18.04.   一.安装 (1)安装git 执行命令:“sudo apt-get install git”. (2)安装aptitude 执行命令 ...

  10. 小鸟初学Shell编程(七)变量引用及作用范围

    变量引用 那么定义好变量,如何打印变量的值呢?举例下变量引用的方式. ${变量名}称作为对变量的引用 echo ${变量名}查看变量的值 ${变量名}在部分情况下可以省略成 $变量名 [root@li ...