《键盘侠的末日之战》上线分享

游戏部分截图:

[加载场景.GIF]

[匹配场景.GIF]

[单人模式.GIF]

游戏二维码:

[微信小游戏二维码]

做这款游戏的初衷和引擎选择:

    我之前一直做的是后端 java 开发和项目实施的工作,刚开始接触到手机小游戏
是微信的《跳一跳》,当时在微信上玩的时候觉得还蛮有意思。后来就想着能不能
自己做一款游戏,因为工作的时候时常也会被拉去做前端,对 JavaScript 还算是比
较顺手的。对比选了一遍游戏引擎,最后选择了cocos creator。选择它是因为官方
文档、教程和论坛氛围都很不错,其中最赞的是论坛的活跃度一直很高,平时遇到
的问题在上面一般都能找到答案,这个对于初学者来说真的不能再好了。(怎么说
呢,来社区就像回家一样,里面个个都是人才,说话又好听。)

项目结构:

前端:Cocos Creator v2.1.3 (TypeScript)
    模块使用:
        1、crypto-js (http 请求内容 AES 加密)
后端:腾讯云函数 SCF (nodejs)
    设计接口包括:
        1、设备注册统计
        2、在线人数统计
        3、游戏人数统计
        4、匹配人数统计
同步:腾讯小游戏联机对战引擎 MGOBE (实时服务器:nodejs)
    使用同步接口类型:
        1、帧同步接口
        2、实时服务器接口
数据库:MongoDB (部署在腾讯云服务器 CVM)
    储存数据类型:
        1、设备数据
        2、在线数据
        3、游戏数据
        4、匹配数据
        5、缓存数据
