惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
G
Google Developers Blog
Blog — PlanetScale
Blog — PlanetScale
U
Unit 42
A
About on SuperTechFans
Vercel News
Vercel News
B
Blog
Martin Fowler
Martin Fowler
MyScale Blog
MyScale Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
腾讯CDC
D
Docker
V
Visual Studio Blog
博客园 - 叶小钗
The Cloudflare Blog
Jina AI
Jina AI
B
Blog RSS Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
WordPress大学
WordPress大学
T
Tailwind CSS Blog
MongoDB | Blog
MongoDB | Blog
D
DataBreaches.Net
月光博客
月光博客
大猫的无限游戏
大猫的无限游戏

Lua

用 Lua 写 Android 应用? AutoLua 做到了 Android 上直接用 Lua 调 Java API 写脚本——AutoLua 技术分享 使用 Android Lua Helper 在 VSCODE 中调试安卓 Lua 应用 skynet 怎么给 mysql drive 增加对 caching_sha2_password 的支持 奇怪的小问题 Lua 代码上的优化,相互学习一下 openresty + lua 这个地方怎么写 求一份 lua 入门教程 有关 Lua 调用 C++ 编译动态库程序 飞书 + Lua 实现企业级组织架构登录认证 vscode 上写 lua 有显示注释的插件吗? lua 为什么要使用~=当作不等于运算符? 请问现在 lua 混淆用什么工具,求常年 lua 的老哥指点 lua 的前景如何? core_framework - 基于 libev 的轻量级 lua 网络开发框架 如何构建伪视频流服务? 低延时低采样, 基于 OpenResty , HTTP, 内网... TP-Link 官方使用的是开源固件? 表达过去、现在与将来:之将来(1) 有个问题, lua 平时能用来做做什么 ngx_lua 遇到的一个小坑 Lua IDE 各位 V 友,用 lua 作为开发语言用什么 IDE 可以方便代码提示以及调试呢 Lua 怎么实现 php strstr() 函数的功能 使用 Sol2 来进行 Lua 绑定 luarocks 使用上的一些小技巧 正在用 lua 写一个 nginx 防盗链的拓展,遇到了一个问题。 9k-18k 宁波 经验 3-5 年 本科及以上 全职 职位诱惑 : 年终奖 出国旅游 顶级办公设备及环境 关于 Lua 的标准库 Torch 一个在 MediaWiki 里面加入 Lua 脚本的插件 ngx_lua_reqstatus 实时监控 Nginx 域名 qps 的 lua 拓展
为什么游戏架构要用事件来驱动?
yiouejv · 2021-03-20 · via Lua

今天总结一下游戏架构中的事件触发机制,游戏架构中为什么需要由事件驱动。

主要是为了解耦,所谓高内聚,低耦合,如果不采用事件驱动的方式,则会像下面这样来写代码。

比如说,游戏内有多个玩法模块,”玩家“在打造装备的时候,可能触发”装备打造 xx 阶的成就“,也可能达成某种条件获得了时装。

这种情景的话,如果没有采用事件驱动的方式来写代码,则需要在装备模块的”升级装备“函数内调用 成就模块 的检查成就达成的函数,还需要调用 时装模块 的检查获得时装的函数。

function equipStrengthen()
	-- 装备强化逻辑

	checkAchievement()  -- 成就模块检查成就
	checkObtainFashion()  -- 时装模块检查获得时装
end

如果装备关联的模块越来越多的话,就要记得去相关的函数内添加相关的调用。

事件驱动的方式就比较好的处理了这种情况。 如果是用事件驱动的方式来处理以上问题,则我们会这么做,由装备模块发出“装备强化”的事件,成就模块和时装模块只需要监听”装备强化“事件做相应的处理就好了。

在装备强化的模块内只需要一行代码,发出事件,后续如果需要增加关联的模块时,装备模块完全不用动,新模块只要增加监听事件就可以了。

下面我用 lua 实现一个例子:

------------------------------------------------------ 事件触发器
local Listener = {}
function Listener:new(channel, callback)
    local obj = {
        callback = callback,
        channel = channel,
    }
    setmetatable(obj, self)
    self.__index = self
    return obj
end


local Channel = {}
function Channel:new(event)
    assert(event)
    local obj = {
        listeners = {},
        event = event,
    }
    setmetatable(obj, self)
    self.__index = self
    return obj
end

function Channel:on(callback)
    listener = Listener:new(self, callback)
    table.insert(self.listeners, listener)
end


local EventEmitter = {}
function EventEmitter:new()
    local obj = {
        events = {},  -- 监听的所有事件
        channels = {}, -- event: channel
    }
    setmetatable(obj, self)
    self.__index = self
    return obj
end

function EventEmitter:setEvents(events)
    self.events = events
end

function EventEmitter:on(event, callback)
    assert(event)
    assert(callback)
    if not self.events[event] then
        error("not register event: "..event)
    end
    local channel = self.channels[event]
    if not channel then
        channel = Channel:new(event)
        self.channels[event] = channel
    end
    channel:on(callback)
end

function EventEmitter:emit(event)
    if not self.events[event] then
        error("not register event: "..event)
    end

    local channel = self.channels[event]
    if not channel then return end

    for _, listener in ipairs(channel.listeners) do
        listener.callback()
    end
end
----------------------------------------------------- 装备模块
local eventEmitter = EventEmitter:new()
eventEmitter:setEvents({
    ["equipStrengthen"] = "装备强化",
})


function equipStrengthen()
    -- 装备强化逻辑
    eventEmitter:emit("equipStrengthen")
end

------------------------------------------------------ 成就模块
function checkAchievement()
    print('checkAchievement')
end

eventEmitter:on("equipStrengthen", checkAchievement)  -- 成就模块注册监听

------------------------------------------------------ 时装模块
function checkObtainFashion()
    print('checkObtainFashion')
end

eventEmitter:on("equipStrengthen", checkObtainFashion)  -- 时装模块注册监听
------------------------------------------------------------------------------------
function main()
    equipStrengthen()
end

main()

最后输出:

checkAchievement
checkObtainFashion

下面这个图可以有助于理解,

在这里插入图片描述

上述的实现比较简单,主要意思表达出来了,具体的细节可以结合需要再添加就好了。

如果觉得对你有帮助的话请 @程序员杨小哥 点个赞,谢谢!