多人对战

多人对战是唤境为用户提供的一种实现2~4个用户联机进行游戏的回合制联机组件。本次教程将为大家详细讲解多人对战组件的使用方法。
可以查看视频教程,也可下拉查看图文讲解
点击查看多人对战视频

多人对战与两人对战相似,是在其基础上的延伸,建议初学者可以先学习一下两人对战。
点我下载游戏工程

新建工程

想要使用多人对战组件,必须将项目设置为【联机游戏】,才能在组件列表中显示该组件

组件属性

匹配对象

该组件可以选择是否匹配离线玩家,当匹配离线玩家时,需用户自己实现离线是AI的逻辑部分。

勾选 【全部玩家】后,系统会优先匹配在线玩家,如果在设定的匹配时间内没有找到符合条件的在线玩家,系统将自动匹配离线玩家。

匹配条件筛选/先手判断

用户可以自定义 匹配的条件以及先手回合的条件,系统会自动匹配数值接近的玩家。

新建全局变量【等级】,勾选是否联网。

新建变量后,匹配依据中就会出现该变量。先手依据同理,可在匹配开始前随机生成一个变量的值,并通过该值判断谁先手开始。

回合时间

玩家可自定义每回合的时间,改设置不会影响玩家当前游戏状态。 当回合倒计时结束后,会触发【回合倒计时结束】条件,玩家可自行实现逻辑,决定当倒计时结束时,是否强制结束回合。

对战回合结构

对战组件的完整游戏流程由以下阶段构成:

  1. 待机:玩家尚未进行匹配
  2. 匹配中: 玩家进入匹配阶段
  3. 匹配成功:成功匹配到另外的玩家
  4. 已准备:当匹配成功后,双方玩家必须先全部进入已准备阶段,才能够进入对战状态。
  5. 对战中:双方进入对战,在该阶段下,会根据具体实现逻辑,不断切换双方操作回合,直到游戏结束。

对战游戏中,需要为我方回合以及对方回合分别写不同的逻辑。 例如:当我方回合时,可以点击按钮。 当对方回合时,禁用按钮,下面将会为大家展示完整的两人对战案例。

打包测试

需要注意,目前游戏只能在打包后才能测试两人对战的实际效果。可以在打包完成后,同时使用两个不同的浏览器进行测试(推荐使用谷歌和IE)。
目前每个游戏的每天只能打包30次,打包前请尽可能多的实现逻辑

记得在打包前取消勾选【仅自己访问】,否则只有作者账号才能够登录游戏。

实现玩家匹配

接下来我们将教大家如何正确匹配玩家。

布置场景

首先我们在场景中添加一个匹配按钮以及一个文本组件。文本组件用于显示当前的匹配状态。

在文本中显示当前对战状态

添加事件,使用【判断对战状态】条件,为不同的状态分别设置不同的文本内容。该条件用于判断自己当前处于哪个阶段。


点击按钮进入匹配状态


打包测试

接下来我们打包h5进行测试,注意要使用两个不同的浏览器(将链接复制到两个浏览器中)

可以看到,初始双方都处于待机状态,当点击【开始匹配】按钮后,进入匹配中

当双方都点击按钮匹配时,如果匹配成功,将显示匹配成功。

准备/进入对战

当4个玩家都匹配成功后,需要手动进入准备状态。只有全部玩家都进入准备状态后,才能够进入对战
准备状态可以选择在匹配成功后立刻准备


也可以通过新的按钮来进行控制

当全部玩家准备后,系统会自动进入对战,并设置其中一方先手回合。用户可以选择玩家准备完毕后跳转到对战场景,也可以直接在该场景进行游戏。


实现对战逻辑

接下来我们在对战场景实现每个玩家回合的游戏逻辑。在本次教程示例中,我们将通过攻击按钮,进行简单的生命值扣除功能。
与两人对战不同,4人对战每个人都会被分配一个编号,可以通过表达式获取

布置场景/添加生命值变量

首先,我们添加两个攻击按钮,分别是:

  • 【固定伤害攻击】:固定扣除对方10点生命
  • 【随机伤害攻击】:随机扣除对方1~20点生命

接着添加全局变量:【我方生命值】, 用于显示我方当前的剩余生命。本次教程中生命值并不需要保存,也不参与匹配和先手依据,所以无需设置为联网变量。

新建文本对象:【我方生命显示】,用于在屏幕上显示当前生命值。

