cocos2dx+lua学习笔记:事件派发器CCEventDispatcher

news2024/11/19 1:25:23
前言
本篇在讲什么

cocos2dx内关于事件监听和派发的调度器EventDispatcher相关内容
本篇适合什么

适合初学Cocos2dx的小白
适合想要学习EventDispatcher的新手

本篇需要什么

Lua语法有简单认知
C++语法有简单认知
Cocos2dx有简单认知
Cocos2dx-Lua的开发环境
依赖Visual Studio编辑器

本篇的特色

具有全流程的图文教学
重实践,轻理论,快速上手
提供全流程的源码内容


★提高阅读体验★

👉 ♠ 一级标题 👈

👉 ♥ 二级标题 👈

👉 ♣ 三级标题 👈

👉 ♦ 四级标题 👈


目录

  • ♠ CCEventDispatcher在干什么
  • ♠ 事件的监听和派发
    • ♥ 监听
      • ♣ addEventListenerWithSceneGraphPriority
      • ♣ addEventListenerWithFixedPriority
      • ♣ addCustomEventListener
    • ♥ 取消监听
      • ♣ removeEventListener
      • ♣ removeEventListenersForType
      • ♣ removeEventListenersForTarget
      • ♣ removeCustomEventListeners
      • ♣ removeAllEventListeners
    • ♥ 暂停和恢复
      • ♣ pauseEventListenersForTarget
      • ♣ resumeEventListenersForTarget
    • ♥ 派发
      • ♣ dispatchEvent
      • ♣ dispatchCustomEvent
  • ♠ 事件监听和派发的实现原理
    • ♥ 事件监听后发生了什么
    • ♥ 派发是如何进行的
  • ♠ 用法小例
    • ♥ 绑定节点事件
    • ♥ 自定义事件
  • ♠ 推送
  • ♠ 结语


♠ CCEventDispatcher在干什么

观察者模式是我们最常用的设计模式之一,事件系统就是基本的观察者模式用法,举个简单的例子:

在这里插入图片描述

1、A店员根据号码派发餐饭,号码是类型,喊号码给饭
2、B顾客会在喊道38号时取餐,B顾客监听38号类型

以上就是一个最简单的事件监听和派发的例子,而EventDispatcher处理的就是上述事件的注册和监听


♠ 事件的监听和派发

派发器内提供了事件监听、派发以及取消监听的接口,下述内容中我们将简单认识相关接口的功能和使用


♥ 监听

从头文件中我们可以看到一共提供了三种供我们使用的监听注册方式

void addEventListenerWithSceneGraphPriority(EventListener* listener, Node* node);

void addEventListenerWithFixedPriority(EventListener* listener, int fixedPriority);

EventListenerCustom* addCustomEventListener(const std::string &eventName, const std::function<void(EventCustom*)>& callback);

♣ addEventListenerWithSceneGraphPriority

该方法为某个Node添加指定事件类型的监听,比如:给按钮A添加点击事件

  • 参数

listener:监听事件的类型

node:监听事件绑定的节点

  • 特点

节点销毁、监听销毁
同场景下,渲染越靠前,监听越靠前

在这里插入图片描述

点击两个图片交界处,黄色图片注册的事件执行早于红色图片注册的事件

  • 常用事件类型
EventListenerTouchOneByOne      // 单点事件
EventListenerTouchAllAtOnce     // 多点事件
EventListenerMouse              // 鼠标
EventListenerKeyboard           // 键盘
EventListenerFocus              // 聚焦
EventListenerAcceleration       // 加速剂(陀螺仪)

♣ addEventListenerWithFixedPriority

为指定事件添加固定优先级的监听

  • 参数

listener:监听事件的类型

fixedPriority:优先级

  • 特点

不绑节点,不会自动销毁,注册后一直存在
设置优先级越低,执行顺序越靠前

  • 常用事件类型
EventListenerCustom     // 自定义事件

♣ addCustomEventListener

添加自定义事件监听器,用的比较少,一般上边俩方法基本满足需要了

  • 参数

