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. 设置IntelliJ IDEA支持lambda表达式

    使用IntelliJ IDEA做为开发工具,对基于maven的java工程,如果要编写lambda表达式,先确保安装并使用了jdk1.8或者更高版本,然后再要做一些设置才能正常编译和执行,具体表现在m ...

  2. centos7上部署dubbo管理控制台dubbo-admin

    centos7上部署dubbo管理控制台dubbo-admin 1 准备工作 服务器:系统centos7, 内存4G, 存储60G, ip 192.168.159.128 软件环境: 安装有jdk1. ...

  3. Dubbo Spring Cloud 之 HTTP 实战

    上一篇文章<Spring Cloud Alibaba | Dubbo 与 Spring Cloud 完美结合>我们介绍了Dubbo Spring Cloud的基本使用,使用的服务中心为Sp ...

  4. TestNG(十四) 线程测试

    package com.course.testng.thread; import org.testng.annotations.Test; public class multiThread { @Te ...

  5. linux常见报错

    零.目录 一. 文件和目录类 File exist 文件已经存在 No such file or directory 没有这个文件或目录(这个东西不存在) command not found 命令找不 ...

  6. 安装Winservices服务出现“设置服务登录”

    安装服务时出现  设置服务登录  窗口 别紧张   将serviceProcessInstaller1   Account 设置为LocalSystem 即可

  7. 让我们一起学习如何使用AIDL,它其实并不难(Android)

    前言 该篇文件讲述的是AIDL最基本的使用(创建.调用),关于对于AIDL更深的认识,在后续的随笔中,会持续与大家分享并探讨. 正文 AIDL的定义(什么是AIDL?) AIDL的应用场景(AIDL可 ...

  8. 苹果系统IOS第三方管理工具——imazing 优秀

    iMazing 是一款 Windows.macOS 平台的 iPhone.iPad 管理工具,可以进行文件.音乐.视频传输,备份与还原数据,并且可以管理已安装应用,比如重新安装那些已下架的应用,是「史 ...

  9. [AWS] Lambda by Python

    当前统治数据分析的语言还是Python,还是暂时走:Python + GPU的常规路线好了. numba, pyculib (分装了cublas) Ref: 使用 Python 构建 Lambda 函 ...

  10. SpringBoot起飞系列-使用idea搭建环境(二)

    一.环境配置 安装idea的教程就不说了,相信大家肯定已经安装好了,另外maven环境肯定也安装好了,那么我们就开始使用idea开发工具来创建一个springboot的web项目,这里奉上一个idea ...