每帧更新文本内容,显示生命值

在游戏进行中我们需要知道当前是谁的回合,为此同样建立文本对象用于显示。

创建一个全局变量“当前玩家”

添加事件来获取每个回合在行动的玩家编号。


添加事件,分别在我方和其他玩家回合时显示不同的文本内容,同时对方回合时禁用攻击按钮。

点击按钮时,传输伤害数据给对方

使用多人对战组件的传输对战数据动作,当点击攻击按钮时,将指定数值传输给对方。


  • 数据名称:本次数据传输的标签,对方通过该标签获取数据
  • 参数x:要传输的数据,可以是字符串或数值。

截图中除了传输攻击数值(参数1),还额外传输了一个参数0(参数0的值可以随意指定)。这么做是与接收数据的条件的使用场景有关,在下面的条件中会详细讲到。

数据接收

实现传输数据后,我们同样需要通过事件表事件数据接收并做处理。
需要用到两个条件: 【其他玩家传输对战数据时】、【比较对战数据】

与两人对战不同,这里多了一个可以填是接收哪位玩家传输的数据,如果玩家编号填0,则为任意玩家。

触发器下面根据传输的值的数据名称,分别做不同的逻辑处理。

接收数据一般有两个使用场景

  • 在接收到数据的同时判断该值的大小(例如:A>0时),并仅仅在满足条件时执行动作。该场景下,传输数据时只需要传输需要的数据即可
  • 第二种情况(也是本教程案例的场景)是,传输的数据不需要进行判断大小即可参与逻辑。 由于【比较对战数据】条件必须要进行一次值的判断,为了防止条件不满足导致动作没有执行,我们需要多添加一个固定的,不参与游戏逻辑的参数(本教程中为参数0)。

当我们接收了“攻击数据”后,接下来要做的就是根据接收的值减少自己的生命值。使用表达式:多人对战.getParam(玩家编号,“数据名称”,参数编号)

括号中第1个参数是指定接收哪位玩家发送的数据这里填表达式:多人对战.getSenderID



接下来我们打包测试。
匹配、准备后,跳转到对战场景
注意:我们需要打开四个浏览器,或者用上手机、其他电脑也可以。

第一个回合是1号玩家行动,点击固定伤害攻击按钮后,其他的玩家生命值减少了,且其他玩家按钮处于禁用状态。

回合结束

当我们攻击后,需要实现攻击结束的逻辑。 这里需要注意的是,由于数据传输根据网络问题可能会有一小段时间的延迟,不建议在传输数据后直接结束回合。
当对方接受数据后,对方也传输一个数据给我方,当我方接收到该数据时,代表对方已经处理完游戏逻辑,此时在结束回合是最稳妥的。

因为多人对战有4个人的缘故,所以要加一个前置条件“当玩家回合是自己时”,
并且我们要判断一下,如果玩家编号小于4,那么下个回合是切换到了玩家编号+1的人,如果玩家编号已经等于4,那么就直接切换到编号1的玩家。



做完以上处理后,就可以切换回合,玩家们互相攻击了

随机数值攻击以及游戏结束

当点击随机伤害按钮时,同样传输攻击数据,参数1为1~20的随机数


最后我们优化一下逻辑和实现游戏结束判定,当一方的生命值被降低到0以下时,显示“游戏结束”,退出对战,并在2秒后返回匹配场景。
我们之前把攻击按钮的启用和禁用放在切换回合之后

按钮的启用放在这里是合理的,但禁用的优先级应该更高,不然玩家可以连续点击,导致传输多次数据、回合被多次切换。
所以应该在攻击按钮被点击时就把按钮禁用,这样才不会造成延迟。

如果大家以后的工程中有多个按钮或者多种情况需要处理这类逻辑,可以使用同类组或动作组,大家按各自需求来灵活处理。

场景开始时依旧要重置全局变量(再次回到对战界面时变量需要重置)


修改伤害处理逻辑,如果扣除生命值后,玩家生命值大于0,切换回合(逻辑不变)。如果小于0,游戏结束并发送数据通知其他玩家。

其他玩家收到这个数据后也需要做出同样的动作。

总结

多人对战组件的重点在于理解组件的各个阶段,以及我方回合、其他玩家回合的不同逻辑。以及需要注意进入对战后,每个玩家会按照出手顺序自动分配一个编号,可以通过表达式获取。这样你可以指定对某个玩家发送数据,或只接收某个玩家的数据。

