这个系列教程一共有 3 个章节,这是其中的第一篇,推荐完整阅读全部三篇的内容哦。
第二篇 - 消息系统
第三篇 - 同步系统
开始之前,你需要……
在正式开始学习之前,你需要做好一些准备。
这篇教程中,我们会用到两个扩展模块,分别是 Gandi Simple MMO v1.0.3 和 Gandi 数据助手 v1.1。
数据助手中,我们使用到的主要是处理 JSON 的语句。
如果你还不知道怎么使用 JSON,也不用担心哦,教程中的用法并不会很复杂。
用户界面与全局积木
每个作品的用户界面都有不一样的风格,在制作匹配系统时,你不必使用和我一样的按钮、菜单样式,完全可以自己设计。关于用户界面的实现方法,我在教程中会略过,只分享一些重要的部分。
另外,在案例作品中,我已经把实现匹配系统的算法做成了一系列的全局积木,放在了匹配模块中,也附上了详细的注释,你可以直接将这个角色,加载到自己的程序中,使用其中的全局积木哦。
记得去案例作品中下载哦。
这篇教程会完全基于匹配模块中的全局积木来讲解,你可以不用理解这些全局积木是如何运行的。如果你感兴趣的话,也可以读读代码。
使用全局积木来制作匹配系统的代码基本上都在【匹配系统】这个角色中,可以参考哦。
案例作品
在这个作品中,实现了匹配系统、消息系统和同步系统,我也会分三篇教程分享给你。我们先看看匹配系统。
在匹配系统中,主要实现了以下的 4 个功能;
- 进入游戏大厅,获得匹配房间的信息;
- 选择一个房间加入;
- 快速匹配;
- 创建一个新房间;
- 准备,开始与结束等游戏流程。
接下来,就一起看看如何实现这些功能吧~
功能一:加入游戏大厅,获得匹配房间信息
使用 Simple MMO 模块,可以让玩家加入三种类型的在线房间。他们分别是广播房间(broadcast)、大厅(lobby)和匹配房间(match room)。其中,大厅和匹配房间通常会在一起使用。
你可以用一个自定义的服务器 ID 创建一个大厅,使用相同服务器 ID 的匹配房间都可以在这个大厅中被查询到。
在制作匹配系统时,第一步就是创建一个游戏大厅,可以使用匹配模块中的这个全局积木,你只需要填写一个自己定义的服务器 ID 就可以。
在运行这个全局积木之后,玩家就会加入到大厅中,并且开始实时更新房间中的匹配房间信息,储存在下面这个房间信息列表中。
每个匹配房间的信息会以 JSON 的格式储存在列表中。例如下面这段代码就是一个房间的信息:
{
"clients":1,
"createdAt":"2022-07-24T16:07:55.518Z",
"maxClients":4,
"metadata":{
"locked":false,
"gid":"62d42391e189602916172fec-test01",
"extra":"{\"inGame\":0,\"maxClients\":4,\"winner\":\"default\"}"
},
"name":"match",
"processId":"LoAOMOAlm",
"roomId":"Ck9b4hP6H"
}
下面的表格中列出了各项常用属性对应的意义:
属性 | 描述 |
clients | 当前房间中的玩家数 |
createdAt | 房间创建的时间 |
maxClients | 房间能容纳的最大人数 |
locked | 房间现在是否锁定,新玩家无法加入锁定状态下的房间 |
extra | 房间的额外数据,在使用匹配模块的全局积木创建房间时,会存入一个默认的 JSON。其中:
- inGame 表示是否在游戏中,1 表示在游戏中,0 表示游戏还没开始;
- maxClients 表示房间容纳的最大玩家数;
- winner 胜利者的会话 ID |
roomId | 房间的 ID,可以用来准确的加入特定的匹配房间 |
有了房间信息列表,你就可以使用数据助手中处理 JSON 的语句,获取房间的信息了。
比如说想要获取列表中第一个房间当前的玩家数,就可以这样写:
想要获取房间中的玩家是否在游戏中,可以这样写:
结合艺术字模块显示大厅中第一个房间的信息,就可以像右边这样写算法。
玩家:1 / 4
正在游戏中
在案例作品中,大厅里的房间信息基本上都是用这种方法来显示的,你也可以参考这种方式哦。
所以,想要实现进入游戏大厅,获取匹配房间信息的功能,只需要在程序一开始的时候,运行加入大厅的全局积木,设置一个服务器 ID 即可,这里我把服务器 ID 定为 test01,可以写成这样:
当然,你也可以像案例作品中那样,在接收到一条广播消息后再进入大厅。
进入大厅后,房间信息列表就会开始更新,你可以用其中的数据来显示房间的信息。
功能二:选择一个房间加入
在进入大厅,并且获取到房间的信息后,我们就可以选择一个有空位的房间加入了。
首先,在菜单中,玩家应该只能加入那些还没满员,并且没有正在游戏中的房间。这里就需要用到刚才提到的两个属性了,clients 和 inGame。你可以使用这两个属性,来设置一个房间状态。
在案例作品中,我会将房间分为三种状态:
- 游戏中:房间中的玩家正在游戏中,此时不可以加入房间;
- 满员:房间中的人数已经是最大人数了,此时不可以加入房间;
- 等待中:房间中的玩家没有达到最大人数,也没有在游戏中,此时可以加入房间。
结合功能一中获得的房间信息列表,可以用下面这段算法来判断第一个房间的状态:
在匹配模块中,会通过算法将游戏中和满员的房间锁定,其他玩家是无法加入的。
不过大多数情况下,玩家都是通过点击按钮加入房间的,所以只需要根据房间的状态,设置按钮是否可以点击就行了。这样就不会出现点击按钮后没有反应的情况了。
好啦,现在如果玩家找到一个等待中的房间,就可以选择加入房间了。这里可以使用全局积木:
只需要在输入框里填入房间的 roomId 就可以啦,也是要从 JSON 中获取哦。
要确定获取的是第几个房间的 roomId,可以根据你的菜单界面来写算法,你也可以读读我的用户界面代码参考一下哦。
在案例作品中,我将要加入房间的 roonId 存在了变量【房间ID】中,并且在按下【加入】按钮的时候发送一条【加入房间】的广播消息。这样,加入房间的代码就可以写成这样:
功能三:快速匹配
除了选择房间加入,游戏中通常还会设置快速匹配的选项。玩家可以不用选择,快速加入一个等待中的房间。
这里可以使用匹配模块中的全局积木:
它会找到大厅中的第一个没有锁定的房间,并且把玩家加进去。
和加入按钮一样,如果没有可以加入的房间,快速匹配按钮应该也是不可以点击的。
全局积木中有一个语句会判断当前的大厅中是否有可以加入的房间:
如果有可以加入的房间,语句会返回 1,否则会返回 0。可以用语句返回的值,来设置快速匹配按钮是否可以点击。
在案例作品中,点击快速匹配按钮会发送一条广播。实现快速匹配功能的代码是这样的:
功能四:创建一个新房间
除了加入已有的房间,玩家也可以选择自己创建一个新的房间。可以使用全局积木:
在语句中,你需要设置的,就是这个房间的最大玩家数。案例程序中,房间的最大人数是 4,这里填写 4 就可以了。
当然,除了最大玩家数,有的时候我们还会给房间做一些其他的设置。
比如说案例作品中,创建新房间的时候,就会需要选择一个地图。
这时候,我们就需要再给房间的额外数据中加一些属性,以便房间中的所有玩家都可以读取到,并且根据数值运行程序。
这里可以使用这个全局积木:
其中 key 就是这条属性的名字,值就是对应的数值。
比如说,在案例程序中,选择的地图数值会储存在【地图】变量中,给房间添加地图这个属性就可以这样写:
读取这个属性的值可以写成这样:
在案例作品中,点击创建房间之后,会先选择地图,选择完成时会发送广播,创建房间。在匹配系统中创建房间的代码是这样的:
功能五:准备,开始与结束等游戏流程
准备
在匹配房间中,玩家的信息可以直接使用 Simple MMO 模块中的语句来获得。
进入匹配房间之后,会有两种角色,第一种是普通玩家,另一种是房间中的一号玩家,也就是房间的房主。
在案例作品中,我们让房间中的第一个玩家来做房主,可以用下面这个自制积木来获取玩家在房间中的序号:
序号从 1 开始,你可以根据玩家的序号来显示不同的界面。
普通玩家的界面是这样的:
普通玩家可以在房间中准备或者取消准备。可以使用这个全局积木来设置玩家的准备状态。
在案例作品中,点击准备按钮或者取消准备按钮后,会广播一条消息。改变角色准备状态的代码可以写成这样:
其中用到的消息模块语句,我会在下一篇教程中分享给你。
开始游戏
在案例作品中,房主的界面是这样的:
房主有开始游戏的权限,当房间有 2 个及以上的玩家,并且都准备好之后,房主可以开始游戏。
可以使用这个自制积木来判断是否所有玩家都准备好了。
语句返回的值为 1,则表示所有玩家都已经做好准备了。如果返回的是 0,则表示至少有 1 个玩家还没有做好准备。可以根据这个数值,来设置开始游戏按钮的效果。
也可以使用这个积木来判断某一个玩家是否准备好了。
在输入框里可以填写数字,序号从 1 开始。
所有玩家都准备好之后,房主可以一键让所有玩家都开始游戏。可以使用全局积木:
这个积木会将 inGame 属性的值设置为 1,并且发送一条本地广播,同时也会让房间中所有其他玩家的程序也发送一条本地广播:
你可以让游戏的主要代码在接收到这条广播后开始运行,这部分的代码在【主要角色】中,我们放在第三篇教程中介绍。
在案例作品中,点击开始按钮后,会广播准备开始。匹配系统中的代码是这样的:
这里的消息模块积木用来发送倒计时,给其他玩家提示。
游戏结束
当有玩家胜利,游戏结束时,可以使用下面的全局积木:
这个语句会将房间中 winner 属性的值设置为胜利玩家的会话 ID,同时将 inGame 的属性设置为 0。
在案例作品中,游戏结束时,程序会发送一条 4D 消息,消息名为【玩家胜利】,消息内容为胜利玩家的会话 ID,所以匹配系统的代码会写成这样:
其中的【菜单页 #】变量是用来控制用户界面的,可以忽略。
这样,一个多人游戏的房间匹配系统就搭建好啦~
在匹配房间的界面里,有一个聊天版,下一篇教程中,我会给你分享如何利用 MMO 制作一个消息系统。
注意事项
这篇教程中,主要介绍了如何处理房间的连接、获取数据和实现匹配房间内的效果。
其实在制作程序的过程中,还有一大部分的精力会放在制作用户界面上,正确的显示信息也很重要,不过这部分和 MMO 没有太大关系,如果你有需要可以在创作者学院文章的评论区里告诉我。
对于教程有任何问题或者对匹配模块中的全局积木有什么建议,也可以在评论区里告诉我哦。
创作者学院文章: