为什么游戏架构要用事件来驱动?
今天总结一下游戏架构中的事件触发机制,游戏架构中为什么需要由事件驱动。
主要是为了解耦,所谓高内聚,低耦合,如果不采用事件驱动的方式,则会像下面这样来写代码。
比如说,游戏内有多个玩法模块,"玩家"在打造装备的时候,可能触发"装备打造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
下面这个图可以有助于理解,
上述的实现比较简单,主要意思表达出来了,具体的细节可以结合需要再添加就好了。
如果觉得对你有帮助的话请@程序员杨小哥 点个赞,谢谢!
微软妥协,安卓开发与Windows重要度平等,多设备协同是目标Android和iOS已经毫无疑问成为智能手机的两大主要阵营,曾经的黑莓和微软都想要成为与Android和iOS齐名的第三大移动端操作系统,但遗憾的是用户最终抛弃了它们,毕竟黑莓系
大厂为什么会大裁员?真实原因只有一个镰刀增加而韭菜在减少这几天今冬的裁员成了网上最火的热门,几乎所有人都在调侃说好的不抛弃不放弃呢?而且据说不只是今冬几乎所有互联网大厂都在裁员,各种分析接踵而至,其实在我看来真实原因就只有一个这些年镰刀
哪些商品适合在拼多多上购买?拼多多在2019年的总成交额突破了10000亿人民币,市值已经突破了500亿美元,用户超过了4亿。拼多多已经是淘宝京东之后,国内的第三大电商。不过,由于前期爆发式增长,曾经导致拼多
关于苹果iPhone14和屏下FaceID都有了准确消息,是你期待的吗?不谋而合,苹果屏下FaceID功能实现时间就这样被曝光了根据之前曝光的消息,苹果近期在打磨前置摄像头的FaceID,也就是说将带口罩解锁功能发挥到极致,继续发挥前置摄像头的功能,苹
深入体验微软电脑管家不知道为何,近几年微软老不按套路出牌,Windows10系统推出了好多年,依然不伦不类,BUG多,主业做不好,还老是弄软件来抢其他人的饭碗,现在微软又推出了电脑管家。微软电脑管家官
峰米T1私人电影院搬回家首先给大家介绍一下峰米T1这款产品,峰米这款采用了ALPDRGB全色激光显示技术,加上2800ANSI流明画面亮度,可以说画质表现相当惊艳,超高清分辨率4K(38402160)28
为什么思皓E10X那么值?传统燃油车的三大件很重要,同样的我们新能源汽车最重要的就是三电系统!下面小编就为大家介绍下我们思皓新能源的三电系统,思皓是德国大众与江汽集团的合资品牌,在三电技术方面也融合了双方多
面向对象编程三大特性封装继承多态一封装封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽
京东为何会进行大规模裁员,京东到底遭遇了怎样的危机?近段时间,京东大规模裁员事件登上了热搜,那么到底京东为何如此大规模的裁员,京东到底遭遇了怎样的危机?京东到底怎么了?京东去年的年报2021年总收是9515亿,拼多多是939亿,阿里
科学家更新了人类发给外星人的信息最新制作的发向太空的信息的一部分含有男女人类的形像和DNA双螺旋结构。美国宇航局(NASA)的几位科学家新制作了一条使用射电望远镜就可以向太空发射的信息,并给它取名为星系中的灯塔(
国际监管动态英国将对云计算和存储研发减税,美国拜登政府发表针对数字资产的行政命令国际组织1。促进高效跨境CBDC支付,BIS完成通用平台原型开发2022年3月22日,国际清算银行(BIS)创新中心澳大利亚储备银行马来西亚中央银行新加坡金融管理局和南非储备银行联