功能点与实现思路
- 游戏开始界面、选择界面、设置界面、背景音乐、退出功能
- 游戏回合制 通过回调函数的不断嵌套调用实现
- 人物行走动画 使用
TexturePacker
将人物动作打包生成图集与plist
文件 将图集全部加载到SpriteFrameCache
中 创建动画时直接读取SpriteFrameCache
- 人物沿路行走 在地图类中增加储存路径坐标的vector,人物沿着路径坐标的位置行走。
- 地图拖拽、地图选点、视角跟随、小地图选点定位
- AI玩家混合功能 为角色类添加成员变量标记该角色是否为AI。 在与玩家可能产生交互的部分判断该角色是否为AI并单独加上AI决策的代码。
- 旅店房产、街道机制
- 特殊房产:公园、度假村、购物中心、研发中心。
- 实体公司:航空公司、石油公司、保险公司、科技公司。
- 特定位置触发随机事件(命运与机会)
- 29种道具(包括卡片) 每个道具为道具基类的派生类,通过调用各个类的虚函数完成相应效果
- 股市功能 每只股票为一个类,通过调用成员函数改变信息,更新时刷新显示效果
- 角色信息显示栏 与角色等类相关,当状态信息改变时,刷新显示内容
- 房屋建造、升级功能
- 特殊房产(银行,医院)
- 神灵 在地图中储存神灵的位置,在人物类中增加成员变量判断人物是否以及被什么神灵附身。 被附身的人着陆后会先判断地产再发动神灵功能。
技术难点与其解决方案
1. 回合制
技术难点
最初认为for循环轮流遍历所有人物即可实现回合制,后来发现不是这样。 for循环的执行是程序开始执行后瞬间完成的,无法与用户在任何时刻都有可能进行的操作产生交互。
解决方案
使用回调函数的不断嵌套调用。 调用层次为: 等待用户按下Go->按下Go->掷骰子->人物行走->判断神灵->判断地产- ->下一个人的回合开始,等待用户按下Go->按下Go->...... 从而实现人物根据用户按下Go的时机轮流行走。
2. 坐标
技术难点
cocos2dx的坐标系统非常复杂,涉及到两套方向,不同参考系,不同量纲。 在程序设计的过程中,会涉及到大量的鼠标选点,地图定位,位置识别等等问题,就非常的让人头疼。
解决方案
通过对地图的封装,在地图类外的所有地方使用位置的数组索引作为位置编号,创建自然坐标系。在地图类里,经过绞尽脑汁的计算整出来一套坐标变换方法。
3. 内存管理
难点
cocos2dx的类都使用单独实现的引用计数,为了风格统一,游戏设计中的类多继承自cocos2dx使用其自动内存管理,导致类内部无法定义静态变量。早期调试过程中也因为对cocos2dx内存管理理解不够透彻,导致了很多很严重的bug,变量经常会被释放掉。
4. 字符编码
技术难点
不知道为什么VS使用的MSVC编译器对UTF8编码格式的源代码支持不够完善,整个项目的源代码文件编码格式最后使用了GB2312,而cocos2dx默认解码导致输出中文会乱码。
解决方案
无奈之下只能使用windows头文件中的相关函数硬性转码,但是这就带来了跨平台移植的困难。Android平台使用的Clang编译器没有windows头文件,而且对GB2312的支持不够完善。考虑以后可以使用plist配置文件的字符串映射解决中文问题。
源码和文档都托管在了【WRITE-BUG数字空间】上面了,有需要的可自取~