eventName:事件名,字符串

callback:监听到事件后的执行回调

  • 返回值

生成好的事件类型,绑定了事件名和回调

  • 特点

不和节点,不会自动销毁,注册后一直存在
固定优先级为1


♥ 取消监听

取消监听有很多种不同的方式,也有根据注册方式存在特定的取消方式

void removeEventListener(EventListener* listener);

void removeEventListenersForType(EventListener::Type listenerType);

void removeEventListenersForTarget(Node* target, bool recursive = false);

void removeCustomEventListeners(const std::string& customEventName);

void removeAllEventListeners();

♣ removeEventListener

根据注册事件时使用的事件类型来取消监听

  • 参数

listener:和注册时使用的事件类型(同一个)


♣ removeEventListenersForType

删除某个类型所有的监听事件

  • 参数

listenerType:和注册时使用的事件类型(同一个)

  • 类型枚举
    enum class Type
    {
        TOUCH_ONE_BY_ONE,       // 单点触摸
        TOUCH_ALL_AT_ONCE,      // 多点触摸
        KEYBOARD,               // 键盘
        MOUSE,                  // 鼠标
        ACCELERATION,           // 加速剂
        FOCUS,                  // 焦点
        CUSTOM                  // 自定义
    };

♣ removeEventListenersForTarget

删除与指定目标相关联的所有侦听器

  • 参数

target:目标节点
recursive:是否删除子节点的所有侦听器,默认false


♣ removeCustomEventListeners

删除所有具有相同事件名称的自定义监听器

  • 参数

customEventName:自定义的事件名字


♣ removeAllEventListeners

删除所有监听器


♥ 暂停和恢复

我们可以针对某个节点暂停其监听的功能


♣ pauseEventListenersForTarget

暂停与指定目标相关联的所有侦听器

  • 参数

target:目标节点
recursive:是否暂停子节点的所有侦听器,默认false


♣ resumeEventListenersForTarget

恢复与指定目标相关联的所有侦听器

  • 参数

target:目标节点
recursive:是否暂停子节点的所有侦听器,默认false


♥ 派发

相较于监听的多样性,事件的派发就显得相当简洁了,提供两个接口以供事件的派发

void dispatchEvent(Event* event);

void dispatchCustomEvent(const std::string &eventName, void *optionalUserData = nullptr);

♣ dispatchEvent

分派事件,根据事件类型

  • 参数

event:事件类型


♣ dispatchCustomEvent

发送带有事件名称的自定义事件和可选的用户数据

  • 参数

eventName:自定义的事件名字_
optionalUserData:自定义事件类型EventCustom的userData字段,自定义的_


♠ 事件监听和派发的实现原理

我们已经知道了事件是如何监听和派发的,下面我们简单了解一下其具体的实现原理


♥ 事件监听后发生了什么

稍微追一下代码,我们可以发现监听注册后,所有的监听事件根据优先级被存进了两个数组内

在这里插入图片描述

std::vector<EventListener*>* _fixedListeners;
std::vector<EventListener*>* _sceneGraphListeners;

♥ 派发是如何进行的

在导演类Director内可以看到,在实例派发器后,每次绘制都会调用派发器的dispatchEvent方法,方法内会根据事件类型去寻找监听列表内符合条件的监听执行

在这里插入图片描述
在这里插入图片描述


♠ 用法小例

因为博主主要用的是cocos2dx+lua,所以这里提供几个lua写的用法小例子


♥ 绑定节点事件

  • 为一个Layer注册了一个点击开始事件
-- 执行回调
local func1 = function()
end
-- 绑定节点
local layer = cc.LayerColor:create(cc.c4b(255, 255, 0, 255))
hummer.scene:addChild(layer)
layer:setContentSize(cc.size(100,100))
-- 事件类型
local listener = cc.EventListenerTouchOneByOne:create()
listener:registerScriptHandler(func1,cc.Handler.EVENT_TOUCH_BEGAN)
-- 注册监听事件
local eventDispatcher = layer:getEventDispatcher()
layer.cacheEventListener = listener
eventDispatcher:addEventListenerWithSceneGraphPriority(listener, layer)

