详解CocosCreator消息分发机制

yizhihongxing

下面是详解Cocos Creator消息分发机制的完整攻略:

什么是消息分发机制

Cocos Creator中的消息分发机制是一种基于观察者模式实现的机制。通俗地说,就是当一个对象的状态发生变化时,会通知所有相关的观察者,以便他们能够及时做出相应的处理。在Cocos Creator中,这个机制被广泛地使用,例如在UI控件之间进行通信、各种游戏物体之间进行交互等。

Cocos Creator中的消息分发机制的核心类

在Cocos Creator中,消息分发机制的核心类是EventTarget。EventTarget是一个事件目标类,它可以监听事件以及分发事件。

Cocos Creator中的事件类型

在Cocos Creator中,事件类型是一个由字符串组成的标识,用于区分不同的事件。事件类型的定义通常写在一个常量文件中,例如:

const GameEvent = {
    PLAYER_DEAD: "player_dead",
    GAME_OVER: "game_over",
    SCORE_UPDATED: "score_updated",
}

监听事件

在Cocos Creator中,监听事件需要使用EventTarget的on方法,例如:

cc.director.on(GameEvent.PLAYER_DEAD, this.onPlayerDead, this);

上述代码表明,当前节点会监听GameEvent.PLAYER_DEAD类型的事件,当事件发生时,会回调onPlayerDead方法,并且将该节点作为回调函数的this对象。

分发事件

在Cocos Creator中,分发事件需要使用EventTarget的emit方法,例如:

cc.director.emit(GameEvent.PLAYER_DEAD);

上述代码表示,当前节点会分发GameEvent.PLAYER_DEAD类型的事件,所有监听该事件类型的节点都会收到通知。

取消监听事件

在Cocos Creator中,取消监听事件需要使用EventTarget的off方法,例如:

cc.director.off(GameEvent.PLAYER_DEAD, this.onPlayerDead, this);

上述代码表示,当前节点会取消对GameEvent.PLAYER_DEAD类型的事件的监听,同时也指定了之前注册的回调函数onPlayerDead。

示例1:在UI控件之间进行通信

在一个基于Cocos Creator的游戏中,有一个主界面,上面放着一些按钮控件,还有一个游戏场景界面。当玩家点击某个按钮时,需要通知游戏场景界面,让它能够及时做出响应。这个需求可以通过消息分发机制来实现:

首先,在UI控件和游戏场景界面的脚本中,分别定义消息类型:

const UIEvent = {
    BUTTON_CLICKED: "button_clicked",
}
const GameEvent = {
    LEVEL_CHANGED: "level_changed",
}

然后,当玩家点击某个按钮时,按钮控件会分发BUTTON_CLICKED事件,游戏场景界面会监听该事件:

cc.director.on(UIEvent.BUTTON_CLICKED, this.onButtonClicked, this);

当收到该事件后,游戏场景界面会改变当前关卡的等级,并向UI控件分发LEVEL_CHANGED事件:

cc.director.emit(GameEvent.LEVEL_CHANGED, newLevel);

UI控件在收到该事件后,会更新相关的界面显示:

cc.director.on(GameEvent.LEVEL_CHANGED, this.onLevelChanged, this);

当然,由于事件类型比较多,建议将所有事件类型都放在一个单独的文件中,避免混乱。

示例2:各种游戏物体之间进行交互

在一个基于Cocos Creator的游戏中,有许多游戏物体,它们之间需要进行交互。这些游戏物体之间的交互,可以通过消息分发机制来实现:

首先,在每个游戏物体的脚本中,定义事件类型:

const UnitEvent = {
    UNIT_DIED: "unit_died",
    UNIT_ATTACKED: "unit_attacked",
}

当某个游戏物体发生状态变化时,会分发相应的事件:

cc.director.emit(UnitEvent.UNIT_DIED, this.node);

其他有关联的游戏物体会监听相关的事件,并做出相应的反应:

cc.director.on(UnitEvent.UNIT_DIED, this.onUnitDied, this);

