2dx给Widget添加CCNode

项目开发日志(十)

环境:cocos2d-x 2.2.3,Lua 5.1.

在前几天给cocostudio增加了一个控件 – BigMap(大地图控件),用于承载游戏地图上的所有游戏实体,包括NPC,玩家,可能存在的宝箱,传送门等等.

但是在把实体(基类是CCNode)addChild到控件的时候,只显示了图片的一半,也就是一个三角形,一开始以为是底层BUG,后面发现在UIWidget.cpp源码中有这一句:

void Widget::addChild(CCNode* child, int zOrder, int tag)
{
    CCAssert(dynamic_cast(child) != NULL, "Widget only supports Widgets as children");
    CCNode::addChild(child, zOrder, tag);
    _widgetChildren->addObject(child);
}

继续阅读“2dx给Widget添加CCNode”

实体对象的设计(一)

项目开发日志(九)

在我参与的项目中的实体管理系统据说经过了很多游戏的磨练,本身已经很复杂,我只能记录我的理解,可能在往后的日子里有更深入的理解后会修改下面的一些认识.关于实体系统我可能会分比较多的部分来慢慢说,目前能想到的内容会有:实体对象的设计原则与继承关系,实体对象的属性分配,实体对象的消息.

  • 游戏实体对象

游戏实体系统在游戏编程系列著作< 游戏编程精粹四>中提及.以下摘抄一小段:


现代游戏充满各种各样的实体,玩家,敌人和发射的炮弹.这些要素在游戏世界里乱哄哄的跑来跑去,地形,建筑物,天空和云彩的定义环境.路径点(waypoint),触发器和脚本指导玩家体验.得分,破坏和无力方面组成游戏世界的逻辑和规则.不是对所有东西分别对待,作为特殊目的的要素,把他们结合为一个系统并且提供一个公用的结构和通信方法是很方便的,基于消息的方法来管理实体能够解决很多问题并提供一种方法统一大部分的关键游戏要素 – 摘自< 游戏编程精粹4> 第58页


继续阅读“实体对象的设计(一)”

2dx增加GUI控件

项目开发日志(八)

今天给cocos2dx2.2.3的cocostudio GUI增加遮罩控件,发现步骤还挺多.这里记录一下(省去编写代码的部分):

增加控件相关pkg文件

代码编写完成后,我把代码放到extensions\CocoStudio\GUI文件夹下.这个文件夹是cocostudio用来存放UI控件的默认文件夹.然后在文件夹tools\tolua++中增加控件pkg文件,例如我增加了UIBigMap.pkg,把需要导出给外界使用的函数从控件头文件中复制到pkg中.pkg的写法参照同文件夹下的其他pkg.

继续阅读“2dx增加GUI控件”

让模块接口化

项目开发日志(七) 模块逻辑解耦

(注:项目跨平台采用cocos2d-x,服务端 和 客户端游戏逻辑部分 采用C++,客户端UI部分采用Lua)

游戏项目一般模块众多功能庞杂,合理的逻辑解耦会让整个项目看起来结构清晰且易于维护,接口事件是逻辑解耦的常用方式,C++和C#,JAVA不同 并没有明确的接口化编程,也没有像AS3那种功能完备事件处理,但C++是一种高度自由的语言,我们可以通过C++的继承与动态绑定来实现接口化.下面是我参与的项目中模块与模块的关系设计原型.

继续阅读“让模块接口化”

定时器的设计

项目开发日志(六)

定时器在游戏项目中使用非常普遍,特别是在游戏服务端项目中,定时器检查函数会在每一帧调用.而保证游戏性能的关键就是在每一帧尽可能的运行少的代码,我们知道系统运行每一行代码其实是有时间的.所以每帧必然调用的代码量越少越好,在定时器的设计上 就要求我们尽可能的追求性能的极致.

一般的定时器设计原理

假设把整个游戏注册的所有定时器都放到一个vector容器中,一般的做法可能是每帧搜索一下这个vector,然后拿出来对比时间,时间到了则触发.这种在处理定时事件少的情况下是没有问题的,但是如果定时事件非常多的话,则需要改进下算法了.

继续阅读“定时器的设计”

常读常新C++Primer

项目开发日志(五)

由于工作上项目逻辑部分选择用C++实现,在业余时间重新去读了一次 C++Primer,我记得第一次读还是在大三暑假,1000多页的天书搞不懂那时候是怎么看完的.而工作后的这一次 我用了大概前前后后2个月的时间去看.基本也就一天翻20多页的状态.

我发现现在很多人很难静下心来把一本技术书或者一篇中等的文章从头读到尾,即使是我写的一些BUG记录博文,很多人遇到相应的问题还是懒得翻,躁动的网络干扰着躁动的心.需要赶快让自己读书的状态回归当年 .

这次读C++Primer的新认识

  • Object 不是 对象

继续阅读“常读常新C++Primer”

多重继承中的动态绑定

项目开发日志(四)

C++是一种自由度非常高的语言,特别是面向对象中的动态绑定特性,正确使用这种特性会你写代码非常舒畅.但是错误的使用有时候也很致命.

今天在编写战斗逻辑层代码的时候在释放技能回调的地方使用了C++的多重继承,在一个继承了几个回调基类(技能释放完毕回调,移动完毕回调等)的派生类里面出现了无法绑定到正确的基类对象的问题.仔细分析后 发现是由于在第一层类型转换的时候已经把指针转换为void*,然后在最后一层调用无法正确转换.下面把问题重现:

继续阅读“多重继承中的动态绑定”

Lua的Require的另一种实现

项目开发日志系列(三)

配置环境与工具: 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函数会在路径中搜索输入的文件路径,大致流程如下:

继续阅读“Lua的Require的另一种实现”

2dx给Lua增加C接口的两种方式

项目开发日志系列(二)

配置环境与工具: 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++接口完全和官方的独立开来.

  • 独立的接口增加方式

继续阅读“2dx给Lua增加C接口的两种方式”

开发日志(一) 开始的时候

项目开发日志系列(一)

  • 项目概况

基于cocos2d-x的一款Android/iOS平台的动漫题材卡牌手游,基于卡牌但超越卡牌.源于动漫但超越动漫

  • 目前进度

经过一段时间的人员调整和项目前期准备,技术选型,项目类型考量.项目终于进入实际性的阶段,之前的一段时间 全花在人员调配 项目立项,资源分配上,其实就是对外:面试面试再面试的招收新伙伴,对内:争取争取再争取内部资源.优质的资源给优质的团队 这可能在每一个公司都是这样.

  • 面试与被面试

过程中非常痛苦,走一堆流程,单单面试(目前我有参与部分伙伴的面试,以给制作人提供意见)来说,需要想很多你写代码的时候不会想的东西,你需要通过一系列问题 大概了解对方的技术深度 三观 对你未来项目的兴趣等等.而且往往面试的同学很多技术都会超过你目前的水平.这个时候你的内心是痛苦的,你会担心问的问题太过low回头被他耻笑怎么办?或者问的问题太不着边际让对方对你的面试官水平产生怀疑. 面试,在我毕业出来那会儿觉得是一种渴望被选择被看中的过程,但现在看来 更应该是一种互相选择的过程.感谢目前的新伙伴 以及面试中有过一面之缘的不算朋友的道友们.

继续阅读“开发日志(一) 开始的时候”