监听器3个bool类型成员变量。

监听器能设置是否能够接收事件。

能随时接收事件进行处理,此时把它看做工作状态,需要满足条件:

     _paused = false;
    _isEnabled = true;

监听器init方法执行上述语句,使得不管哪种监听器,初始化时都默认处于工作状态。

监听器init方法还执行了:

    _isRegistered = false;

也就是说,监听器默认没有注册。

1. _paused

init方法置_paused为false。

监听器的暂停与否仅用于场景图的监听器。自定义优先级的监听器的暂停标志一直为false。

场景图监听器关联的node运行onEnter onExit方法中,监听器会被自动设置暂停标志。

在onEnter方法中,会调用到resume()。该方法中,事件分发器对node关联的所有监听器设置setPaused(false),包括待添加容器里的监听器。

void Node::resume()
{
_scheduler->resumeTarget(this);
_actionManager->resumeTarget(this);
_eventDispatcher->resumeEventListenersForTarget(this);
}

同理,在onExit方法,事件分发器对这些监听器setPaused(true)。

void Node::pause()
{
_scheduler->pauseTarget(this);
_actionManager->pauseTarget(this);
_eventDispatcher->pauseEventListenersForTarget(this);
}

2. _isEnabled

init方法置_isEnabled为true。

当自定义优先级监听器需要“暂停”,需要不接收事件时,不能更改暂停标志,要调用setEnabled(false)更改_isEnabled标志。

自定义优先级监听器暂停标志永远为false。

3. _isRegistered

init方法置_isRegistered为false。

当调用addEventListenerWithFixedPriority addEventListenerWithSceneGraphPriority两方法添加监听器到监听器容器时,先断言,条件是!listener->isRegistered(),即要求参数监听器未注册才能添加到容器里,之后再设置注册标记setRegistered(true)。

简而言之,未注册的监听器才能加到容器里。

remove方法删除监听器时,都要先对监听器先setRegistered(false)。如果正在进行事件分发,删除的操作在分发后的updateListeners方法执行,该方法会把之前setRegistered(false)的监听器删除。

4. 进行事件分发时

分发事件时dispatchEvent(Event*)函数的分发过程在dispatchEventToListeners方法中。

该方法对遍历到的每个监听器执行:

                if (l->isEnabled() && !l->isPaused() && l->isRegistered() && onEvent(l))
{
shouldStopPropagation = true;
break;
}

&&是短路操作,也就是说在监听器处理事件之前,需要确保_isEnabled(启用监听器)_paused(没暂停监听器)_isRegistered(已注册监听器)。

‎Cocos2d-x 学习笔记(14.2) EventListener _paused _isEnabled _isRegistered的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. Linux学习笔记14——使用fcntl实现文件锁定

    期末考试快要来了,Linux学习进度一下拉下来许多.今天学习的是文件锁定,在Linux中,实现文件锁定的方法很多,例如fcntl和lockf.下面主要是fcntl的调用. fcntl函数的原型是:in ...

随机推荐

  1. Windows7关闭默认共享

    注意:禁用默认共享会导致安装ORACLE时执行先决条件检测不通过,要想安装ORACLE得先打开共享. 1.win+r 运行里输入compmgmt.msc进入计算机管理,在共享文件夹里,去掉所有的盘共享 ...

  2. 致初学者(四):HDU 2044~2050 递推专项习题解

    所谓递推,是指从已知的初始条件出发,依据某种递推关系,逐次推出所要求的各中间结果及最后结果.其中初始条件或是问题本身已经给定,或是通过对问题的分析与化简后确定.关于递推的知识可以参阅本博客中随笔“递推 ...

  3. Http 协议简略

    用户在浏览器中输入一个网址并回车,浏览器会向服务器发送一个http请求,服务器端程序会接受这个请求,并对请求进行相应的处理,然后发送一个回应,浏览器收到回应,再把回应的内容显示到页面,这种请求—相应的 ...

  4. charles 外部代理设置

    本文参考:charles 外部代理设置 external proxy 外部代理设置 有时候您可能需要使用网络上的代理服务器才能访问Internet. 在这种情况下,您需要为Charles配置外部代理. ...

  5. 001: html基础标签

    一:浏览器内核(理解) 序言: 1:web标准 主要包括结构(Structure).表现(Presentation)和行为(Behavior)三个方面. 2:常见标签 2.1:HTML head bo ...

  6. Spring Cloud 系列之 Spring Cloud Stream

    Spring Cloud Stream 是消息中间件组件,它集成了 kafka 和 rabbitmq .本篇文章以 Rabbit MQ 为消息中间件系统为基础,介绍 Spring Cloud Stre ...

  7. Android 让你的 Room 搭上 RxJava 的顺风车 从重复的代码中解脱出来

    # 什么是 Room ? 谷歌为了帮助开发者解决 Android 架构设计问题,在 Google I/O 2017 发布一套帮助开发者解决 Android 架构设计的方案:Android Archit ...

  8. oracle异机恢复测试

    (一)问题背景 最近在生产环境中,开发人员误操作,使用truncate将oracle数据库某个表的数据全部删除了,在删除之后,开发人员发现自己闯祸了,于是联系值班的DBA进行紧急数据恢复. 经过分析, ...

  9. .NetCore技术研究-.NET Core迁移前的准备工作

    前段时间迁移.NET Core做了大量的试水和评估,今天整理一下分享给大家.大致有以下几个部分: 1. .NET Core的由来 2. 为什么要迁移.NET Core 3. .NET Core3.X主 ...

  10. 阿里云ESC服务器centos6.9使用及注意事项

    阿里云ESC服务器,配置低,但是足够新手尝试操作练习. 使用之前,注意事项: 选择操作系统 设置实例快照 安装终端工具 一,选择操作系统. 可以在购买服务器的时候进行选择系统盘,也可以在购买之后在实例 ...