宝贝三十六计V1.0 Cocos2d-x联网实战项目

1. 项目更新

文档更新

1.1. 开发更新

1.2. 发行更新

2. 游戏介绍

2.1. 游戏名

  • 宝贝三十六计
  • Baby’s_36_Skills

2.2. Logo

2.3. 游戏简介

宝贝三十六计是一款针对3-6岁儿童的益智策略类游戏,主要用来教会宝宝识别坏人的伎俩,不轻易相信坏人。

2.3.1. 单机模式

宝宝可以在地图上随意走动,当碰到坏人时会切换到与坏人交流的场景(类似于回合制游戏,你打我一下,我打你一下,不过这里是两个人对话交流),如果宝宝最终识破了坏人的伎俩,没有跟随坏人离去,则坏人从地图上消失,当当前关卡所有坏人全部消失时,游戏胜利。如果宝宝跟随坏人离去,则游戏失败,需要重新开始游戏。每个坏人随机采用一种内置的一种策略来尝试诱骗宝宝。

2.3.2. 联网模式

联网模式下玩家共有三种可选角色:baby(宝宝)、scoundrel(坏人)、referee(裁判)
在游戏中,其他人(如孩子父母,或者别人的父母)可以选择坏人角色进行诱骗宝宝角色,宝宝角色如果最终被坏人诱骗走,则坏人角色胜利;宝宝角色如果最终未被坏人诱骗走,则宝宝角色胜利。
对游戏中异常掉线的处理:宝宝角色异常掉线,则坏人角色胜利;坏人角色异常掉线,则宝宝角色胜利;裁判角色异常掉线,则坏人角色与宝宝角色平局。

2.4. 团队介绍

  • 团队名:童益
  • 团队Logo

3. 设计规范

3.1. 屏幕设计分辨率

  • 960*540

3.2. 游戏总场景地图大小

  • 1920*1080

3.3. 游戏具体场景地图大小

  • 960*540

3.4. IDE

  • Microsoft Visual Studio Enterprise 2019 版本 16.1.1
    VisualStudio.16.Release/16.1.1+28922.388
  • Microsoft Visual Studio Enterprise 2017
    版本 15.9.12
    VisualStudio.15.Release/15.9.12+28307.665
  • 说明:Debug模式采用VS2019,Release模式采用VS2017

3.5. 二维游戏引擎

  • Cocos2d-x v4.0
  • QE V2.0 for Baby’s_36_Skills
    说明:为了尽可能多地提升代码的复用性以及保持开发的简洁高效性,自主开发了Quick Engine

3.6. Tiled

  • Tiled for Windows (64-bit), snapshot Version08
    说明:为了增强兼容性,地图使用Tiled铺设,不用Cocos Studio

3.7. 服务器开发

  • 语言:Node.js v12.3.1
    库:nodejs-websocket 1.7.2
    mysql 2.17.1

3.8. 数据库

  • 数据库为关系型数据库
  • 数据库管理系统:MySQL Community Server version: 8.0.16
  • 数据库管理和设计工具:Navicat 12.0.18(64-bit)-Premium

3.9. 许可证

  • GUN GPL3.0
  • 许可概要:他人修改后源码后也必须开源并且新增代码要同样采用GUN GPL3.0许可证

3.10. 字体

  • 之前用的是 “HannotateSC-W5.ttf”,目前用的是用户自己系统的默认字体,即字体为""
  • 通过 QE_Font 这个宏来快速调用

3.11. 文档开发

3.11.1. 语言

  • markdown

3.11.2. 编辑器

  • VSCode 1.35.0 2019-06-04T01:17:12.481Z

3.11.3. VSCode插件

  • Markdown All in One 2.3.1 (2019.04.29)
  • Markdown Preview Enhanced 0.16.1
  • markdown-index 0.0.5

3.11.4. 文档图片

  • 托管于CSDN服务器

3.12. 操作系统

  • Windows 10 企业版LTSC操作系统
    Microsoft Windows版本1809(OS内部版本17763.529)
    Windows_NT x64 10.0.17763

4. 界面效果

4.1. 游戏入口

4.1.1. 资源加载界面

该界面用于展示小车跑动的动画,并在后台静默从硬盘读取游戏中需要用到的资源(如声音和图片)到内存中,以便于后续在游戏中能够快速加载资源。背后的原理就是硬盘的读取速度一般在数百MBPS,而内存的读取速度往往在数十GBPS,两者之间速度相差100倍左右。

4.1.2. 团队Logo展示界面

该界面用于展示团队的Logo与名称,该游戏开发团队名为童益

4.1.3. 主面板界面

该界面用户可以对游戏进行控制,比如选择进入单机模式或者进入联网模式,设置游戏以及关闭游戏。

4.1.4. 设置界面

该界面可以对游戏的背景音乐和音效进行设置

