Defold核心概念之Message Passing

前面讲Defold选型的时候,提到Defold中非常强大的消息系统,用于解决Game Object之间的通信问题,起到非常好的解耦效果。要读这篇文章之前,我默认你已读了《Defold核心概念之Building Blocks》和《Defold核心概念之Addressing》,对于Defold的元素构成与元素定位都已完全了解。

在完成Game Object之间的通信,那么就一定要知道Game Object的定位URL。只要知道URL之后就能非常简单的完成通信。

发送消息

Defold通过 msg.post API完成消息发送,示例如下所示:

lua 复制代码
-- 发送 消息"change_status" 给 #sprite 组件,消息体为空
msg.post("#sprite", "change_status")

-- 发送 消息"change_score" 给 /level#script 组件,消息体为 { score=100 }
msg.post("/level#script", "change_score", {score=100})

从以上代码可以看出,Defold中发送消息是非常简单的,不需要关注消息接收方的逻辑。如果需要关注消息接收方的处理结果,也是通过 msg.post 方法给消息发送者进行回信。

默认情况下,Defold引擎内部有很多对象都是可以接收消息以完成某些业务逻辑的。Defold中常见的消息示例如下所示:

接受对象 消息名 示例 用途
. acquire_input_focus msg.post(".", "acquire_input_focus") 经常会在 game object 对象的 init 方法中给自己送 acquire_input_focus 消息,让Game Object具有与用户进行交互的能力,如果你发现Game Object的on_input方法不生效时,多半的原因是没有发送这个消息。
game object disable msg.post("url", "disable") 消息接收方对象被Disable。
game object enable msg.post("url", "enable") 消息接收方对象被Enable
game object set_parent msg.post("url", "set_parent", {parent_id = other}) 改关消息接收对象的层级结构
@render resize, window_resized msg.post("@render:", "resize", { width = 1024, height = 768 } ) 给渲染器发送消息,可以通过查看 render 的API,找到更多可用的消息

Defold内部的对象基本上都有自己的消息清单,可通过查看各个对象的文档查看。

接收消息

Defold通过 on_message 方法接收消息,示例如下所示:

lua 复制代码
function on_message(self, message_id, message, sender)
    if message_id = hash("change_status") then
        -- 执行消息处理逻辑
    end
end

从以上代码中可以看出几点:

  1. message_id的比较是要通过hash函数进行运算后再比较的,其实在Defold中所有比较字符串的地方都需要通过hash函数处理之后才能比较。
  2. message的数据结构是一个table,当前情况下是一个key-value键值对结构,也就是消息发送方传入的消息体;
  3. sender是消息发送者的绝对URL地址,可以通过此sender给消息发送方进行回信。

最后,无论是哪个Game Object或Component,只要知道了对方的URL,就可以完成消息通信。如果消息通信失败,绝大多情况下都是URL定位不正确。

相关推荐
鼓掌MVP16 小时前
【案例实战】多维度视角:鸿蒙2048游戏开发的深度分析与感悟
华为·ai编程·harmonyos·arkts·游戏开发·ability
腾讯云云开发19 小时前
云开发Copilot实战:AI生成2048小游戏开发指南
ai编程·游戏开发·小程序·云开发
腾讯云云开发19 小时前
云开发CloudBase实战:从0到1打造2D枪战游戏指南
ai编程·游戏开发·小程序·云开发
土丁爱吃大米饭1 天前
AIGC工具助力2D游戏美术全流程
aigc·小游戏·游戏开发·ai助力
陈尕六4 天前
从零开始的 Godot 之旅 — EP6:更优雅地实现角色场景
godot·游戏开发
AI广告侠5 天前
游戏开发者的AI革命:从灵感枯竭到效率狂飙,我的日常链路被AI重塑了 ——一个独立游戏开发者的AI工具箱实战指南
游戏·游戏开发
总有刁民想爱朕ha5 天前
Python自动化从入门到实战(23):Python打地鼠游戏开发
开发语言·python·游戏开发
腾讯云云开发6 天前
CloudBase + AI 游戏开发新范式,3小时极速开发
ai编程·游戏开发·小程序·云开发
ZHOUYUANN7 天前
我用JavaScript复刻了某宝的小游戏动物大迁徙消消乐
前端·javascript·游戏开发