如果不通过事件表控制,回合切换对游戏并没有本质影响。如果您不希望通过回合切换的方式操作,也可以选择忽略回合切换,玩家自由控制,并随时传输数据。

——————————————————————————

如何通过创建房间进行匹配对战

为了逻辑清晰一些,把创建房间和处于房间中分成两个场景来写:

在“游戏大厅”场景,放置两个按钮,一个按钮用于【创建房间】,另一个按钮用于【加入房间】,【加入房间】的按钮还需要配一个输入框,用于输入房间码,以便准确加入对应的房间中。

创建房间只需要通过“创建房间”动作来触发即可。

事件如下:

该动作执行后,可以通过“创建房间成功”、“创建房间失败”条件来判断房间是否创建成功。
只有房间创建成功,才可以使用多人组件的表达式获取邀请码等。

事件如下,当创建房间成功时,跳转到“房间”场景,表示已进入房间。一定要注意,在这个条件后,才可以使用多人组件的表达式获取邀请码等。

到这里房间就已经创建成功了。
————————————————————————
接下来就是其他玩家加入到这个已创建的房间,这里只需要“加入/退出房间”动作来触发即可。

操作选择“加入”,但还需要填一个房间邀请码,

这个房间邀请码我们通过上面布置好的输入框来获取,所以填入这个输入框对象的相关表达式来获取输入框上已输入的文本,如下图:

具体事件如下:

这样其他玩家就能通过输入对应的房间码,加入到对应的已创建的房间中,类似的,也能通过“加入房间成功”、“加入房间失败”条件来判断是否成功加入房间。

加入房间成功时,也同样跳转到“房间”场景即可,表示加入了房间。

而如果加入房间失败,也可以通过相关的表达式时获得“加入房间失败的原因”,让玩家得知具体原因:

只需要在场景中放一个文本组件,通过事件设置给文本即可:

到这里加入房间的功能也完成了。
————————————————————————
接下来是当玩家加入房间后的相关功能实现:
【关于房间邀请码】
上面我们提到,加入房间需要一个房间邀请码,例如:
玩家A创建了一个房间,房间邀请码为123456,那玩家B如果想加入玩家A创建的房间,就需要在输入框填入123456,然后按“加入房间”按钮,才能准确的进入玩家A创建的房间。
所以在“房间”场景中,我们需要显示当前房间的房间邀请码,以便玩家A私下告诉玩家B这个邀请码,好让玩家B准确的加入到自己创建好的房间中。
我们可以通过相关的表达式获得当前房间的房间邀请码:

同样的,只需要在场景中放一个文本组件,通过事件设置给文本即可:

完成后大致效果如下:

【玩家加入房间后,如何开始游戏】
每当玩家加入房间后,玩家就会自动进入“匹配中”状态(包括创建房间的玩家),当房间已满员时,所有玩家会自动进入“匹配成功”状态,这时剩下的操作就跟通常的匹配流程差不多了,只需要所有人执行“准备对战”动作,进入“准备中”即可,只要所有人都“已准备”了,就会自动进入到“对战中”状态,之后就是具体的对战逻辑了。

相关事件如下:

【玩家如何退出房间】
玩家加入房间后,如果想要退出房间,可以通过“加入/退出房间”动作来触发,退出房间也需要填入一个房间码,这里就直接通过表达式获取当前的房间码即可:

这里需要注意的是,退出房间的操作会让玩家从“匹配中”、“匹配成功”返回到“待机”状态,而如果玩家已经是“已准备”状态了,那么退出房间后依旧是“已准备”状态,所以为了保证正确退出房间,可以先执行一下“取消准备”动作,具体的事件如下:

以上就是通过创建房间进行匹配对战的基础实现方法了。
——————
另外补充几点:
1、 虽然都是“匹配中”状态,但房间内和房间外的玩家无法成功匹配在一起,只有都在房间内,或者都在房间外才能匹配成功。
2、 一个房间如果没有玩家,就会自动销毁,例如玩家A创建了一个房间,进入房间后,他又退出了房间,那么即使他进去房间时已经得知了这个房间的房间邀请码,但由于退出后房间内已无玩家,房间此时自动销毁,所以玩家A无法在退出后用刚刚得知的房间邀请码重新加入这个房间,只能重新创建房间,或者加入其他玩家创建好的房间。

该教程是否对你有用?