`cocos2dx非完整` 游戏架构缩影 添加启动流程
这期的话题可能不是很好, 我没有想到很好的词句去更好的表达. 我一直都是很固执的认为, 同一类型的游戏,在开发做的前期工作上面其实都是可以复用的,也就是大同小异的。从游戏启动,启动日志,启动检查,检查更新,到进入游戏.这些都是那一套东西,我想把这些东西抽象一下,概括出一个叫做"流程"的概念.
我的想法就是流程是顺序执行的, 就像我喜欢画图,先做什么,然后做什么,做完什么做什么.其实从一款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非完整` 游戏架构缩影 添加启动流程的更多相关文章
- `cocos2dx非完整` 添加xxtea加密模块
在上一篇文章中,我已经开始着手写自己的模块,也就是fw部分.其中上一篇文章中完成的是lua部分的配置解析部分,涉及一点点平台方面的封装.这一片文章我来说明一下我是如何处理cocos2dx资源加密的.首 ...
- `cocos2dx 非完整` UI解析模块
昨天在cocos2dx的一个群里,遇到一位匿名为x的朋友询问的问题,是关于ui的.他使用c++写了不少的ui封装节点,用来实现游戏中的各种不同效果.然后现在想改用lua,于是尝试使用最小代价去复用自己 ...
- `cocos2dx非完整` 日志模块 增量更新
在上一篇文章中,说到了"流程"的由来,以及我对流程的使用. 这一片就是对流程的应用.前一篇文章中说到了三条流程 check_log_measure, check_env_measu ...
- `cocos2dx非完整` 开始自己的FW模块
上一篇的文章中说到了一些个人习惯的东西以及一些简单的项目配置,这一篇文章我们来进一步完善一些东西.首先,打开编译以后的客户端执行,会看到一大堆的fileutils加载luac文件的提示,在终端显示一大 ...
- `cocos2dx非完整`开篇
相信每个人都有一些自己的项目开发习惯,在·开篇·中我主要是会提到一些项目的配置问题.无论做一款什么样的手游项目,我们总是会从需求的角度出发去选择开发引擎,开发工具等一些列的工具去完善我们的开发环境.当 ...
- 添加启动游戏过渡场景Default Splash Scene(Unity3D开发之十三)
添加启动游戏过渡场景Default Splash Scene(Unity3D开发之十三) 猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blo ...
- Cocos2dx源码赏析(1)之启动流程与主循环
Cocos2dx源码赏析(1)之启动流程与主循环 我们知道Cocos2dx是一款开源的跨平台游戏引擎,而学习开源项目一个较实用的办法就是读源码.所谓,"源码之前,了无秘密".而笔者 ...
- cocos2d-x Android版游戏之中国移动SDK嵌入
. 拷贝API 将SDK\runtime\CMBilling20007.jar拷贝至游戏工程的runtime目录下(或其他目录) ,但切记不能放在libs目录下编译,否则编译报错(如:bad rang ...
- Cocos2d-x 3.x游戏开发之旅
Cocos2d-x 3.x游戏开发之旅 钟迪龙 著 ISBN 978-7-121-24276-2 2014年10月出版 定价:79.00元 516页 16开 内容提要 <Cocos2d-x ...
随机推荐
- C++ Primer中文版(第5版)(顶级畅销书重磅升级全面采用最新 C++ 11标准)
C++ Primer中文版(第5版)(顶级畅销书重磅升级全面采用最新 C++ 11标准) [美]Stanley B. Lippman( 斯坦利李普曼) Josee Lajoie(约瑟拉乔伊 ) B ...
- 将外卖O2O广告一棍子打成竞价排名,秤把平了吗?
近日,诸多媒体报道称美团外卖.饿了么等外卖O2O将竞价排名引入外卖平台当中进行广告运营一事闹得沸沸扬扬.那么,美团外卖.饿了么真的都是竞价排名吗? 其实,美团外卖的付费推广仅仅只是针对列表的固定位置, ...
- Leetcode 1 Two Sum STL
题意:给定一个目标值target,找到两个数的和为target,返回这两个数的下标 用map记录每个数的下标,并用于查找 class Solution { public: vector<int& ...
- 【转】使用Cocoapods创建私有podspec
Cocoapods是非常好用的一个iOS依赖管理工具,使用它可以方便的管理和更新项目中所使用到的第三方库,以及将自己的项目中的公共组件交由它去管理.Cocoapods的介绍及优点本文就不在赘述,我开始 ...
- Scala 深入浅出实战经典 第55讲:Scala中Infix Type实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...
- Redmine性能优化方案
近来公司redmine服务器表现很糟糕,在16核,64GRAM的机器上,压测结果竟然只有每秒5~7个请求,部分页面一个都出不来. 以下是我对Redmine性能优化方案: redmine服务器性能问题排 ...
- Java 反射练习
已同步更新至个人blog:http://dxjia.cn/2015/08/java-reflect/ 引用baidubaike上对JAVA反射的说明,如下:JAVA反射机制是在运行状态中,对于任意一个 ...
- C# 字典排序Array.Sort
Array.Sort可以实现便捷的字典排序,但如果完全相信他,那么就容易产生些异常!太顺利了,往往是前面有坑等你. 比如:微信接口,好多地方需要签名认证,签名的时候需要用的字典排序,如果只用Array ...
- SharedPreference注册OnSharedPreferenceChangeListener一直无法回调问题
注册代码如下: SharedPreferences sp = getSharedPreferences("AndroidDemo", Context.MODE_PRIVATE); ...
- Hive Streaming 追加 ORC 文件
1.概述 在存储业务数据的时候,随着业务的增长,Hive 表存储在 HDFS 的上的数据会随时间的增加而增加,而以 Text 文本格式存储在 HDFS 上,所消耗的容量资源巨大.那么,我们需要有一种方 ...