♥ 自定义事件

  • 注册一个名为event_enter_game的自定义事件
-- 注册
local enterGameFunc = function()
end

local listener = cc.EventListenerCustom:create("event_enter_game", enterGameFunc)
cc.Director:getInstance():getEventDispatcher():addEventListenerWithFixedPriority(listener, 1)

-- 派发
cc.Director:getInstance():getEventDispatcher():dispatchCustomEvent("event_enter_game")

♠ 推送

  • Github
https://github.com/KingSun5

♠ 结语

若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。

👉 本文属于原创文章,转载请评论留言,并在转载文章头部著名作者出处👈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/398149.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring事物三千问】DataSource的设计和常用实现——Hikari、Druid

javax.sql.DataSource javax.sql.DataSource 是 jdk 提供的接口&#xff0c;各个连接池厂商 和 Spring 都对 DataSource 进行了设计和实现。 javax.sql.DataSource 是连接到物理数据源的工厂接口。它是 java.sql.DriverManager 功能的替代者&#xff0c;是获取数据库连接的首选…

H5视频付费点播打赏影视系统程序全开源运营版,含完整的前后台+数据库

源码介绍&#xff1a; 这是一个非常棒的精品代码&#xff0c;之前官方网站售价可是超过2w的。我拿过来了简单测试了一下&#xff0c;完美。好久没有遇到这么好的代码了&#xff0c;特此整理了一份完整的搭建教程并分享一下。 thinkphp开发&#xff0c;前后端分离设计&#xf…

Vue3做出B站【bilibili】 Vue3+TypeScript+ant-design-vue【快速入门一篇文章精通系列(一)前端项目案例】

本项目分为二部分 1、后台管理系统&#xff08;用户管理&#xff0c;角色管理&#xff0c;视频管理等&#xff09; 2、客户端&#xff08;登录注册、发布视频&#xff09; Vue3做出B站【bilibili】 Vue3TypeScriptant-design-vue【快速入门一篇文章精通系列&#xff08;一&…

ASEMI高压MOS管20N60参数,20N60尺寸,20N60体积

编辑-Z ASEMI高压MOS管20N60参数&#xff1a; 型号&#xff1a;20N60 漏极-源极电压&#xff08;VDS&#xff09;&#xff1a;600V 栅源电压&#xff08;VGS&#xff09;&#xff1a;30V 漏极电流&#xff08;ID&#xff09;&#xff1a;20A 功耗&#xff08;PD&#xff…

项目最后一刻发生范围变更该怎么处理?

不管是项目需求发生了变化&#xff0c;还是第一轮可交付成果没有完全达到预期&#xff0c;在项目范围定义的初始阶段之后可能发生变化的原因有很多。当这种情况发生时&#xff0c;你需要准备好一个计划来处理最后一刻的范围变更和调整。 什么是范围变更&#xff1f; 范围变更是…

浪潮 KaiwuDB x 山东重工 | 打造离散制造业 IIoT 标杆解决方案

近日&#xff0c;浪潮 KaiwuDB 携手山东重工集团有限公司&#xff08;以下简称&#xff1a;山东重工&#xff09;重磅发布“离散制造业 IIoT 解决方案”。该 IIoT 方案以 KaiwuDB 就地运算专利技术为底座&#xff0c;搭建了”多快优智”的“13N”方案体系&#xff0c;目前已率先…

南京、西安集成电路企业和高校分布一览(附产业链主要厂商及高校名录)

前言 3月2日&#xff0c;国务院副总理刘鹤在北京调研集成电路企业发展&#xff0c;并主持召开座谈会。刘鹤指出&#xff0c;集成电路是现代化产业体系的核心枢纽&#xff0c;关系国家安全和中国式现代化进程。他表示&#xff0c;我国已形成较完整的集成电路产业链&#xff0c;也…

视频理解论文串讲——学习笔记