4.2. 单机版游戏界面

4.2.1. 主场景界面

效果图总览

具体玩家进入游戏后效果

4.2.2. 动物园场景界面

该场景有一个坏人,玩家可以通过摇杆来控制人物的位置和方向,当所操作的人物距离坏人比较近时,坏人会自动上前搭讪,对玩家进行诱骗。

4.2.3. 医院场景界面

该场景有一个坏人,玩家可以通过摇杆来控制人物的位置和方向,当所操作的人物距离坏人比较近时,坏人会自动上前搭讪,对玩家进行诱骗。

4.2.4. 商店场景界面

该场景有一个坏人,玩家可以通过摇杆来控制人物的位置和方向,当所操作的人物距离坏人比较近时,坏人会自动上前搭讪,对玩家进行诱骗。

4.2.5. 学校场景界面

该场景有一个坏人,玩家可以通过摇杆来控制人物的位置和方向,当所操作的人物距离坏人比较近时,坏人会自动上前搭讪,对玩家进行诱骗。

4.2.6. 坏人诱骗场景界面

游戏中坏人通过与宝宝对话进行诱骗,坏人发言完毕后,宝宝可以选择是否听从坏人的要求。

如果宝宝识破坏人,则展示坏人已被赶跑的界面。

如宝宝未识破坏人,则展示坏人已抓走宝宝的界面。

4.3. 联网版游戏界面

4.3.1. 连接服务器界面

该界面向用户展示默认的服务器列表,玩家可以选择适合的服务器。Coco’s Server是我的电脑搭建的服务器,IP用的是校园网IP,用户如果想要与我的服务器进行通信必须和我在同一个网段下,即也必须连接校园网,否则找不到我的服务器。本地服务器是本机的IP,需要在本机运行服务器程序。考虑到用户可能来自世界各地,因此在设计该界面时也允许用户自定义输入并设置服务器的IP地址和端口号。

连接成功后会向用户发送“已与服务器:ws://ip:port/成功建立连接,马上为您转入登录界面。”的通知。

重复连接通知

4.3.2. 登录界面

该界面含用户名输入框、密码输入框以及登录和注册选项

点击用户名输入框之后的效果

点击密码输入框之后的效果

如未输入用户名,则没法登录成功

如未输入密码,则没法登录成功

如密码与用户名不匹配,则没法登录成功

如用户所输入的用户名不存在,则没法登录成功

如用户输入的用户名与密码正确,则成功登录

4.3.3. 注册界面

该界面包含用户名输入框,密码输入框以及确认注册的选项

如用户未输入用户名,则无法成功注册。

如用户不输入密码,则无法成功注册。

如用户所填写的用户名已被其他人占用,则无法成功注册。

如用户填写的信息无误,则成功注册。

4.3.4. 显示房间列表界面

该界面用于展示当前服务器上所有玩家已经创建好的房间。
如当前服务器上没有玩家创建过房间,则提示用户“请创建房间”。

如当前服务器上已有玩家创建好的房间,则提示用户可以选择加入其他人创建好的房间。

在房间列表中,用户可以点击某个房间看下当前房间是否可以选择。
当前房间不可选择。

当前房间可以选择。

4.3.5. 创建房间界面

该界面包含房间名输入框、房间密码输入框、确认创建按钮。

如用户未输入房间名,则无法成功创建房间。

用户的输入信息经系统检查无误后,会提示用户创建房间成功。

4.3.6. 加入房间界面

该界面包含房间名输入框、房间密码输入框、确认加入按钮。

如用户未输入房间名,则无法成功加入房间。

如用户输入的房间名不存在,则无法成功加入房间。

如用户的输入信息无误,则提示成功进入房间。

4.3.7. 选择角色界面

该界面向用户展示房间名并包含选择角色的选项、返回按钮、确认选择按钮。
在该界面用户可以选择自己的身份,可供选择的身份有:宝宝、裁判、坏人。

如用户未选择角色,则没法成功选择角色。

如用户选择的角色已被房间内的其他玩家选择,则没法成功选择角色。

如用户操作无误,则提示用户已成功选择此角色。

4.3.8. 等待所有玩家全部就绪界面

宝宝角色已准备就绪界面

宝宝角色、裁判角色已准备就绪界面

宝宝角色、坏人角色已准备就绪界面

4.3.9. 游戏对战比拼界面

该界面用于展示用户的聊天信息,当前谁获得发言权的图标。还包含聊天信息输入框、返回按钮、发送信息按钮。

每人输入聊天信息并发送后都有一个可以选择是否结束发言的界面。如果选择否,则可以继续发言。

宝宝角色和坏人角色如果选择发言结束结束,则发言权立即转给下一个角色。如果裁判玩家选择发言结束则可对本局游戏进行判定。如果通过坏人与宝宝的聊天记录,发现宝宝以上当,则判断坏人胜利,如果发现坏人根本无法成功诱骗宝宝,则判断宝宝胜利,如果暂时还无法判定,则可以选择继续对战的选项。