至此,Cocos Creator消息分发机制的完整攻略讲解完毕。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解CocosCreator消息分发机制 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • vue3中hooks的简介及用法教程

    下面是关于vue3中hooks的详细讲解及用法教程。 什么是hooks? 在Vue3中,引入了一种新的特性——hooks(钩子函数)。Hooks可以让我们在函数组件中使用state和其他React特性,而不需要使用类组件。与Vue2中options-API不同的是,hooks是基于函数式编程的,它通过函数的方式提供了组件内状态的维护和实现状态的逻辑复用。 h…

    Vue 2023年5月28日
    00
  • Vue简明介绍配置对象的配置选项

    关于Vue的配置对象的配置选项,我们可以分为以下几个部分进行讲解: 1. el 指定 Vue 实例绑定的元素。可以是一个 CSS 选择器字符串,也可以是一个 HTMLElement 实例。 示例1: <div id="app"> {{ message }} </div> var app = new Vue({ el…

    Vue 2023年5月28日
    00
  • 详解Vue3中侦听器watch的使用教程

    详解Vue3中侦听器watch的使用教程 什么是watch 在使用Vue的开发中,watch是非常常用的一个功能。它作为Vue的一个重要特性,经过多年的发展,已经变成了非常强大的工具。它可以帮助我们监听数据的变化,进而执行相应的操作。对于开发中需要根据数据的变化做出相应的响应的情形,watch是非常有用的。 如何使用watch 基本用法 Vue中的watch…

    Vue 2023年5月28日
    00
  • VUE跨域详解以及常用解决跨域的方法

    VUE跨域详解以及常用解决跨域的方法 在前端开发过程中,我们经常遇到需要与不同的域名或端口的服务器进行数据交互的情况,这就会产生跨域问题。本文将详细讲解Vue中跨域的问题以及常用的解决方法。 什么是跨域 跨域是指,当一个网页的文档、脚本或资源请求另一个域名或端口的资源时,浏览器会对这个请求进行限制,以防止从一个域上的网页去攻击另一个域的网页。例如,一个使用h…

    Vue 2023年5月28日
    00
  • Vuex 入门教程

    Vuex 入门教程 什么是 Vuex? Vuex 是一个专为 Vue.js 设计的状态管理库。它能以一种可预测的方式管理应用的状态,并使得视图和状态之间的关系更加简单明了。 Vuex 核心概念 State Vuex 使用单一状态树,即用一个对象包含了全部的应用层级状态。 一个简单的例子: const store = new Vuex.Store({ stat…

    Vue 2023年5月27日
    00
  • vue中改变了vuex数据视图不更新,也监听不到的原因及解决

    在vue中使用vuex进行数据管理时,有时候会出现改变了vuex数据,但是页面视图并没有更新,也没有触发相应的监听事件的情况。这通常是因为没有正确地使用Vue的响应式机制和Vuex的状态更新机制引起的。 以下是解决这个问题的攻略,包含两个示例说明。 1. 使用Vue的响应式机制 在Vue中,只有通过Vue提供的响应式方法或函数才能保证更新视图。通过JavaS…

    Vue 2023年5月27日
    00
  • vue中关于$emit和$on的使用及说明

    下面我将为大家详细讲解一下Vue中关于$emit和$on的使用及说明。 1. $emit和$on的功能介绍 $emit和$on是Vue中非常重要的两个API,它们分别用于实现组件的自定义事件的触发和监听。 具体来说,$emit可以让子组件向父组件通信,而$on则是用于监听子组件发出的事件。 2. $emit的使用 假设我们有一个父组件和一个子组件,现在我们需…

    Vue 2023年5月28日
    00
  • 浅析vue3响应式数据与watch属性

    浅析Vue3响应式数据与watch属性 什么是Vue3响应式数据? 在 Vue3 中,响应式数据是通过函数 reactive() 创建的一个响应式对象,它通过 Proxy 对象来监听对象的变化,使得当对象发生改变时,视图会自动更新。我们可以通过下面的代码来创建一个响应式对象: import { reactive } from ‘vue’ const stat…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部