栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

基于cocos2dx引擎开发的大富翁游戏

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于cocos2dx引擎开发的大富翁游戏

大富翁开发文档 项目信息介绍 1. 项目名称

大富翁(Monopoly)

2. 项目进度时间线 第一周 学习知识

建立仓库
完成基本界面和类框架
学习cocos2dx相关知识

第二周 收集素材

实现各种地图交互
完成素材收集和地图绘制
完成类框架设计
学习cocos2dx相关知识

第三周 肝肝肝!!!

实现回合制
实现部分触发事件
实现部分地产
学习cocos2dx相关知识

第四周 肝肝肝!!!+Debug

实现股票功能
实现信息栏功能
实现了大部分触发事件
实现了基本的游戏房产机制
完成地产和特殊地点触发功能

第五周 肝肝肝!!!+Debug

实现大量道具及卡片机制
实现神灵
完成了所有触发事件

第六周 收尾+Debug

实现AI功能
添加背景音乐及音效
撰写设计文档及游戏说明
撰写答辩幻灯片

项目开发文档 整体架构设计与小组分工 整体构架设计

小组分工

李乐天 33.33%:地图绘制 菜单 交互 地产内容 部分道具
徐满心 33.33%:角色动画 回合制实现 事件 神灵 AI
水游龙 33.33%:股市内容 道具部分内容 角色信息显示栏 音效与音乐

功能点与实现思路
  1. 游戏开始界面、选择界面、设置界面、背景音乐、退出功能
  2. 游戏回合制
    通过回调函数的不断嵌套调用实现
  3. 人物行走动画
    使用TexturePacker将人物动作打包生成图集与plist文件
    将图集全部加载到SpriteFrameCache中
    创建动画时直接读取SpriteFrameCache
  4. 人物沿路行走
    在地图类中增加储存路径坐标的vector,人物沿着路径坐标的位置行走。
  5. 地图拖拽、地图选点、视角跟随、小地图选点定位
  6. AI玩家混合功能
    为角色类添加成员变量标记该角色是否为AI。
    在与玩家可能产生交互的部分判断该角色是否为AI并单独加上AI决策的代码。
  7. 旅店房产、街道机制
  8. 特殊房产:公园、度假村、购物中心、研发中心。
  9. 实体公司:航空公司、石油公司、保险公司、科技公司。
  10. 特定位置触发随机事件(命运与机会)
  11. 29种道具(包括卡片)
    每个道具为道具基类的派生类,通过调用各个类的虚函数完成相应效果
  12. 股市功能
    每只股票为一个类,通过调用成员函数改变信息,更新时刷新显示效果
  13. 角色信息显示栏
    与角色等类相关,当状态信息改变时,刷新显示内容
  14. 房屋建造、升级功能
  15. 特殊房产(银行,医院)
  16. 神灵
    在地图中储存神灵的位置,在人物类中增加成员变量判断人物是否以及被什么神灵附身。
    被附身的人着陆后会先判断地产再发动神灵功能。
技术难点与其解决方案 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配置文件的字符串映射解决中文问题。

项目亮点 图集的使用

使用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记录

项目运行效果(超过4张)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/901692.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号