4.3.10. 游戏比拼结束界面

如果在游戏中裁判判定宝宝角色胜利或者坏人角色异常掉线,则系统判定宝宝获胜。

如果在游戏中裁判判定坏人角色胜利或者宝宝角色异常掉线,则系统判定坏人获胜。

如果在游戏中裁判角色异常掉线,则系统判定本局扮演宝宝角色的玩家与扮演坏人角色的玩家获胜。

5. 实现细节

  • 服务器端用Node.js语言开发,主要用到了"nodejs-websocket"库
  • 客户端的用C++基于Cocos2d-x和QuickEngine二维游戏引擎开发,Cocos2d-x封装了WebSocket模块,我开发的QuickEngine基于rapidjson也提供了快速序列化与反序列化json对象的接口,这样在客户端与服务器端进行通讯时可以使用json数据进行通讯了。
  • 另外我找到了一种高效快速完美解决C++在显示中文乱码的问题,主要就是源码采用UTF-8编码保存,然后在源码文件的开头处写一句让C++编译器以UTF-8编码解析源码。具体参考:https://blog.csdn.net/COCO56/article/details/91350176
  • C++ 获取UTF-8字符串中的字符个数以及将字符串中的字符全部提取出来再以字符为单位保存在向量中,具体参考:https://blog.csdn.net/COCO56/article/details/91457885
  • 数据库为关系型数据库,数据库管理系统为MySQL,数据库管理和设计工具为Navicat

5.1. 数据库设计

建一个数据库:baby’s 36 skills并在其中建三张表:accouts, players(暂未使用), rooms(暂未使用)

5.1.1. accounts表

accounts表存储所有用户的信息,username为用户名,password为密码

5.2. 服务器与客户端之间的通讯事件

  • 服务器与客户端使用json进行数据交互

共有以下事件:

	enum Event {
		//编码规范:用一个数字编码可能出现的所有事件
		ConnectServer = 1, //连接服务器事件
		SignIn = 2, //登录事件
		SignUp = 3, //注册事件
		GetRooms = 4, //获取房间列表事件
		CreateRoom = 5, //创建房间事件
		JoinRoom = 6, //加入房间事件
		SelectRole = 7, //选择角色事件
		Waiting = 8, //等待所有玩家就绪事件
		Dialog = 9, //对话事件
	};