文章目录DeepVideoTwo-StreamBeyond-short-SmippetsConvolutional FusionTSNC3DI3DNon-localR&#xff08;21&#xff09;DSlowFastTimesformer本文是对视频理解领域论文串讲的笔记记录。 一篇相关综述&#xff1a;Yi Zhu, Xinyu Li, Chunhui Liu, Mohammadreza Zolfaghari, Yu…

【YOLO】YOLOv8训练自定义数据集

1. 运行环境 windows11 和 Ubuntu20.04&#xff08;建议使用 Linux 系统&#xff09; 首先切换到自己建立的虚拟环境安装 pytorch torch 1.12.0cu116&#xff08;根据自身设备而定&#xff09; torchvision 0.13.0cu116&#xff08;根据自身设备而定&…

详解JAVA枚举类

目录 1.概述 2.常用API 2.1.清单 2.2.代码示例 2.2.1.ordinal 2.2.2.compareTo 2.2.3.toString 2.2.4.valueOf 2.2.5.values 3.成员变量和带参构造 1.概述 枚举变量指的是变量的取值只在一个有限的集合内&#xff0c;如性别、星期几、颜色等。从JDK5开始&#xff0…

超详细CentOS7 NAT模式(有图形化界面)网络配置

在此附上CentOS7&#xff08;有可视化界面版&#xff09;安装教程 超详细VMware CentOS7&#xff08;有可视化界面版&#xff09;安装教程 打开VMware—>点击编辑---->选择虚拟网络编辑器 打开虚拟网络编辑器后如下图所示&#xff1a; 从下图中我们看到最下面子网IP为…

软测入门(九)unit test

unit test 核心概念 TestCase:测试用例&#xff1a;用类的方式 组织对一个功能的多项测试Fixture : 夹具&#xff0c;用来固定测试环境TestSuite:测试套件:组织多个TestCaseTestRunner:测试执行:用来执行TestSuit&#xff0c;可以导出测试结果 入门 类需要继承unittest.Tes…

ENVI IDL学习笔记之基本操作

前言ENVI IDL&#xff08;交互式数据语言&#xff09;是一个通用的科学计算包&#xff0c;它提供了一套数学函数、数据分析工具&#xff0c;以及一些科学可视化和动画工具。IDL 是 ENVI 图像处理和分析软件的基础&#xff0c;可用于编写脚本并自动执行许多使用 ENVI 图形用户界…

【鲁棒优化】基于联合聚类和定价的鲁棒功率控制方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

12接口扩展无忧,存储显示充电都拉满,ORICO XDR扩展坞上手

扩展坞现在很多朋友都用&#xff0c;一般是配合笔记本使用&#xff0c;有些带有桌面模式的手机、平板装上扩展坞之后&#xff0c;也可以变身全能型的办公设备。现在市面上的扩展坞选择不少&#xff0c;我目前用的是一款功能比较全的12合1扩展坞&#xff0c;来自国产品牌ORICO。…

【机会约束、鲁棒优化】具有排放感知型经济调度中机会约束和鲁棒优化研究【IEEE6节点、IEEE118节点算例】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Django/Vue实现在线考试系统-03-开发环境搭建-MySQL安装

1.概述 MySQL是一种关系型数据库管理系统,所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型和大型网站的开发都选择 MySQL 作为网站数据库…

Redis的持久化操作

目录 介绍 RDB(redis database) 是什么 备份如何执行 配置 优势 劣势 备份恢复 AOF(Append Only File) 是什么 数据恢复 正常恢复 异常恢复 同步频率设置 重写(压缩) 持久化流程 优势 劣势 总结 介绍 redis持久化操作方式有两种&#xff1a;RDB和AOF。 RDB(redis database) 是…

mysql数据库之触发器

触发器是与表有关的数据库对象&#xff0c;指在insert、update、delete之前或之后&#xff0c;触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性&#xff0c;日志记录&#xff0c;数据校验等操作。 使用别名old和new来引用触发器…

华为OD机试题,用 Java 解【子序列长度】问题

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…