项目开发日志(七) 模块逻辑解耦
(注:项目跨平台采用cocos2d-x,服务端 和 客户端游戏逻辑部分 采用C++,客户端UI部分采用Lua)
游戏项目一般模块众多功能庞杂,合理的逻辑解耦会让整个项目看起来结构清晰且易于维护,接口和事件是逻辑解耦的常用方式,C++和C#,JAVA不同 并没有明确的接口化编程,也没有像AS3那种功能完备事件处理,但C++是一种高度自由的语言,我们可以通过C++的继承与动态绑定来实现接口化.下面是我参与的项目中模块与模块的关系设计原型.
光荣在于平淡,艰巨在于漫长
项目开发日志(七) 模块逻辑解耦
(注:项目跨平台采用cocos2d-x,服务端 和 客户端游戏逻辑部分 采用C++,客户端UI部分采用Lua)
游戏项目一般模块众多功能庞杂,合理的逻辑解耦会让整个项目看起来结构清晰且易于维护,接口和事件是逻辑解耦的常用方式,C++和C#,JAVA不同 并没有明确的接口化编程,也没有像AS3那种功能完备事件处理,但C++是一种高度自由的语言,我们可以通过C++的继承与动态绑定来实现接口化.下面是我参与的项目中模块与模块的关系设计原型.
经过了漫长的几个月的折腾,把博客从西部数码搬到阿里云,再到现在搬到VPS,终于有了一种尘埃落定的感觉.本来打算是到阿里云安家,但是备案那边在西部数码一直过不去,注销也被无情的打回.在几次沟通中让我下定决心一不做二不休直接把博客搬到digitalocean上,而且把域名转移到godaddy
项目开发日志(六)
定时器在游戏项目中使用非常普遍,特别是在游戏服务端项目中,定时器检查函数会在每一帧调用.而保证游戏性能的关键就是在每一帧尽可能的运行少的代码,我们知道系统运行每一行代码其实是有时间的.所以每帧必然调用的代码量越少越好,在定时器的设计上 就要求我们尽可能的追求性能的极致.
一般的定时器设计原理
假设把整个游戏注册的所有定时器都放到一个vector容器中,一般的做法可能是每帧搜索一下这个vector,然后拿出来对比时间,时间到了则触发.这种在处理定时事件少的情况下是没有问题的,但是如果定时事件非常多的话,则需要改进下算法了.
项目开发日志(五)
由于工作上项目逻辑部分选择用C++实现,在业余时间重新去读了一次 C++Primer,我记得第一次读还是在大三暑假,1000多页的天书搞不懂那时候是怎么看完的.而工作后的这一次 我用了大概前前后后2个月的时间去看.基本也就一天翻20多页的状态.
我发现现在很多人很难静下心来把一本技术书或者一篇中等的文章从头读到尾,即使是我写的一些BUG记录博文,很多人遇到相应的问题还是懒得翻,躁动的网络干扰着躁动的心.需要赶快让自己读书的状态回归当年 .
这次读C++Primer的新认识
Object
不是 对象
项目开发日志(四)
C++是一种自由度非常高的语言,特别是面向对象中的动态绑定特性,正确使用这种特性会你写代码非常舒畅.但是错误的使用有时候也很致命.
今天在编写战斗逻辑层代码的时候在释放技能回调的地方使用了C++的多重继承,在一个继承了几个回调基类(技能释放完毕回调,移动完毕回调等)的派生类里面出现了无法绑定到正确的基类对象的问题.仔细分析后 发现是由于在第一层类型转换的时候已经把指针转换为void*
,然后在最后一层调用无法正确转换.下面把问题重现:
项目开发日志系列(三)
配置环境与工具: cocos2d-x-2.2.3
,Lua5.1
,tulua++
,Xcode
;
测试工程: /cocos2d-x-2.2.3/samples/Lua/HelloLua
Lua在我的项目中的定位
Lua本来是一种轻快而小巧的脚本语言,随着手游大行其道,它逐渐被用来开发中型 甚至大型的项目,在我的项目中 并不打算全部逻辑放到Lua层,而是让轻快的Lua去做轻快的事情,Lua只是火车上的舒服的空调或者座椅.让火车头C++同学去做火车头应该做的事情.
Lua中的require
require函数实现了不同lua文件的加载,类似于C++中的include
,java中的import
,
require函数会在路径中搜索输入的文件路径,大致流程如下:
项目开发日志系列(二)
配置环境与工具: cocos2d-x-2.2.3
,Lua5.1
,tulua++
,Xcode
;
测试工程: /cocos2d-x-2.2.3/samples/Lua/HelloLua
cocos2d-x的Lua binding中给Lua增加C++接口相信很多朋友都会,谷歌上的教程全部是往/scripting/lua/cocos2dx_support
和搭配往/tools/tolua++/cocos2dx.pkg
增加PKG然后重新生成 LuaCocos2d.cpp
的方式,但是这种方式不适合引擎的无缝升级,而且封闭性感觉不太好,如果能把项目的东西和引擎的东西完全脱离开 那是最好的,这样在更新 在升级版本上都非常容易,而且你看 LuaCocosd2d.cpp
都70000多行了..所以 我们应该把个人定制的C++接口完全和官方的独立开来.
项目开发日志系列(一)
基于cocos2d-x的一款Android/iOS平台的动漫题材卡牌手游,基于卡牌但超越卡牌.源于动漫但超越动漫
经过一段时间的人员调整和项目前期准备,技术选型,项目类型考量.项目终于进入实际性的阶段,之前的一段时间 全花在人员调配 项目立项,资源分配上,其实就是对外:面试面试再面试的招收新伙伴,对内:争取争取再争取内部资源.优质的资源给优质的团队 这可能在每一个公司都是这样.
过程中非常痛苦,走一堆流程,单单面试(目前我有参与部分伙伴的面试,以给制作人提供意见)来说,需要想很多你写代码的时候不会想的东西,你需要通过一系列问题 大概了解对方的技术深度 三观 对你未来项目的兴趣等等.而且往往面试的同学很多技术都会超过你目前的水平.这个时候你的内心是痛苦的,你会担心问的问题太过low回头被他耻笑怎么办?或者问的问题太不着边际让对方对你的面试官水平产生怀疑. 面试,在我毕业出来那会儿觉得是一种渴望被选择被看中的过程,但现在看来 更应该是一种互相选择的过程.感谢目前的新伙伴 以及面试中有过一面之缘的不算朋友的道友们.
博客在迁移过程中遇到了几个问题,在这记录一下.这次迁移只迁移了数据库,wp部分并没有迁移,而是直接去官网更新最新的,还好这种做法并没什么大问题
数据库在迁移过程中遇到了字符编码的问题,开始一直中文显示乱码.后面查出的原因是我在备份数据库的时候使用了GB字符集,而新数据库的服务器字符集是UTF8,重新备份数据库导出字符集选UTF8,才解决此问题
数据库整个压缩备份文件大小为2M多.超出了默认的显示大小(2M),修改PHP.ini的upload_max_filesize的值为20M,即解决此问题.
继续阅读“我的博客迁移记录”
一直以来我都是从基础书本,从开源代码,从同事批评,从谷歌中改进自己”写代码”的技能.这里说的”写代码”,不是指具体的功能实现 函数调用,而是指一种编码习惯,例如命名习惯,留空习惯,注释习惯,等等在日常”写代码”中息息相关的片段.迄今为止我看过的没有那一本书(除了声名显赫的 code complete)教过我如何 跳出特定编程语言去写代码.这可能是我需要不断修炼的技能(去除特定的语法,语言,IDE,系统,最后程序员还剩下的东西 我估计那就是这里说的技能了.
今天我发现了一直伴随我身边的伙伴 – “编译器”,写代码技术已经是修炼到登峰造极的地步了,他给我的感觉 无异于 少林寺的扫地僧,首先看一段代码
[code lang=”java”]
// C/C++
int for1(int n)
{
int i = 0;
int s = 0;
for(i = 0;i<n;i++)
{
s += i*2;
}
return s;
}
[/code]