大富翁(Monopoly)
2. 项目进度时间线 第一周 学习知识建立仓库
完成基本界面和类框架
学习cocos2dx相关知识
实现各种地图交互
完成素材收集和地图绘制
完成类框架设计
学习cocos2dx相关知识
实现回合制
实现部分触发事件
实现部分地产
学习cocos2dx相关知识
实现股票功能
实现信息栏功能
实现了大部分触发事件
实现了基本的游戏房产机制
完成地产和特殊地点触发功能
实现大量道具及卡片机制
实现神灵
完成了所有触发事件
实现AI功能
添加背景音乐及音效
撰写设计文档及游戏说明
撰写答辩幻灯片
李乐天 33.33%:地图绘制 菜单 交互 地产内容 部分道具
徐满心 33.33%:角色动画 回合制实现 事件 神灵 AI
水游龙 33.33%:股市内容 道具部分内容 角色信息显示栏 音效与音乐
- 游戏开始界面、选择界面、设置界面、背景音乐、退出功能
- 游戏回合制
通过回调函数的不断嵌套调用实现 - 人物行走动画
使用TexturePacker将人物动作打包生成图集与plist文件
将图集全部加载到SpriteFrameCache中
创建动画时直接读取SpriteFrameCache - 人物沿路行走
在地图类中增加储存路径坐标的vector,人物沿着路径坐标的位置行走。 - 地图拖拽、地图选点、视角跟随、小地图选点定位
- AI玩家混合功能
为角色类添加成员变量标记该角色是否为AI。
在与玩家可能产生交互的部分判断该角色是否为AI并单独加上AI决策的代码。 - 旅店房产、街道机制
- 特殊房产:公园、度假村、购物中心、研发中心。
- 实体公司:航空公司、石油公司、保险公司、科技公司。
- 特定位置触发随机事件(命运与机会)
- 29种道具(包括卡片)
每个道具为道具基类的派生类,通过调用各个类的虚函数完成相应效果 - 股市功能
每只股票为一个类,通过调用成员函数改变信息,更新时刷新显示效果 - 角色信息显示栏
与角色等类相关,当状态信息改变时,刷新显示内容 - 房屋建造、升级功能
- 特殊房产(银行,医院)
- 神灵
在地图中储存神灵的位置,在人物类中增加成员变量判断人物是否以及被什么神灵附身。
被附身的人着陆后会先判断地产再发动神灵功能。
最初认为for循环轮流遍历所有人物即可实现回合制,后来发现不是这样。
for循环的执行是程序开始执行后瞬间完成的,无法与用户在任何时刻都有可能进行的操作产生交互。
使用回调函数的不断嵌套调用。
调用层次为:
等待用户按下Go->按下Go->掷骰子->人物行走->判断神灵->判断地产-
->下一个人的回合开始,等待用户按下Go->按下Go->…
从而实现人物根据用户按下Go的时机轮流行走。
cocos2dx的坐标系统非常复杂,涉及到两套方向,不同参考系,不同量纲。
在程序设计的过程中,会涉及到大量的鼠标选点,地图定位,位置识别等等问题,就非常的让人头疼。
通过对地图的封装,在地图类外的所有地方使用位置的数组索引作为位置编号,创建自然坐标系。在地图类里,经过绞尽脑汁的计算整出来一套坐标变换方法。
3. 内存管理 难点cocos2dx的类都使用单独实现的引用计数,为了风格统一,游戏设计中的类多继承自cocos2dx使用其自动内存管理,导致类内部无法定义静态变量。早期调试过程中也因为对cocos2dx内存管理理解不够透彻,导致了很多很严重的bug,变量经常会被释放掉。
4. 字符编码 技术难点不知道为什么VS使用的MSVC编译器对UTF8编码格式的源代码支持不够完善,整个项目的源代码文件编码格式最后使用了GB2312,而cocos2dx默认解码导致输出中文会乱码。
解决方案无奈之下只能使用windows头文件中的相关函数硬性转码,但是这就带来了跨平台移植的困难。Android平台使用的Clang编译器没有windows头文件,而且对GB2312的支持不够完善。考虑以后可以使用plist配置文件的字符串映射解决中文问题。
项目亮点 图集的使用使用TexturePacker将人物的4向行走图片打包生成图集与.plist文件
并将图集全部加载到精灵帧缓存中
创建动画时读取精灵帧缓存即可,提高了性能
character_frame_cache_ = SpriteFrameCache::getInstance();
character_frame_cache_->addSpriteFramesWithFile
(StringUtils::format("%s.plist", name_.c_str()),
StringUtils::format("%s.png", name_.c_str()));
常量与全局常用方法
将项目中的常量定义于CommonConstant.h中,方便增删调整。
constexpr int hotel_land_value = 300;
constexpr int hotel_sell_value[5] = { 500,1000,2000,4000,0 };
constexpr int hotel_rent_value[5] = { 100,400,1200,3000,7000 };
将项目中的一些常见代码段包装成函数声明于CommonMethod.h中。
void SendMsg(int msg)
{
auto dispatcher = Director::getInstance()->getEventDispatcher();
char* buf = new char[10];
sprintf(buf, "%d", msg);
log("message sending : %s", buf);
EventCustom event = EventCustom("monopoly_msg");
event.setUserData(buf);
dispatcher->dispatchEvent(&event);
CC_SAFE_DELETE_ARRAY(buf);
}
丰富的地图交互
实现了小地图定位、视角跟随、位置信息显示、地图拖拽、地图选点等交互,提高了游戏可玩性。
大量道具、地产、事件的实现本项目共实现近30款道具,10余种地产,大量相关的事件,游戏内容非常丰富,机制复杂,可玩性极高。
使用的c++特性包括单不限于:
Lambda表达式
STL容器
类和多态
函数重载
类型判断
范围for语句
类内初始值
常量表达式constexpr
遵循C++风格类型转换
贯彻落实Google风格的命名
尽量使用Cocos2dx风格的类设计与内存管理
www.biyezuopin.vip
全程使用GitHub和Git进行版本控制
尽量做到了符合GoogleAngularJS规范的commit记录



