`cocos2dx非完整` 游戏架构缩影 添加启动流程
2015-05-29 13:05
435 查看
这期的话题可能不是很好, 我没有想到很好的词句去更好的表达. 我一直都是很固执的认为, 同一类型的游戏,在开发做的前期工作上面其实都是可以复用的,也就是大同小异的。从游戏启动,启动日志,启动检查,检查更新,到进入游戏.这些都是那一套东西,我想把这些东西抽象一下,概括出一个叫做"流程"的概念.
我的想法就是流程是顺序执行的, 就像我喜欢画图,先做什么,然后做什么,做完什么做什么.其实从一款app启动到进入游戏,这之间的过程都是流程化进行的.还有一个很经典的例子,新手引导,其实新手引导就是一堆流程集.无论是等级引导还是顺序引导还是任务引导其实都是有顺序的.或者换一个出发点,策划在做游戏的时候,他对游戏玩家在某个时间段出于一个什么样的状态会想的很清楚,因为他就是游戏的制作者.新手引导确实很难处理,谁做过谁知道.
好吧.既然说到流程这个概念,那么为了实现这个东西,也就需要响应的引入事件调度的概念,这个用lua很容易实现.我就不费力气了,从quick直接把事件机制拿过来,稍微改了一下(请原谅我是个偏执抑郁症患者).预示就诞生了下面这个东西:
上面也是看到了我给流程封装了finish(), remove(), launch()方法. 为了更彻底的贯彻流程的概念, 我索性也将启动部分的代码做了一点简单的封装.
默认会从第一个开始启动进入, 然后依次执行注册的流程.具体的例子我可以给一个.
目前的代码, 我只是写到了增量更新,所以我注册了三条流程.
-- check_log_measure 启动app运行日志.
-- check_env_measure 启动检查环境设置
-- check_update_measure 启动增量更新.
下面如果再添加流程应该就是进入游戏的流程了.
这样做再某些方面显得很呆板, 将一些简单的事情做的有点复杂了. 但是是有一个好处的, 那就是我们的架构设计开始出现模式化的代码了. 模式化很重要, 模式化是统一的前提. 在没有做到模式化之前, 一味的强调各种统一风格的事情就是扯淡,很难做得到.就像以前我遇到过一位主程, 每天就只会强调代码格式, 注释格式的问题, 基础的功能代码并不能提供. 我不知道这么做的意义何在. 这里只是突然想到了, 顺手吐槽一下.
这里说一句抱歉, 原本计划这一篇写增量更新的. 现在看来要延后了, 这里绝对不是因为技术问题. 我昨天就写好了, 今早起床也是将android包打出来测试通过了.是因为直接跳到更新那边忽略了中间太多的东西了,我想穿插一些文章来说明一下这些问题. 懂的人不需要多说,对于那些渴望学习的人, 我啰嗦一点就罗嗦一点了, 但是能解答他们的问题或者是有一点启示, 就是最好的事情了.
我的想法就是流程是顺序执行的, 就像我喜欢画图,先做什么,然后做什么,做完什么做什么.其实从一款app启动到进入游戏,这之间的过程都是流程化进行的.还有一个很经典的例子,新手引导,其实新手引导就是一堆流程集.无论是等级引导还是顺序引导还是任务引导其实都是有顺序的.或者换一个出发点,策划在做游戏的时候,他对游戏玩家在某个时间段出于一个什么样的状态会想的很清楚,因为他就是游戏的制作者.新手引导确实很难处理,谁做过谁知道.
好吧.既然说到流程这个概念,那么为了实现这个东西,也就需要响应的引入事件调度的概念,这个用lua很容易实现.我就不费力气了,从quick直接把事件机制拿过来,稍微改了一下(请原谅我是个偏执抑郁症患者).预示就诞生了下面这个东西:
--小岩<757011285@qq.com> --2015-5-27 17:05 local mm = require "fw.oop.measure_mgr" local m = class("measure") function m:ctor(dispatcher, next_m) self.dispatcher_ = dispatcher self.next_m_ = next_m end function m:get_name() return self.__cname end function m:get_next_name() return self.next_m_ end function m:launch() self.dispatcher_:dispatch({ name = mm.LAUNCH_M, launch = self:get_name(), }) end function m:finish() self.dispatcher_:dispatch({ name = mm.FINISH_M, finish = self:get_name(), forward= self:get_next_name(), }) end function m:remove() self.dispatcher_:dispatch({ name = mm.REMOVE_M, remove = self:get_name(), }) end function m:onlaunch() end function m:onfinish() end function m:onremove() end return m
--小岩<757011285@qq.com> --2015-5-27 17:05 local proxy = require "fw.framework.proxy" local mm = class("measure_mgr") mm.LAUNCH_M = "LAUNCH_MEASURE" mm.FINISH_M = "FINISH_MEASURE" mm.REMOVE_M = "REMOVE_MEASURE" mm.TAG = "MEASUREMGR_TAG" function mm:ctor(dispatcher) self.proxy_ = proxy.new(dispatcher) self.measures_ = {} self.proxy_:add_listener(mm.LAUNCH_M, function(e) self:onlaunch_m(e) end, mm.TAG) :add_listener(mm.FINISH_M, function(e) self:onfinish_m(e) end, mm.TAG) :add_listener(mm.REMOVE_M, function(e) self:onremove_m(e) end, mm.TAG) end function mm:register_measure(m) local m_name = string.upper(m:get_name()) if not self.measures_[m_name] then self.measures_[m_name] = m end end function mm:remove_measure_by_name(name) name = string.upper(tostring(name)) if self.measures_[name] then self.measures_[name]:onremove() self.measures_[name] = nil end end function mm:launch_measure_by_name(name) name = string.upper(tostring(name)) if self.measures_[name] then self.measures_[name]:onlaunch() end end function mm:finish_measure_by_name(name) name = string.upper(tostring(name)) if self.measures_[name] then self.measures_[name]:onfinish() end end function mm:onlaunch_m(e) self:launch_measure_by_name(e.launch) end function mm:onfinish_m(e) self:finish_measure_by_name(e.finish) local next_m = e.forward if next_m then self:launch_measure_by_name(next_m) end end function mm:onremove_m(e) self:remove_measure_by_name(e.remove) end function mm:destroy() self.proxy_:remove_all_listeners() self.measures_ = {} end return mm
上面也是看到了我给流程封装了finish(), remove(), launch()方法. 为了更彻底的贯彻流程的概念, 我索性也将启动部分的代码做了一点简单的封装.
--小岩<757011285@qq.com> --2015-5-27 17:27 local ij = require "fw.framework.inject" local mm = require "fw.oop.measure_mgr" local app = class("app") function app:ctor() self.dispatcher_ = ij.inject({}):add_component("fw.framework.dispatch") self.m_mgr_ = mm.new(self.dispatcher_) self.entrance_m_ = nil end function app:get_dispatcher() return self.dispatcher_ end function app:start() if not self.entrance_m_ then error("pls set entrance measure before start()!") end self.entrance_m_:launch() end function app:register_game_measure(m) if not self.entrance_m_ then self.entrance_m_ = m end self.m_mgr_:register_measure(m) end function app:destroy() self.m_mgr_:destroy() end function app:exit() cc.Director:getInstance():endToLua() end return app
默认会从第一个开始启动进入, 然后依次执行注册的流程.具体的例子我可以给一个.
--小岩<757011285@qq.com> --2015-5-27 17:39 local clm = require "game.measure.check_log" local cem = require "game.measure.check_env" local cum = require "game.measure.check_update" local application = class("application", fw.app) function application:ctor() application.super.ctor(self) end function application:run() self:register_game_measure(clm.new(self:get_dispatcher(), cem.__cname)) self:register_game_measure(cem.new(self:get_dispatcher(), cum.__cname)) self:register_game_measure(cum.new(self:get_dispatcher())) self:start() end return application
目前的代码, 我只是写到了增量更新,所以我注册了三条流程.
-- check_log_measure 启动app运行日志.
-- check_env_measure 启动检查环境设置
-- check_update_measure 启动增量更新.
下面如果再添加流程应该就是进入游戏的流程了.
这样做再某些方面显得很呆板, 将一些简单的事情做的有点复杂了. 但是是有一个好处的, 那就是我们的架构设计开始出现模式化的代码了. 模式化很重要, 模式化是统一的前提. 在没有做到模式化之前, 一味的强调各种统一风格的事情就是扯淡,很难做得到.就像以前我遇到过一位主程, 每天就只会强调代码格式, 注释格式的问题, 基础的功能代码并不能提供. 我不知道这么做的意义何在. 这里只是突然想到了, 顺手吐槽一下.
这里说一句抱歉, 原本计划这一篇写增量更新的. 现在看来要延后了, 这里绝对不是因为技术问题. 我昨天就写好了, 今早起床也是将android包打出来测试通过了.是因为直接跳到更新那边忽略了中间太多的东西了,我想穿插一些文章来说明一下这些问题. 懂的人不需要多说,对于那些渴望学习的人, 我啰嗦一点就罗嗦一点了, 但是能解答他们的问题或者是有一点启示, 就是最好的事情了.
相关文章推荐
- cocos2dx左下角三行数值意义
- 谈谈如何调试程序BUG (vs2012 cocos2dx)
- Cocos2d-x 异步加载纹理学习
- 【iOS-cocos2d-X 游戏开发之一】在Mac下结合Xcode搭建Cocos2d-X开发环境!
- 在cocos2dx 3.0中如何产生随机数
- 我的Cocos2d-x学习笔记(八)利用CCSpriteBatchNode进行优化
- 我的Cocos2d-x学习笔记(八)利用CCSpriteBatchNode进行优化
- cocos按钮变灰
- Cocos2dx现成的粒子特效
- cocos2d-x 3.0 场景切换特效汇总
- cocos2dx 简单实现遮罩的两种方式
- 如何使用ZEROBRANE STUDIO远程调试COCOS2D-X的LUA脚本
- Cocos2d-x中使用第三方so库
- Cocos2d-x3.0游戏实例《别救我》目录
- cocos2dx 3.6 win32工程笔记
- Cocos2d-x3.2 执行build_native.py 显示couldn't find the gcc toolchains
- lua实现cocos多边形碰撞检测
- Cocos2d-js-v3.6.1之一:创建一个新项目
- cocos2dx 3.4 入手cocos2dx 第一次总结
- 【深入理解Cocos2d-x 3.x】 如何进行合理的内存分配