您当前所在位置: > 爆料站 > 君子堂

纯前端如何利用帧同步做一款联机游戏?

时间:2020-12-03 15:01:14  来源:  作者:网络转载
赚钱游戏红包版

赚钱游戏红包版

大小:6.6M更新:2020-12-03

分类:生活实用

一、游戏帧同步

1.简介

·现代多人游戏中,多个客户端之间的通讯大多以同步多方状态为主要目标,为了实现这一目标,主要有两个技术方向:状态同步、帧同步。

·状态同步的思想中不同玩家屏幕上的一致性的表现并不是重要指标,只要每次操作的结果相同即可。所以状态同步对网络延迟的要求并不高。

·帧同步主要依赖客户端的能力,服务器仅仅是做一个转发,甚至客户端可以无需服务器,通过P2P方式来转发数据。由于只是转发游戏的行为,所以广播的数据量比状态同步要小很多。

本文将以帧同步技术为主来介绍如何实现一款联机游戏。

2.小游戏案例

·本次我们在《街霸小游戏》中利用腾讯云的游戏联机对战引擎实现了玩家之间的PVP玩法。


感兴趣的同学可以扫码体验:


二、游戏联机对战引擎:Mgobe

1.引擎简介

·Mgobe是由腾讯云提供的游戏联机对战引擎,可以为游戏提供房间管理、在线匹配、帧同步、状态同步等网络通信服务,帮助开发者快速搭建多人交互游戏。

·Mgobe可以让我们在没有后台开发人力的情况下也能实现游戏的帧同步。

Unity Editor也嵌入了MGOBE,在Unity Editor 2019.1.9及以上版本,各位开发者可以通过服务面板,一键开通腾讯云服务MGOBE。



Cocos Creator嵌入了MGOBE,在v2.3.4及以上版本,各位开发者可以通过Cocos Service服务面板,一键开通腾讯云服务MGOBE。


·官网:https://cloud.tencent.com/product/mgobe

2.开发语言

·Mgobe支持使用 JavaScript 或 TypeScript 来进行前端开发。

3.支持平台

·Mgobe目前支持:微信小游戏、QQ小游戏、百度小游戏、OPPO小游戏、vivo小游戏、字节小游戏;H5小游戏和手游。

三、纯前端打造帧同步实现联机对战

·接下来会从前端的角度来一步一步讲解使用Mgobe的方法,借助Mgobe我们可以不用知晓后台和运维知识,就可以构建起一套性能优越的帧同步游戏。

1.控制台配置

·首先我们需要在Mgobe的控制台中创建游戏实例,以获取游戏ID、游戏Key和域名等信息,我们会在初始化SDK时使用到游戏ID和游戏Key。


·出于安全考虑,微信小游戏会限制请求域名,所有的 HTTPS、WebSocket、上传、下载请求域名都需要在微信公众平台进行配置。因此,在正式接入游戏联机对战引擎 SDK 前,还需要开发者在微信公众平台配置合法域名。 ·需要配置的域名包含一条 request 域名和两条 socket 域名记录,配置如下:

// request 域名

report.wxlagame.com

// socket 域名

xxx.wxlagame.com

xxx.wxlagame.com:5443

2.SDK

2.1.下载

·SDK下载地址:https://cloud.tencent.com/document/product/1038/33406

2.2.引入SDK

·SDK文件包含 MGOBE.js 和 MGOBE.d.ts,即源代码文件和定义文件。在 MGOBE.js 中,SDK接口被全局注入到 window 对象下。因此,只需要在使用SDK接口之前执行 MGOBE.js 文件即可。

·以微信为例,只需将 MGOBE.js 放到项目下任意位置,在 game.js 中 import SDK 文件后即可使用 MGOBE 的方法。当然也可以使用 import/from、require 语法显式导入 MGOBE 模块。

2.3.直接使用密钥进行初始化