共有以下情况:

	enum Status {
		//编码规范:用三个数字编码可能出现的所有状态,第一个数字代表事件类型,第二个数字代表造成该事件成功或失败的原因/情形/情况种类,第三个数字代表事件最终状态:0代表失败,1代表成功。
		//ConnectServer = 1, //连接服务器事件
		ConnectServerCase1Successful = 111, //连接服务器成功,成功原因:成功建立WebSocket
		ConnectServerCase2Failed = 120, //连接服务器错误,错误原因:已经在建立WebSocket过程中,请耐心等待响应结果
		ConnectServerCase3Failed = 130, //连接服务器错误,错误原因:在其他界面与服务器断开连接
		//SignIn = 2, //登录事件
		SignInCase1Successful = 211, //连接服务器成功,成功原因:成功建立WebSocket
		SignInCase2Failed = 220, //用户名为空
		SignInCase3Failed = 230, //密码为空
		SignInCase4Failed = 240, //用户名不存在
		SignInCase5Failed = 250, //用户名对应多个账户
		SignInCase6Failed = 260, //执行查询用户名的SQL语句时出现未知异常
		SignInCase7Failed = 270, //密码错误
		SignInCase7Successful = 271, //登录成功

		//SignUp = 3, //注册事件
		SignUpCase1Successful = 311, //连接服务器成功,成功原因:成功建立WebSocket
		SignUpCase2Failed = 320, //创建账号失败,用户名不能为空,请重填。
		SignUpCase3Failed = 330, //**创建账号失败,用户名不能全是数字,请重填。
		SignUpCase4Failed = 340, //**创建账号失败,昵称不能为空,请重填。
		SignUpCase5Failed = 350, //创建账号失败,密码不能为空,请重填。
		SignUpCase6Failed = 360, //创建账号失败,请重填用户名,因为您的用户名已被其他人占用。
		SignUpCase7Failed = 370, //创建账号失败,您输入的信息包含非法字符,这是本不应该出现的SQL指令错误,请联系开发维护人员。
		SignUpCase8Failed = 380, //创建账号失败,在正式插入您的账号信息到数据库时遇到未知错误,这种错误理论上很难碰到,请联系开发维护人员。
		SignUpCase8Successful = 381, //创建账号成功,恭喜您注册成功,请返回登录。

		//GetRooms = 4, //获取房间列表事件
		GetRoomsCase1Successful = 411, //连接服务器成功,成功原因:成功建立WebSocket,请加入房间。
		GetRoomsCase2Failed = 420, //请创建房间。
		//CreateRoom = 5, //创建房间事件
		CreateRoomCase1Successful = 511, //连接服务器成功,成功原因:成功建立WebSocket,请输入您所要创建房间的名称和密码
		CreateRoomCase2Failed = 520, //创建房间失败,房间名不能为空,请重填。
		CreateRoomCase3Failed = 530, //创建房间失败。\n在正式插入您的账号信息到数据库时遇到未知错误。\n应该是服务器硬盘没空间了,请联系开发维护人员。
		CreateRoomCase3Successful = 531, //恭喜您创建房间成功。\n马上为您转入选择角色界面。
		//JoinRoom = 6, //进入房间事件
		JoinRoomCase1Successful = 611, //连接服务器成功,成功原因:成功建立WebSocket,请输入您所要加入房间的名称和密码
		JoinRoomCase2Failed = 620, //进入房间失败,房间名为空
		JoinRoomCase3Failed = 630, //进入房间失败,房间名不存在
		JoinRoomCase4Failed = 640, //进入房间失败,房间密码错误
		JoinRoomCase4Successful = 641, //进入房间成功
		//SelectRole = 7, //选择角色事件
		SelectRoleCase1Successful = 711, //此状态为默认在连接服务器成功的情况下,即使正在建立WebSocket
		SelectRoleCase2Failed = 720, //该玩家未选择角色
		SelectRoleCase3Failed = 730, //该玩家所选的角色已被其他玩家选择
		SelectRoleCase3Successful = 731, //该玩家成功选择角色
		//Waiting = 8, //等待所有玩家就绪事件
		WaitingCase1Successful = 811, //此状态为默认在连接服务器成功的情况下,即使正在建立WebSocket
		WaitingCase2Failed = 820, //宝宝玩家已离开
		WaitingCase2Successful = 821, //宝宝玩家已加入
		WaitingCase3Failed = 830, //坏人玩家已离开
		WaitingCase3Successful = 831, //坏人玩家已加入
		WaitingCase4Failed = 840, //裁判玩家已离开
		WaitingCase4Successful = 841, //裁判玩家已加入
		//Dialog = 9, //对话事件
		DialogCase1Successful = 911, //连接服务器成功,成功原因:成功建立WebSocket	
		DialogCase2Successful = 921, //轮到坏人玩家发言
		DialogCase3Successful = 931, //轮到宝宝玩家发言
		DialogCase4Successful = 941, //轮到裁判玩家发言
		DialogCase5Successful = 951, //裁判玩家已判决本轮游戏或者某玩家异常掉线,本轮游戏结束
		DialogCase6Successful = 961, //坏人玩家发言了
		DialogCase7Successful = 971, //宝宝玩家发言了
		DialogCase8Successful = 981, //裁判玩家发言了
	};

5.3. 联网游戏流程介绍

  1. 玩家先注册或登录账号
    注册时需要提供用户名和密码
    登录时提供用户名+密码即可
  2. 创建或加入房间
  3. 等待其他玩家全部就绪
  4. 开始游戏后玩家可以开始比拼

5.4. 游戏玩法介绍

坏人使用言词对宝宝进行诱骗,宝宝可以选择是否跟随坏人离去
为了保证结果的客观性,在每一轮的交互式结束时由第三方的监察者对结果进行判断。
在每一轮中:坏人向宝宝发送诱骗言辞
宝宝有两种选择,第一种跟随坏人离去,第二种不跟随坏人离去
第三方的裁判在每一轮的交互结束后可以宣布三种结果:一宝宝胜,二坏人胜,三继续比拼

	//游戏资源加载场景
	//scene = ResourceLoadScene::createScene();
	//Logo展示场景
	//scene = LogoScene::createScene();
	//游戏主面板界面
	//scene = GameInterfaceScene::createScene();
	//scene = MapOne::createScene();
	//scene = MapTwo::createScene();
	//scene = Battle::createScene();

	//连接服务器界面
	//scene = ConnectServerScene::createScene();
	//登录界面
	//scene = SignInScene::createScene();
	//注册界面
	//scene = SignUpScene::createScene();
	//获取房间界面
	//scene = GetRoomsScene::createScene();
	//创建房间界面
	//scene = CreateRoomScene::createScene();
	//加入房间界面
	//scene = JoinRoomScene::createScene();
	//选择角色界面
	//scene = SelectRoleScene::createScene();
	//等待网络游戏开始界面
	//scene = WaitingNetworkGameScene::createScene();
	//网络游戏界面
	//scene = NetworkGameScene::createScene();
	//网络游戏结束界面
	//scene = NetworkGameOverScene::createScene();
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页