美术资源:Aseprite
音频资源:
    音频来源:
        1、小森平 [https://taira-komori.jpn.org/freesoundtw.html]
        2、FL Studio 12 [https://www.flstudiochina.com/]

为何选择这样的结构:

     因为之前腾讯云有活动,买了一个比较便宜的云服务器来玩。型号是:标准
型S2,配置是:1核 2GB 1Mbps。平用来挂个人站点[http://www.dobeone.com]
是完全够用的,1Mbps 的理论上限网速有 128KB/s。在我把 nodejs 写的后台逻
辑放到上面运行后发现QPS实在是低的可怜,下面是 jmeter 压测截图:


[云服务器 jmeter 服务器截图]

    这种情况下服务器的资源使用情况很低,限制服务 QPS 的因素是低带宽引起
的,下面是服务器资使用情况截图,可以看出带宽限制了性能:

[服务器运行内存和 cpu 频率截图]

    对于个人开发者来说单纯提升服务器配置的话,这个费用是很不划算的。所有我
就想着能不能曲线救国,在查看文档得知腾讯云的产品可以通过内网服务进行访问,
我nodejs写的逻辑也能通过放置在云函数上运行,本地测试空跑也就能到100多的并
发,可能是走的腾讯 Api 网关有限制不是很理想,在部署到云函数上后 jmeter 压
测的 QPS 提升到90多,下面是压测截图:(凑合着用呗,反正免费额度也很香的)


[云函数 jmeter 云函数截图2]

    服务器的资源使用情况也能得到提升,下面是服务器的资源使用情况截图,可以
资源占用下降了,以后扩展的话应该性能也能满足:

[服务器运行内存和cpu频率截图2]

    为什么选择 MGOBE 而不是用 nodejs 写的 websocket 服务来实现游戏的逻辑呢,
首先是因为上面说到的低配置的服务器导致的带宽瓶颈外。还因为这是我第一次写
游戏的后台逻辑,有很多游戏逻辑的思考不到位导致一些不可避免的 bug ,下面的
第一个 node 版本的本地 jemeter 压测截图(已经放弃):


[websocket 的 Jemeter 压测截图3]

    服务器的资源占用情况如下,如果和 http 服务的脚本竞争 1Mbps 带宽的话效
率就更低了。

[服务器运行内存和cpu频率截图3]

    还有就是自己再写游戏后端逻辑的话游戏的开发流程会比较长,最后认清了显示放
弃了幻想。加上 MGOBE 现在的收费标准还是很划算的,加上实际使用下来服务效率
和稳定性也不错,就采用了它。我当时建立项目的时候 cocos 还没有在编辑器集成腾
讯云相关的产品,所有我下面介绍的方式是和 cocos 官网文档的方式是有所不同的,
但原理是一致的。
    然后剩下来的云服务器可以运行 MongoDB 数据库,用来保存一些用户数据和缓
存。最终就是样的一个项目架构了:

[项目架构图]

云函数 SCF 在项目中的使用:(api网关)

    创建SCF选择运行环境:Nodejs 8.9,创建方式选择:模板函数,选择示例:A
PI 网关基础示例。高级设置中网络配置记得勾选:公网访问和私有网络。具体截图
如下:


[云函数创建截图]

    添加触发器:API 网关触发器,用于 http 访问触发该函数。记得勾选:启用集成
响应,网关对响应进行解析。以及在参数配置添加相应的路径,如果是创建完成后
添加记得在服务信息页面发布改动才会生效。配置截图如下:


[触发器创建截图]

    API 网关基础主要逻辑在目录下 index.js 文件中的 main_handler 函数中实
现。SCF 文档 [ https://cloud.tencent.com/document/product/583/11060 ]包含
三个参数:

	1、event:包含触发事件数据,API 网关模式则包含请求的 http 信息。
	  主要使用其中的:
		1、event.httpMethod:HTTP 请求方法
		2、event.body:PSOT 方式访问时传输的数据
		3、event.queryString:GET 方式访问传输的数据
		4、event.pathParameters:用于匹配参数配置中配置的数据
		  结构:
			pathParameters: 
				{ 
					配置的参数名: 匹配到的参数,
					... 
				}
	2、context:包含云函数程序运行时的信息。
	3、callback:将的信息返回给调用方,nodejs 8.9 版本可以使用 return 关
	键字返回。
	  示例:
		callback(Error error, Object result)

[目录结构截图]

    创建成功后会得到一个接口,但是这个接口会比较长,如果要改成自定义的地址
可以在云函数用的 API 网关中修改,微信使用的 https 协议需要申请腾讯免费的SSL
证书就可以了地址[ https://buy.cloud.tencent.com/ssl ],只需要在域名解析添加指向
此服务的二级域名即可。下面是对应的截图:


[自定义域名截图]

    全部流程下来后的接口在 Postman 请求结果如下截图:


[postman 请求截图]

游戏框架 MGOBE 在项目中的使用:

    因为项目创建的时候 cocos creator 还没有自带 MGOBE ,所以使用的时候是
去腾讯云官网申请的,他们的原理都是相通的。这里就只记录自行申请的过程。
腾讯云的申请地址[ https://console.cloud.tencent.com/minigamecloud ],下面是
申请截图:


[腾讯云控制台的MGOBE申请页面]

    匹配规则我使用的是:1v1v1v1,的四人匹配规则。匹配规则的文档地址
[ https://cloud.tencent.com/document/product/1038/34952 ],因为这个游戏
的匹配限制没有那么复杂,使用的只有最简单设置,下面是我使用的匹配
规则:

	{
		"version": "V1.0",
		"teams": [
			{
				"name": "1v1v1v1",
				"maxPlayers": 4,
				"minPlayers": 4,
				"number": 1
			}
		]
	}

    SDK 地址[ https://cloud.tencent.com/document/product/1038/33406 ]
,下载解压后导入文件:MGOBE.js 和 MGOBE.d.ts ,到项目需要的目录
中。在使用到的地方导入即可:
        import “…/XX/MGOBE.js”;
    校验是否导入成功:
        cc.log(MGOBE.ErrCode.EC_OK) //输出 0 导入成功
    项目中使用到的 MGOBE SDK 函数记录:

	1、函数:MGOBE.Listener.init: SDK 初始化
		参数:
			gameInfo:
				gameId: 使用控制台页面上的“游戏ID”
				openId: 可以用玩家的用户ID代替
				secretKey: 使用控制台页面上的“游戏Key”
		参数:
			config:
				url: 使用控制台页面上的“域名”
				reconnectMaxTimes: 重连接次数
				reconnectInterval: 重新连接时间间隔
				resendInterval: 消息重发时间间隔
				resendTimeout: 消息重发超时时间
				isAutoRequestFrame:是否自动补帧
	2、MGOBE.Room.getMyRoom:查询玩家所在的房间信息
	3、MGOBE.Room.matchPlayers:多人在线匹配
		参数:
			matchPlayersPara
				playerInfo:玩家信息
					name: 玩家昵称
					customPlayerStatus: 自定义玩家状态
					customProfile: 自定义玩家信息
					matchAttributes: 匹配属性
				matchCode:匹配编码(在匹配规则集子页面取得)
	4、MGOBE.Room.onMatch: 匹配结束广播,监听匹配结果
	5、MGOBE.Room.cancelPlayerMatch:取消玩家匹配
		参数:
			cancelMatchPara: 匹配类型
				matchType: [
					MGOBE.ENUM.MatchType.ROOM_SIMPLE:房间匹配
					MGOBE.ENUM.MatchType.PLAYER_COMPLEX:玩家匹配
				]
	6、MGOBE.Room.startFrameSync:开启帧同步
	7、MGOBE.Room.sendFrame:发送帧同步数据
		参数:
			SendFramePara:发送帧数据参数
				data:帧数据
	8、MGOBE.Room.onRecvFrame:房间帧消息广播回调接口
	9、 MGOBE.Room.sendToGameSvr:发送消息给实时服务器
		参数:
			SendToGameSvrPara:发自定义服务消息参数
				data:消息内容
	10、MGOBE.Room.onRecvFromGameSvr:收到自定义服务消息广播回调接口
	11、MGOBE.Room.leaveRoom:退出房间
	12、MGOBE.Room.onUpdate:房间信息发送变化,这种变化原因包括各种房间
	操作、房间广播、本地网络状态变化等。

MGOBE 框架中实时服务器的使用:

    使用实时服务器的目的:为了保存当前游戏场景中人物节点(玩家和僵尸)的状
态数据,为了在玩家断线重连时提供当前游戏所有人物节点的状态数据。如果依靠其
他玩家发送所有人物节点数据来进行同步,可能存在发送的数据本身数据就偏差的情
况。或者是获取所有的帧同步数据补帧重计算结果的话,又存在数据量太大加载耗时
过大的问题存在。
    SDK 下载地址[ https://cloud.tencent.com/document/product/1038/35044 ],下载解
压后的目录结构如下图:


[实时服务器目录结构]

    项目使用到的函数记录:

	函数:
	1、onInitGameServer:服务器初始化时调用,可以在调用时初始化腾讯云开发
		(TCB)对象
	2、mgobexsCode:自定义服务的入口
	  属性:
		logLevel: 表示开发者代码内使用 ActionArgs.SDK.logger 时的日志
			打印级别
		logLevelSDK: 实时服务器内部日志的打印级别
		gameInfo: 实时服务器信息
			gameId: MGOBE服务游戏ID,从控制台获取
			serverKey: MGOBE服务后端密钥,从控制台获取
		onInitGameServer:类型为 function,该函数在实时服务器初始化后会被
			调用
		gameServer:实时服务器接口
	3、GameServer.IGameServer:实时服务器接口
		属性:
			mode:实时服务器处理客户端消息的模式
				[
					"sync":当 mode 为 "sync" 时,实时服务器将使用同步
						模式处理客户端消息。开发者在 onRecvFromClient 
						回调中必须显式调用SDK.exitAction 方法,实时服务
						器才能处理下一条 onRecvFromClient 广播。
					"async":当 mode 为 "async" 时,实时服务器将使用异
						步模式处理客户端消息。每次监听到 
						onRecvFromClient 广播时都将执行回调函数。
				]
			onInitGameData:收到任意广播时检查 gameData,为空时先执行它
				再执行广播回调函数,需要返回一个对象作为gameData
			onCreateRoom:创建房间广播回调接口
			onRecvFromClient:接收玩家消息回调接口
	4、ActionArgs:用于接收参数的模板类型
	  属性:
		sender:在 onRecvFromClient 中有效,为发送者的玩家ID
		actionData:回调的响应数据
		gameData:游戏数据,用来实现游戏状态同步等功能
		room:当前房间信息
		exports:用于更新游戏数据 gameData,exports.data 属性可以用于重
			新给 gameData 赋值
		SDK:包含了一系列实时服务器提供的方法

数据库 MongoDB 在项目中的使用(docker):

    为什么选用 MongoDB 这个 nosql 数据库,一、不需要复杂的查询逻辑,只做简单
的保存和读取。二、对我那个小胳膊小腿的服务器比较友好。为什么 docker 部署,一
、安装方便,从现有仓库中获取需要的安装的版本即可。二、转移和扩展都比较方便,
从一个服务器移到另一个服务器使用容器镜像服务会比较方便,再加上现在腾讯云
[ https://cloud.tencent.com/product/tcr ]和网易云[ https://www.163yun.com/product/repo ]
的免费镜像服务。安装参考[ https://www.runoob.com/docker/docker-install-mongodb.html ]
,如果要将 MongoDB 的数据文件写入当前主机目录的 db 文件夹的话可以在安装时选择
运行下面的脚本:

		docker run -itd --name myMongo -p 27017:27017 -v $PWD/db:/data/db -d  mongo:latest --auth 

    直接使用超级管理员账户的话会存在隐患,所以可以为当前应用创建对应的用
户,以及分配相应的权限,可以参考以下脚本:(去掉注释,#号行)

		#进入运行的容器
		docker exec -it myMongo mongo admin 
		#切换超级管理员数据库
		use admin 
		#认证管理员账户,使用安装时设置的超级管理员账户
		db.auth('adminUser','adminPassword') 
		#为新用户建立数据库,根据需求设置数据库名称
		use newUserDatabase
		#创建新用户,添加权限控制角色和写入和读取的权限角色
		db.createUser({ 										
			user:'newUser',										
			pwd:'newUserPassword',								
			roles:[ 											
				{ role:'dbAdmin', db: 'newUserDatabase'}, 		
				{ role:'readWrite', db: 'newUserDatabase'}		
			]}
		);
		db.auth('newUser', 'newUserPassword')
		#认证新创建的用户,返回 1 说明新增成功

    为了提示查询的提高查询的效率,需要为查询字段设置索引。创建脚本如下:

		#切换到指定数据库
		use newUserDatabase
		#查看查看已有集合										
		show collections										
		#按升序创建索引设置 1,按降序来创建索引设置 -1 
		db.getCollection('game').createIndex({"userId":1}) 		

    可以通过设置索引参数来限定集合的生存时间来控制缓存数据和匹配数据在数

		#查看查看已有集合							
		show collections
		db.cache.createIndex({"time":1}, {expireAfterSeconds: 10})
		# 设置索引的 timer 字段在插入数据时必须保存日期时间才能生效,过期
		时间单位为秒

    为什么设置缓存,当前是对一段业务逻辑的处理结果做数据的缓存,可以减少对
相对数据集合的查询操作,提升访问速度。必须注意的是做了缓存后真实的数据会有
误差,比如当前在线人数就可能是缓存时间前的在线人数。缓存逻辑如下:


[缓存逻辑图]

匹配场景和游戏场景的逻辑:

    当前版本的匹配场景只做了单人匹配,没有加入建立房间和组队匹配的机制。单
人匹配时需要携带当前的玩家信息,匹配成功后用于获取匹配到的玩家信息。匹配成
功后需要获取实时服务器初始化的游戏对局数据,才能加载游戏场景。下面提供当版
本的单人匹配逻辑图,以供参考:


[匹配场景逻辑图]

    游戏场景中需要判断当前玩家进行的是单人模式还是匹配模式。如果是匹配模式
需要在游戏开始前进行实时对局数据的同步、游戏时间进程的同步。匹配模式中玩家
的移动操作和技能释放都需要走帧同步接口,接受到帧同步数据后对人物节点进行操
作。在帧同步操作时还需要判断当前帧与上一帧的间隔时间,或者是否帧同步回调中
断,如果发送间隔时间过大或者回调中断则判定为网络异常断开了连接。当网络重新
连接后需要再一次的同步实时服务器的对局数据才可以进行帧同步操作。为了同步人
物状态,匹配模式中还需要对比当前帧的对局数据与上一帧对局数据的差异,将差异
的数据同步到实时服务器。下面是帧同步逻辑图和游戏场景逻辑图:

[帧同步逻辑图]


[游戏场景逻辑图]

帧同步的浮点数限制和运行误差限制:

    帧同步传输数据中涉及浮点数的只有二维位置坐标和二维方向向量,在这个项目
中对浮点数进行的限制,只传输包括小数点后六位的浮点数。
    网络传输数据的稳定性是不完全可靠的,那怎么才能保证的同步当前的游戏状态
的有效性避免误差呢,下面是这个项目中使用的几个思路:
        1、重现案发现场:
                当操作需要同步时发送与操作相关联的属性信息,比如向某坐标移动则
            携带当前坐标和目标坐标、受到攻击时携带受到攻击时的生命值等…这些
            数据要有助于重现案发现场。
        2、多方报告:
                为了避免网络波动造成的数据同步异常,则需要对一些非玩家主动输入
            的操作(如玩家摇杆控制的移动或武器瞄准等操作)做帧同步的发送,这时
            你就会受到所有网络正常玩家发送来的同一条操作,这时候你就要根据当前
            人物的属性和案发的属性判断是否执行次操作,如果不是案发属性操作则摒
            弃。这个操作适合玩家受攻击同步、僵尸仇恨目标等同步操作类型。
        3、保存备份:
                为当前的所有人物属性建立一个当前状态的参考系,在 update 函数
            中判断当前帧的人物属性和参考系的人物属性是否有差异,存在差异时则同
            步差异属性到实时服务器,本项目中同步频率为10帧(0.1s/次)。
        4、亡羊补牢:
                发生网络波动帧同步回调间隔时间超过阈值,则判断当前场景数据为不
            可靠的,需要重新请求实时服务器中保存的备份数据,以当前实时服务器数
            据为准。

游戏框架 MGOBE 在实际中使用遇到的问题:

    因为是第一次使用 MGOBE(v1.3.0) 框架,使用的时候也是参考着文档和官方
的案例来的,在使用的过程遇到一些问题和注意事项,下面是我的记录和解决方案:
        1、初始化完成后再次初始化回调不触发:
                在使用 MGOBE.Listener.init 初始化SDK后再次调用,如果已经完成
            初始化后则不触发回调。可以将初始化的结果使用一个全局变量来保存,作
            为初始化成功的判断依据。
        2、存在小概率的匹配成功不返回结果:
                在使用 MGOBE.Room.onMatch 监听匹配结果回调时会有小概率的匹配
            成功不触发情况,可能是因为网络波动的原因。所以我做了双保险的监听匹
            配结果,再使用 MGOBE.Room.getMyRoom 做一定间隔时间的轮询操作,用
            以获取玩家所在的房间,如果获取到则判断匹配成功。
        3、存在极小概率的取消匹配成功但是实际已经匹配成功:
                在使用 MGOBE.Room.cancelPlayerMatch 取消匹配时,有极小的几
            率发生返回取消匹配成功状态码,但是其余玩家却匹配到这个玩家的情况。
            这个异常发送的几率极小,我只遇到过一次,难以重现我选择忽略了。
        4、本地网络变化触发延迟:
                使用 MGOBE.Room.onUpdate 做本地网络异常的判断是不可靠的,可
            以在帧同步回调 MGOBE.Room.onRecvFrame 中记录时间戳用作间隔时间参
            考,当时间间隔过大时可以判断网络发送的波动。
        5、帧同步数据发送间断情况:
                这个项目使用的帧同步帧数是15帧(≈0.067s/次),因为项目运行中
            会存在游戏帧数的波动,如果发送数据的帧率和帧同步的帧率一致的话,会
            因为游戏帧数波动导致帧同步间断一帧的情况出现。这个情况和游戏帧数波
            动的剧烈程度成正比。所以在项目中使用的发送数据帧数是20帧(≈0.05s)
            ,多出来的帧数据进行屏蔽或覆盖处理。这个适用于连续的用户输入比如玩
            家的移动摇杆、武器瞄准摇杆等连续性较高的操纵。

Cocos Creator 使用中遇到的问题:

    在使用 Cocos Creator 开发的时候也遇到了一些问题,记录一下:
        1、一直打开使用编辑器不关闭的话内存占用会越来多,维度是几天这样
        子。因为重新打开的话时间点长,没办法电脑配置比较不如人意。(不要学我)
        2、编辑器的异常问题,一般出现在编辑器卡顿崩溃后。按照出现的异常信
        息提示在论坛都能找到解决方案。
        3、刚体同样数独下移动在低配置手机运行时因为帧数下降和波动的原因会
        和没有波动的手机移动的位置是不一样的。因为移动也是需要时间的嘛,帧数波
        动是因为手机性能的原因导致的,所以我在这个项目中人物的移动是通过移动坐
        标实现的:

            //相对与60帧(0.01666s/次)的移动增量
            this.moveVec=this.moveVec.mul(dt/0.01666*this.speed)
            this.node.position=this.node.position.add(this.moveVec)

软件著作权遇到的问题:

    我的软著是自己申请的,除了打印文档和邮递到北京的快递费外没有花其余的钱
。代理的我没有买过他们的服务,整个代理的流程我不熟悉,下面我只记录自己申请
的历程:
    官方对申请的文档在登记指南[ http://www.ccopyright.com.cn/index.php?optionid=1080 ]
中是有要求的:
        1、源程序和文档应提交前、后各连续30页,不足60页的,应当全部提交。
        2、在源程序和文档页眉上标注了所申请软件的名称和版本号,右上角应标注页码。
        3、源程序每页不少于50行,最后一页应是程序的结束页。
        4、文档每页不少于30行,有图除外。
    既然官方给出了要求,就要安装他的要求来办事。文档的要是少的话可以添加游戏
截图,要是没有图片的话正文一定要到30行才行。还有程序源码的50行,可以参考这个
博文设置行数[ https://blog.csdn.net/qq_33742119/article/details/80390638 ]。打印前要
是怕格式错乱的话,可以另存为PDF文件再打印。
    申请表的填写需要中,软件功能和技术特点的填写可以参考如下:
        1、硬件环境:
            移动端:处理器主频在1GHz及以上、运行内存在1G及以上和存储空间在
            8G及以上的可联网智能手机。
            pc端:处理器主频在1GHz及以上、运行内存在1G及以上和磁盘空间在8G
            及以上的可联网电脑主机。
        2、软件环境:
            移动端:搭载Android 8及以上或者iOS 10及以上操作系统的智能手机。
            pc端:搭载包含Windows 7及以上或者MacOS 10及以上操作系统的电脑主机。
        3、主要功能和技术特点:(来一波商业吹嘘)
                游戏软件使用Cocos Creator框架开发,程序运行更稳健、高效。
            使用TypeScript语言编写带来更友好的程序阅读性,减低项目维护成
            本。采取用虚拟摇杆输入操作方式使得游戏更具手感,方便的操作降低
            了游戏上手难度。游戏场景统一采用像素画风绘制,提升整体游戏画面
            质感。游戏模式有单人模式与匹配模式,能给玩家带来更多的游戏模式
            选择。帧同步使用腾讯小游戏联机对战引擎(MGOBE),为游戏提供了低延
            迟和高性能的联机对战体验。
    按照要求将需要的申请表、身份证复印件、程序源码、操作文档发到指定地址就好
了,因为深圳管理中心的因为疫情没有接受软件申请也是没办法。剩下的只有漫长的等
待了。下面是微信公众号上的受理流程截图:


[受理流程截图]

    为什么时间花费会那么久,说起这个又是一把辛酸泪。我打电话问过客服,受理前
要排4-5周的队,然后受理之日起30个工作日。然后北京管理中心因为疫情的原因受理
审批发证都是实行轮岗,人手不足。官网说5月份登记突破14万件,只能含着泪缓缓打
出:理解。在经过漫长的等待后2020年7月11号才收到挂号信。

上线微信小游戏遇到的问题:

    关于自审报告,我在论坛找了很多,最后找的都有点迷糊了。不过最后我在提交的
时候看到了官方给出的范例,于是我觉得按照官方的来,下面是范例:


    审核的表单还需要苹果开发者账号,反正以后也要用到的,就去注册了一个,下面
是注册地址:
        [ https://developer.apple.com/cn/programs/enroll/ ]

    然而初版审核不通过,提示信息:
            你的小游戏在用户自定义昵称、聊天室、个人资料签名、个人空间描述等场
        景,未具备过滤政治有害、色情、赌博违法、违规等不当信息的机制,请接入微
        信公众平台内容安全API(imgSecCheck、msgSecCheck),以及通过其他技术
        或人工审核手段,对于检测结果有害的内容,请及时清理或拦截,确保小游戏提
        供内容及用户产生内容符合相关法律法规的要求。

    吐槽一下:
            很魔幻的是这个官方的 msgSecCheck API ,我测试了一些绞尽脑汁想到的色情
        词汇竟然能够通过,我惊了。为了避免被投诉我又添加了一道自己的正则验证逻辑,再
        一次提交审核就通过。

项目存在的不足:

    我完成游戏的过程就是一个幻想与妥协的过程,因为技术也因为成本,最后做出
来的游戏还是会和刚开始脑海中设想的样子是有区别的。第一次做游戏,考虑不足一
定会存在纰漏,希望大家能留言提出意见一起交流,共同进步。
        1、这个美术资源已经是我最大的努力了,我也不记得一个没有美术功底的
        程序员是怎么画出来的了,反正修修改改了很多版,还是有点别扭,也就勉强能
        看。以后继续做的话还是走像素风格的吧,本人很喜欢像素风的游戏。
        2、音频资源大部分是在小森平上下的,游戏的背景音乐是我用水果编的土
        嗨音频,第一次尝试也是勉强能听,还请见谅。
        3、微信小游戏刚打开时音频触发有点滞后,这个问题我在论坛找了蛮久也
        没有找到解决方案,如果有哪位知道的话还请留言告诉我,十分感谢~
        4、苹果手机发热问题,应该时自己写的拖尾效果的原因,生成的节点太多
        了,但是安卓手机测试的话发热量没有苹果的高。
        5、刚上线使用人数很少,匹配的话可能会匹配不到人,匹配模式可能体验
        不是很好。
        6、同步做的还不够完善,很惭愧之前没有做过经验不足,这个状态已经是
        我当前状态下能做到的极限了,需要继续沉淀学习。

最后

最近在找工作,求好心的大佬收留,如果觉得合适请私信我,谢谢~。(坐标:深圳)

19赞

一看SCF + MGOBE都是不认识的词,感觉好高端

2赞

芜湖,群里来的

1赞

画风不错哦~

1赞

顶一下,深知个人开发的不易

1赞

单人模式没有结束按钮啊。必须等倒计时结束才能返回吗?

1赞

这个功能会在以后版本中增加~

大佬很厉害啊!!!
在深圳找工作吗?我这边有一个腾讯出来的大佬创业,有兴趣吗?

好的,谢谢~,已经私信你咯

相当认真~幸苦了

1赞

“(怎么说呢,来社区就像回家一样,里面个个都是人才,说话又好听。)”

2赞

楼主的测试样本数量不太大吧?腾讯这个对战引擎还出现匹配上的问题??
我目前是发现断线会通知两次,与其文档描述不一致。没想到还有其他毛病

这个匹配的问题你可以试一下哦,我这边测试的时候时出现可了哦
我设置网络波动回调间隔600ms就判断断线了,可能是区间太小的缘故:joy:
谢谢你提出的问题,我会努力修复的~

哦,不,我是说我自己在接入这个对战引擎的时候,发现它会有两次断线回调,你的游戏我匹配半天没匹配到人:joy:,你没有加机器人。

是呀,它这个断线回调有点不靠谱的嫌疑:laughing:,所以我在帧同步回调中记录间隔时间来判断。机器人的思路我现在还不是很有思路,能分享一下你的解决思路么~

大致看了一下你上面提到的同步实现,总体上还是“同步操作”这种传统意义上的帧同步吧?
一般传统的帧同步技术机器人AI逻辑在客户端,因为玩家本身是精确同步的,对于ai来说,相当于它的行为数据来源就是一样的,最后达到的效果是每一个客户端AI的运行结果是一样的。所以整个游戏也是同步的。

1赞

谢谢皮皮:kissing_heart:~
我就是皮皮说的腾讯出来创业的开发,哈哈。
作者今天已经在我左边一起写代码了~

作者这种一个人搞定前后端+美术的钻研精神,我非常的佩服!

公司坐标深圳,欢迎那些真的能从游戏开发中,找到乐趣的人,来公司聊聊~
有简历的话,也可以直接发给我们的HR MM,邮箱:hr@9inestar.com

看了你的游戏,挺有意思的。
这边是腾讯在线教育部,我们在用 Cocos Creator 开发儿童教育产品。
技术博客:https://oedx.github.io/
如果有兴趣,可以跟我聊聊。