·用这种方式可以快速初始化SDK,可以最快的速度使用引擎的帧同步功能,但这种方式会在前端暴露游戏Key。

  1. <p>var gameInfo = {</p><p>openId: 'xxxxxx', //玩家的openID</p><p>gameId: "xxxxxx", //游戏id,在控制台中的“游戏ID”中获取</p><p>secretKey: 'xxxxxx' //游戏密钥,在控制台中的“游戏key”获取</p><p>};</p><p>var config = {</p><p>url: 'xxx.wxlagame.com',//游戏域名,在控制台中的“域名”获取</p><p>reconnectMaxTimes: 5, //重连接次数</p><p>reconnectInterval: 1000, //重连接时间间隔</p><p>resendInterval: 1000, //消息重发时间间隔</p><p>resendTimeout: 10000 //消息重发超时时间</p><p>};</p><p>Listener.init(gameInfo, config, function() {</p><p>if (event.code === 0) {</p><p>// 初始化成功</p><p>}</p><p>});</p>
复制代码

·Listener 对象为 MGOBE 的子属性,该对象方法全为静态方法,不需要实例化。Listener对象主要用于给 Room 对象的实例绑定广播事件监听。

·初始化 Listener 成功后才能继续调用 Mgobe 引擎的其他接口。

2.4.利用签名来进行初始化(在前端隐藏游戏Key)

·用2.3的方法初始化 SDK 时,会在前端暴露游戏的密钥,为了避免在客户端泄露游戏的密钥,我们也可以使用签名的方式来初始化 SDK。

·在开发者服务器通过游戏 ID、游戏 Key、玩家 openId 等信息计算出游戏签名,然后再下发给客户端。客户端在初始化 SDK 时,需要实现一个 createSignature 签名函数,从服务端获取签名信息然后回调给 SDK。也就是在 gameInfo 中,将2.3中 的 secretKey 字段改为 createSignature 字段。

  1. <p>//这里仅列出与2.3不同的gameInfo, config和Listener.init与2.3一致,不再赘述。 var gameInfo = {</p><p>gameId: "xxxxx", //游戏id,在控制台中的“游戏ID”中获取</p><p>openId: "xxxxxx", //玩家的openID</p><p>// 实现签名函数</p><p>createSignature: callback => { //假设https://example.com/sign就是我们后台计算签名的接口</p><p>fetch("https://example.com/sign").then(rsp => rsp.json()).then(json => {</p><p>const sign = json.sign;</p><p>const nonce = json.nonce;</p><p>const timestamp = json.timestamp;</p><p>return callback({ sign, nonce, timestamp });</p><p>});</p><p>},</p><p>};</p>
复制代码


·签名过程详见:https://cloud.tencent.com/document/product/1038/38863

3.房间

·在开发游戏的过程中,大部分接口都位于 Room 对象中。由于每个玩家只能加入一个房间,在游戏生命周期中可以只实例化一个 Room 对象来进行接口的调用。

3.1.实例化Room

  1. var roomInfo = { id: "xxx" //房间ID }; var room = new MGOBE.Room(roomInfo);
复制代码

创建房间、加入房间、匹配等接口调用直接使用 room 实例即可。但有3个接口例外:getMyRoom、getRoomList、getRoomByRoomId 接口是 Room 对象的静态方法,需要使用 Room.getMyRoom、Room.getRoomList、Room.getRoomByRoomId 来调用。

3.2.几个常用属性

3.2.1.roomInfo 属性

·roomInfo 为 Room 实例的属性,保存房间的相关信息,调用 Room 相关的接口会导致该属性发生变化。可以从 roomInfo 中获得房间的id、名称和玩家列表等。

3.2.2.networkState 属性

·用于获取客户端本地 SDK 的网络状态。注意 networkState 的网络状态与玩家信息 Player 中的网络状态概念不同,room.networkState 表示本地 socket 的状态,而 Player.commonNetworkState 和 Player.relayNetworkState 表示玩家在 Mgobe 后台中的状态。 ·networkState 网络状态发生变化时,room.onUpdate 将被触发。

  1. <p>room.onUpdate = function() {</p><p>console.log("房间信息更新:", room.roomInfo);</p><p>};</p>
复制代码

3.3.初始化Room

  1. room.initRoom();
复制代码

·通过 room.initRoom 方法可以初始化一个房间,同时更新房间信息 roomInfo 。初始化可以更新 WebSocket 连接,这样才能及时收到房间的广播。此外,如果要加入指定ID的房间,也需要先对房间进行初始化,否则将无法使用 room.joinRoom 加入指定ID的房间。

3.4.为Room添加广播侦听

  1. MGOBE.Listener.add(room);
复制代码

·一个房间对象会有很多广播事件与其相关,例如该房间有新成员加入、房间属性变化、房间开始对战等广播。Room 实例需要在 Listener 中注册广播监听,之后可以通过 room.xxx 回调函数的形式来使用广播侦听,详见下文。

3.5.创建房间

·通过使用 room 实例的 createRoom 可以创建一个房间,创建成功后创建者会自动进入该房间。

  1. <p>var playerData = {</p><p>name:nickname, //玩家昵称</p><p>customPlayerStatus:playerStatus, //自定义玩家状态</p><p>customProfile:figureURL //自定义玩家信息</p><p>};//玩家信息</p><p>var createRoomData = {</p><p>roomName:"roomName", //房间名称</p><p>roomType:"1v1", //房间类型</p><p>maxPlayers:2, //房间最大玩家数量</p><p>isPrivate:true, //是否为私有房间,属性为 true 表示该房间为私有房间,不能被 matchRoom 接口匹配到</p><p>customProperties:roomStatus, //自定义房间属性</p><p>playerInfo:playerData //房主信息</p><p>};//房间信息</p><p>room.createRoom(createRoomData, function(e)</p><p>{</p><p>if(e.code === 0)</p><p>{</p><p>//创建房间成功</p><p>}</p><p>});</p>
复制代码

·注意:创建房间的结果是通过回调异步返回的,而非派发事件。

3.6.加入房间

·通过使用 room 实例的 joinRoom 可以加入一个已经存在的房间。

  1. <p>var playerData =</p><p>{</p><p>name:nickname, //玩家昵称</p><p>customPlayerStatus:playerStatus, //自定义玩家状态</p><p>customProfile:figureURL //自定义玩家信息</p><p>};//玩家信息</p><p>var joinRoomInfo =</p><p>{</p><p>playerInfo:playerData</p><p>};//加入房间的信息</p><p>room.initRoom({ id: "xxx" });//加入房间前需要先初始化room实例</p><p>room.joinRoom(joinRoomInfo, function(e)</p><p>{</p><p>if(e.code === 0)</p><p>{</p><p>console.log("加入房间成功");</p><p>}</p><p>});</p>
复制代码

·注意:加入房间的结果也是通过回调异步返回的,而非派发事件。加入房间前必须先初始化房间实例。

·对于已经存在于房间中的其他人,可以通过 room.onJoinRoom 来侦听新玩家的加入。

  1. <p>room.onJoinRoom = function(e)</p><p>{</p><p>console.log("新玩家加入,ID为:", e.data.joinPlayerId);</p><p>};</p>
复制代码

3.7.离开房间

·使用 room.leaveRoom 就可以退出房间。

  1. <p>room.leaveRoom({}, function(e)</p><p>{</p><p>if(e.code === 0)</p><p>{</p><p>console.log("离开房间成功");</p><p>}</p><p>});</p>
复制代码

·对于房间中的其他人,可以通过 room.onLeaveRoom 来侦听玩家的离开。

  1. <p>room.onLeaveRoom = function(e)</p><p>{</p><p>console.log("离开房间的玩家的ID:", e.data.leavePlayerId);</p><p>};</p>
复制代码

4.匹配

4.1.匹配规则

·要进行房间匹配,需要先在控制台创建匹配规则,匹配规则既可以满足按人数匹配、按队伍匹配,也可以按段位等特殊方式来匹配。成功创建规则后会获得一个匹配code,匹配code将会用于匹配的相关接口,表示用这个规则来匹配符合条件的玩家。


规则创建之后还需要将规则绑定到服务器中才能生效,在“新建匹配”中选择上一步创建的匹配集即可。


4.2.匹配玩家

·有了匹配code后我们就可以在前端进行玩家匹配了,只要是符合规则中定义的条件的玩家,就会被匹配进同一个房间中。

  1. <p>var matchPlayersData = {</p><p>playerInfo:playerData, //发起匹配的玩家的信息,playerData在上文已多次出现,这里不再赘述</p><p>matchCode:matchCode //匹配code,在4.1中获得</p><p>};//玩家匹配信息</p><p>room.matchPlayers(matchPlayersData, function(e)</p><p>{</p><p>if(e.code === 0)</p><p>{</p><p>console.log("匹配请求成功");</p><p>}</p><p>});</p>
复制代码

4.3.匹配房间

·matchPlayers 配合匹配code可以用来匹配玩家,那么通过使用 room.matchRoom 则可以进行房间的匹配。房间匹配是指按照传入的参数搜索现存的房间,如果存在,则将玩家加入该房间,如果不存在,则为玩家创建并加入一个新房间。

·matchRoom 不需要使用匹配code。

  1. <p>var playerInfo = {</p><p>name: "Tom",</p><p>customPlayerStatus: 1,</p><p>customProfile: "https://xxx.com/icon.png",</p><p>};//发起匹配者的信息</p><p>const matchRoomPara = {</p><p>playerInfo,</p><p>maxPlayers: 5,</p><p>roomType: "1",</p><p>};//房间匹配信息</p><p>room.matchRoom(matchRoomPara, function(e) {</p><p>if (event.code === 0) {</p><p>console.log("匹配成功");</p><p>}</p><p>});</p>
复制代码

·matchRoom 与 matchPlayers 最大的不同就是:matchRoom 一定会让匹配发起人进入一个房间,但 matchPlayers 则不一定,如果当前没有符合匹配规则的玩家,则 matchPlayers 会返回失败。

5.帧同步

·终于来到这一步了,如果玩家已经成功加入房间,就可以通过帧同步功能进行游戏对战。

5.1.开启帧同步

·使用 room.startFrameSync 接口就可以开启帧广播。房间内任意一个玩家成功调用该接口都将导致全部玩家开始接收帧广播。

  1. <p>room.startFrameSync({}, function(e)</p><p>{</p><p>if(e.code === 0)</p><p>{</p><p>console.log("开始帧同步成功");</p><p>}</p><p>});</p>
复制代码

·调用成功后房间内全部成员都将收到 onStartFrameSync 广播。该接口会修改房间帧同步状态为“已开始帧同步”。

  1. <p>room.onStartFrameSync = function()</p><p>{</p><p>//收到此广播后将持续收到 onRecvFrame 广播 //注意,这里还不是玩家之间相互进行帧同步的信息内容,onRecvFrame 中才是我们拿到帧同步内容的地方,见下文</p><p>};</p>
复制代码

5.2.发送帧消息

·玩家收到帧同步开始广播后,才可以发送帧消息,后台会将每个玩家的帧消息组合后再广播给每个玩家。

·帧数据内容 data 类型为普通 Object,由开发者自定义,目前支持最大长度不超过1k。后台将集合全部玩家的帧数据,并以一定时间间隔(由房间帧率定义,可以在控制台配置)通过 onRecvFrame 广播给各客户端。调用结果将在 callback 中异步返回。

  1. <p>var frame = { cmd: "xxxxxxxx", id: "xxxxxxxx" };//一帧的内容,由开发者自定义</p><p>var sendFramePara = { data: frame };//发送给Mgobe的帧内容</p><p>room.sendFrame(sendFramePara, function(e) { console.log("发送帧同步数据"); });</p>
复制代码

5.3.接收帧广播

·开发者可设置 room.onRecvFrame 广播回调函数来获得帧广播数据。onRecvFrame 广播表示收到一个帧 frame,frame 的内容由多个 MGOBE.types.FrameItem 组成,即一帧时间内房间内所有玩家向服务器发送帧消息的集合。

  1. <p>room.onRecvFrame = function()</p><p>{</p><p>console.log("收到帧同步消息=", e.data.frame); //我们就是从 e.data.frame.items 这个数组的每个元素的 data 属性来拿到我们在5.2中发送给Mgobe的帧内容的。 //5.2的帧内容:var frame = {cmd: "xxxxxxxx", id:"xxxxxxxx"}</p><p>};</p>
复制代码

5.4.停止帧同步

·使用 room.stopFrameSync 接口可以停止帧广播。房间内任意一个玩家成功调用该接口将导致全部玩家停止接收帧广播。

  1. <p>room.stopFrameSync({}, function(e)</p><p>{</p><p>if(e.code === 0)</p><p>{</p><p>console.log("停止帧同步成功");</p><p>}</p><p>});</p>
复制代码

·调用成功后房间内全部成员将收到 onStopFrameSync 广播。该接口会修改房间帧同步状态为“已停止帧同步”。

  1. <p>room.onStopFrameSync = function()</p><p>{</p><p>//收到该广播后将不再收到 onRecvFrame 广播</p><p>};</p>
复制代码

·至此,利用Mgobe来进行帧同步开发的相关主要接口就介绍完毕了。下面将讲一些关于玩家信息的内容。

6.玩家信息

6.1.玩家ID

·玩家信息 Player 对象为 MGOBE 的子属性,用于访问玩家的基本信息,例如玩家 ID、openId 等。该对象记录了玩家的基本信息,默认全部为空。成功初始化 Listener 后,ID、openId 属性才生效。

·Player 中的 玩家 ID 是 MGOBE 后台生成的 ID,而 openId 是开发者初始化时候使用的 ID。需要注意,openId 只有初始化 Listener 的时候才使用,后续其它接口提到的“玩家 ID”均指后台生成的 ID,也就是 Player.id 属性,它不是 openId,切记!

·玩家进入房间后,Player 对象中的属性与 roomInfo.playerList 中的玩家信息是一致,通过两者任何一个都可以获得正确的玩家信息。

6.2.几个常用事件

·这里提两个经常用到的玩家事件:网络状态变化、玩家状态变化。

·在Mgobe中,玩家的网络状态分以下4种,但玩家的网络状态发生变化时均会触发。

  1. <p>room.onChangePlayerNetworkState = function(e)</p><p>{</p><p>if(e.data.networkState === MGOBE.ENUM.NetworkState.COMMON_OFFLINE)</p><p>{</p><p>console.log("房间中玩家掉线");</p><p>}</p><p>else if(e.data.networkState === MGOBE.ENUM.NetworkState.COMMON_ONLINE)</p><p>{</p><p>console.log("房间中玩家在线");</p><p>}</p><p>else if(e.data.networkState === MGOBE.ENUM.NetworkState.RELAY_OFFLINE)</p><p>{</p><p>console.log("帧同步中玩家掉线");</p><p>}</p><p>else if(e.data.networkState === MGOBE.ENUM.NetworkState.RELAY_ONLINE)</p><p>{</p><p>console.log("帧同步中玩家在线");</p><p>} //通过 e.data.changePlayerId 可以知道是哪个玩家的网络状态发生了变化</p><p>};</p>
复制代码

·如果修改了玩家的自定义信息(由开发者自定义的,也即上文多次提到的 playerInfo 中的 customPlayerStatus),则以下事件会被触发:

  1. <p>room.onChangeCustomPlayerStatus = function()</p><p>{ //房间内 ID 为 changePlayerId 的玩家状态发生变化。玩家状态由开发者自定义。</p><p>console.log("玩家自定义状态变化=", e.data.changePlayerId); console.log("自定义数据=", e.data.customPlayerStatus);</p><p>};</p>
复制代码

7.错误处理

·最后,如果在使用Mgobe的过程中如果发生客户端错误、系统逻辑错误、用户信息错误、房间错误、匹配错误、帧同步错误、参数错误、队伍团队错误时,均会发出错误码,可以通过以下文档查阅相关错误码对应的描述信息,以便排除和解决错误。

·错误码说明文档详见:https://cloud.tencent.com/document/product/1038/33317

四、结尾

· 本文仅从前端角度出发,介绍了利用 Mgobe 进行纯前端的帧同步开发,但 Mgobe 的功能远不止这些,Mgobe 也支持在后台编写自定义匹配逻辑来实现更加丰富的帧同步,感兴趣的同学可自行查阅官方文档。也可关注公众号,关注持续技术分享。

来源:腾讯游戏云
原文:https://cloud.tencent.com/developer/article/1747879

资源转载网络,如有侵权联系删除。
相关下载

玩家评论

42款进口游戏版号:“上古卷轴”等多款重磅IP游戏过审_游快

原标题:42款进口游戏版号:“上古卷轴”等多款重磅IP游戏过审 12月2日,时隔4个月,国家新闻出版署官网发布了2020年第三批过审进口网络游戏名单。 本次详情>>

阅读: 0
日期: 2020-12-03
《游戏王:决斗链接》正式获得版号 上线日期即将到来!

网易游戏代理的《游戏王:决斗链接》正式获得版号,官方表示,开发组正准备上线事宜,将尽快开启上线前测试,与大家见面!国服预约同步进行中。 该游戏中拥有数千张卡片,还拥有3D详情>>

阅读: 1
日期: 2020-12-03
游戏场景中的建筑设计,专访暴雪娱乐首席美术师 PhilipKlevestav

生动、逼真的图像与演示已成为方案展示不可或缺的组成部分。当下,设计师们正运用最先进的软件,建构精致三维模型,力求尽可能真实地展现他们的作品。而对于电子游戏领域来详情>>

阅读: 1
日期: 2020-12-03
新国产游戏版号过审 明年上市游戏公布名单

2020年12月1日,最新一批的国产游戏版号已经正式下发了。不少玩家们此前玩过的游戏将要更新至最新版本,一些风格独特的小众游戏也在版号下发的游戏之中,相信不少新的国产游戏会详情>>

阅读: 2
日期: 2020-12-03
觉悟挑战是否改变初衷,让对线游戏变成一个偷塔偷家游戏

觉悟挑战是否改变初衷,让对线游戏变成一个偷塔偷家游戏详情>>

阅读: 1
日期: 2020-12-02
网易游戏:《游戏王:决斗链接》正式获得版号_规则

原标题:网易游戏:《游戏王:决斗链接》正式获得版号 IT之家12月2日消息 网易游戏代理的《游戏王:决斗链接》正式获得版号,官方表示,开发组正准备上线事宜详情>>

阅读: 1
日期: 2020-12-02
玩家收藏的80年代经典游戏机和主机被当做垃圾扔掉了

据英国知名游戏博客VG24/7报道,美国的一位玩家因为长久没回老家,自己的老妈便将他留在家里的一些杂物清理掉了,但这些杂物当中包含了大量珍贵的、80年代详情>>

阅读: 1
日期: 2020-12-02
红包版大型游戏 真正良心的赚钱游戏

多款一进入游戏即可领取红包的仙侠游戏就在这里!带给用户更好的游戏体验,这里有超多的人物和任务,可以自由选择,都是有红包可以领取的,十分的良心,游戏制作也是耗费精力,感兴详情>>

阅读: 1
日期: 2020-12-02
两小时删除78款游戏,Steam半年最大规模封禁,白嫖游戏少一半?

各位好!,我是游戏人民日报星空。据Steam游戏封禁网址的纪录显示信息,在不久前,V社仅用时两个多钟头就封禁了Steam服务平台上78款游戏。接着又再度下手,封禁了6款游戏。据统详情>>

阅读: 1
日期: 2020-12-02
映月城与电子姬游戏机币怎么用映月城与电子姬游戏机硬币怎么用

映月城与电子姬游戏机币怎么用?游戏中有一个叫做游戏机币的货币,些玩家不知道游戏机币是怎么来的,它的作用到底是什么?接下来就让小编来给还不知道的玩家详细的介绍一下游戏机详情>>

阅读: 1
日期: 2020-12-01
联想发布拯救者Y9000X/R9000X2021游戏本:8核CPU

  11月30日晚,联想正式推出了拯救者Y9000X 2021及R9000X 2021款游戏笔记本,重量只有1.9千克左右,15.6寸144Hz电竞屏,RTX 2060 Max-Q显卡,分别可选Intel酷睿8核标压或者AMD锐详情>>

阅读: 0
日期: 2020-12-01
【游戏有戏11】回顾TGA,你喜欢的游戏上榜了吗?

【游戏有戏11】回顾TGA,你喜欢的游戏上榜了吗?详情>>

阅读: 4
日期: 2020-12-01
steam游戏借用是什么意思_steam游戏借用功能介绍_快吧单机游戏

作者: 奥尔加 2020-02-06 16:59 整理 玩家A自己购买了游戏文件后,玩家B在该电脑详情>>

阅读: 1
日期: 2020-11-30
TSUTAYA游戏销量榜:国民游戏《桃太郎电铁》两连冠

日本TSUTAYA商店公布了最新一周的(11月23日至11月29日)游戏软件销量排行。《桃太郎电铁》系列新作《桃太郎电铁~昭和 平成 令和也是定番!~》两连冠,Switch详情>>

阅读: 1
日期: 2020-11-30
英国游戏周销量:黑五大赢家是《FIFA21》和Switch游戏

  黑五促销季的英国游戏周销量公布了,这周内在英国售出了超过 100 万份盒装游戏,但比起去年的 130 万份下降了 20%。  这是可以理解的,因为今年黑五期间英国仍处于疫情导致详情>>

阅读: 2
日期: 2020-11-30
业余游戏开发者计划重置《塞尔达传说》系列游戏

近日,外媒EuroGames报道称,一位业余的游戏开发者计划将《塞尔达传说》系列中的两部作品进行重制。这位开发人员决定计划重置的游戏分别为《林克:邪恶详情>>

阅读: 2
日期: 2020-11-30
买量救不了游戏

持续大规模投入的买量模式走到尽头? 01、买量费用不断攀升侵蚀利润,高投入的买量模式难以为继 2020年游戏市场波澜不断,上半年疫情带来一波流量红利,游戏产业流水增详情>>

阅读: 1
日期: 2020-11-30
解谜游戏:坑爹的走迷宫游戏,如何安全抵达终点?

解谜游戏:坑爹的走迷宫游戏,如何安全抵达终点?详情>>

阅读: 7
日期: 2020-11-29
解谜游戏:坑爹的问答游戏,答案是什么?

解谜游戏:坑爹的问答游戏,答案是什么?详情>>

阅读: 7
日期: 2020-11-29
steam秋促50元内独立游戏推荐 优质游戏购买推荐

steam目前正在进行秋促,除了单机大作外,有很多独立游戏也非常优秀,下面给大家分享一些50元内的优质游戏,一起看看吧。 平台跳跃类 汐 画风很唯美的平台跳跃游详情>>

阅读: 1
日期: 2020-11-29
Steam游戏推荐:《虚幻生活》剧情向像素冒险解谜游戏

《虚幻生活》(Unreal Life)是一款hako life制作的剧情向像素横版冒险解谜游戏,在失去记忆之后,女孩只记得一个名字—“樱小姐”。 在会说话详情>>

阅读: 1
日期: 2020-11-28
清版游戏《Zero Gunner 2》登陆Steam 12月21日发售

彩京开发过多款街机平台空战清版射击游戏,包括《战国ACE》、《打击者1945》、《武装飞鸟》等。在2001年,开发的一款清版射击游戏《Zero Gunner 2(零式战详情>>

阅读: 1
日期: 2020-11-28
M站整理“黑五”游戏购物推荐单 《恶魂:重制版》必玩

国外迎来了一年一度的购物节“黑色星期五”,许多商品都有大折扣优惠。著名评分网站Metacritic根据平台和评分为玩家们整理了一份主机+PC平台详情>>

阅读: 1
日期: 2020-11-28
《新塔防三国》游戏攻略

游戏一开始先跟住新手引导走,等过几个新手任务后就可以手动调整战斗倍数,按左上角按钮就可以调整。 完成一定的关卡后可以在主界面点击任务进入领取已完成详情>>

阅读: 1
日期: 2020-11-27
人类跌落梦境游戏售前问答一览 游戏价格介绍

人类跌落梦境即将在12月17日与大家见面,但是目前对于游戏许多玩家还有问题想要了解。那么对于这些问题官方是怎么说的呢,下面一起看看官方的解答吧。 Q:下详情>>

阅读: 0
日期: 2020-11-27
第十二届优秀游戏制作人大赛(2020 CGDA)移动游戏组、美术组及音乐组评委阵容公布

由顺网科技旗下北京汉威信恒文化传播有限公司主办,并得到移动游戏企业家联盟(MGEA)大力支持的中国游戏行业重要活动暨国内唯一针对游戏研发领域的评选大赛——第十二届CGDA优秀详情>>

阅读: 1
日期: 2020-11-27
盘点最经典的4款童年玩具,掌上游戏机和开花树你们都认识吗?

盘点最经典的4款童年玩具,掌上游戏机和开花树你们都认识吗?详情>>

阅读: 9
日期: 2020-11-27
妄想山海游戏机怎么制作

妄想山海游戏机是一类家园建筑物,是小伙伴们提升和建设家园的重要保障,被不少小伙伴所关注和青睐。那么游戏机怎么制作?需要消耗哪些材料呢?有哪些作用呢?接下来就让我们详细的看详情>>

阅读: 1
日期: 2020-11-27
PSN+12月会免游戏名单 12月会免游戏有哪些

PSN+12月会免游戏有哪些?索尼近日正式公布了PSN的12月各个服务器会免游戏名单,下面就一起来看看都有哪些游戏吧。 12月会免游戏名单 港服商店:《正当防卫 4》、《火详情>>

阅读: 3
日期: 2020-11-27
魔兽世界林鬼的游戏任务怎么做  wow9.0林鬼的游戏任务攻略介绍

魔兽世界林鬼的游戏任务怎么做?wow魔兽世界在最近更新了9.0版本,在新版本中添加了不少的新任务比如“林鬼的游戏”。详情>>

阅读: 1
日期: 2020-11-27
Steam2020黑五超值游戏入手推荐

作为游戏玩家心目中迟来的“双十一”,STEAM黑五特惠终于来了!买到就是赚到,买的越多G胖亏的越多!担心打骨折的游戏太多不知道买哪些?我来给老哥们强烈安利些各个风格的游戏,总详情>>

阅读: 1
日期: 2020-11-27
特别鸣谢 | 第十二届优秀游戏制作人大赛(2020 CGDA)移动游戏组、美术组及音乐组评委阵容公布

主办方特开启本届DEAS抢票赢大礼活动,500张VIP门票预约注册,免费限时限量开抢! 详情>>

阅读: 1
日期: 2020-11-27
魔兽世界9.0林鬼的游戏任务怎么做-wow9.0林鬼的游戏任务攻略

魔兽世界9.0林鬼的游戏任务怎么做?林鬼的游戏任务流程是什么?还不清楚的小伙伴看过来,这里234游戏网小编为大家带来魔兽世界9.0林鬼的游戏任务流程攻略的详细介绍!有兴详情>>

阅读: 7
日期: 2020-11-27
特别鸣谢|第十二届优秀游戏制作人大赛(2020CGDA)移动游戏组、美术组及音乐组评委阵容公布

由顺网科技旗下北京汉威信恒文化传播有限公司主办,并得到移动游戏企业家联盟(MGEA)大力支持的中国游戏行业重要活动暨国内唯一针对游戏研发领域的评选大赛—详情>>

阅读: 0
日期: 2020-11-27
什么游戏最好玩排名榜 最新最全福利游戏大全

什么游戏最好玩?哪个破解游戏软件最全?这里是一款非常齐全的手机破解版游戏软件下载合集!全是破解版游戏的软件,专为喜欢玩破解游戏的你量身打造!每一款破解版游戏软件详情>>

阅读: 3
日期: 2020-11-27
往游戏里充钱才能玩这游戏,不然被吊着打哭

往游戏里充钱才能玩这游戏,不然被吊着打哭详情>>

阅读: 7
日期: 2020-11-27
解谜游戏:坑爹的围棋游戏,如何将青年围住?

解谜游戏:坑爹的围棋游戏,如何将青年围住?详情>>

阅读: 4
日期: 2020-11-27
《冒险王2送充无限抽》游戏攻略

冒险王2(送充无限抽)游戏攻略 前期跑完新手流程后,玩家基本队伍的位置都开了。这时候不用管属性搭配,全上精灵能加不少战力。玩家拿到签到,日常,邮件的资源后,可详情>>

阅读: 2
日期: 2020-11-26
《无敌OL无限点将》游戏攻略

在大多数的卡牌游戏中,收集角色以及对角色的培养正是游戏的乐趣所在。《无敌OL》这款游戏的特点就是武将超多,白起、岳飞、吕布、关羽等等历代的名将都会不断详情>>

阅读: 3
日期: 2020-11-26
Google Stadia 有「400 款游戏」正在开发当中

在与 MobileSyrup 的访谈中,Google Stadia 的游戏总监 Jack Buser 表示该服务有「400 款游戏」正在准备当中。当然,这不是说全部 400 款都会在 2021 年前登场,而是分散在「未详情>>

阅读: 2
日期: 2020-11-26
精彩推荐