帧同步坦克大战匹配系统

在介绍匹配系统之前,先说一下项目的整体结构。

项目主要有四个场景: start --> home --> choose --> game

start_scene: 是游戏的开始场景,在此场景主要做了微信授权,获取用户的昵称,头像等信息。通过云函数获取用户的openid(不了解云函数的可以参考这篇文章:微信云开发使用教程)。然后把用户的信息和用户的openid都放到全局对象Global里边,方便以后使用。

home_scene: 授权成功之后,就跳转到此场景。

进入此场景之后,需要初始化MGOBE框架的SDK。

首先,设置SDK所需要的参数值(gameId , openId, secretKey, server,从控制台获取),并放入缓存中。

initListen函数做的就是初始化Listener,并创建房间实例,给房间添加监听。截取主要代码如下:

初始化完成之后,就可以选择1V1,3V3。目前3V3其实我现在设置的是2V2,没有实际去测效果,但是计算坦克的初始位置的时候,把这种情况考虑进去了,这个到帧同步时再细讲。

choose_scene: 选择1V1或者3V3之后,就会进入此场景。其实,目前来讲,choose_scene完全可以和home_scene合并为一个场景。在此,我说明一下为什么把它们分开。

因为,之前我设想的是,在这个场景可以由玩家自由选择坦克类型什么的,选择好之后,由玩家手动点击匹配。同时,也可以在玩家匹配成功之后,显示所有对战玩家的对局信息,类似于王者荣耀进入游戏之前的那个场景。这是为了以后,拓展功能方便。比如以下这种:

现在省略掉这些优先级较低的环节。因此,进入choose_scene场景之后,就直接发起匹配。

发起匹配之前,我们需要在MGOBE控制台创建一个匹配规则。

首先,在控制台左侧菜单【房间管理】,找到【匹配规则集】

新建规则集,填写规则集名称和规则集内容。名称随意填就好,规则集内容是一个json。它的结构是这样的:

我以当前坦克大战的规则集为例,解释一下各个字段的含义。

{
  "version": "V1.0",  //版本号,一般填V1.0就可以
  "teams": [
    {
      "name": "1v1",  // 名称1v1
      "maxPlayers": 1,  //每支队伍的最大玩家数量为1
      "minPlayers": 1,  //每支队伍的最小玩家数量为1
      "number": 2  //总共有两支队伍
    }
  ],
  "playerAttributes": [
    {
      "name": "lv",  //等级,匹配时需要传入此参数
      "type": "number"  //属性的类型,目前暂时仅支持number
    }
  ],
  "rules": [
    {
      "type": "deviation",  //匹配规则的类型:当前为误差规则
      "expression": "teams[i].players.lv", //依据玩家等级组队
      "value": 5, //表示所有玩家之间等级相差不能超过5
      "waitTimeSteps": [
        {
          "waitTimeSeconds": 10, //等待10秒若匹配不上,则放宽规则
          "value": 10 //把等级差放宽为10
        }
      ]
    }
  ],
  "timeout": 15 //全局匹配超时时间
}

更复杂的匹配规则,可以参考官方文档:
https://cloud.tencent.com/document/product/1038/34952

规则集创建完之后,就需要创建匹配code了。左侧菜单【房间管理】,找到【在线匹配】。右侧新建匹配,填写描述信息,匹配规则选择刚才我们创建的那条匹配规则集。

点击确定之后,就会分配一个匹配code,这个code就是调用发起匹配API需要传入的一个参数。

现在,可以调用room.matchPlayers方法发起匹配了。匹配超时之后,会弹出超时的对话框,可以选择重新匹配,或者取消匹配退出匹配队列。取消匹配,会返回到home_scene场景。(超时对话框是我从cocos论坛找的UI,结合自己需要改的)

至此,整个匹配的主要流程就讲完了。查看完整代码,在公众号回复关键字“帧同步”即可获取。

说明一下:

  1. 目前MGOBE匹配支持两种模式,房间匹配和玩家自由匹配。房间匹配采用的是类似于棋牌游戏,一个玩家开房,然后邀请其他玩家进来游戏,或者其他玩家通过房间匹配进来。所有玩家准备之后,开始进行游戏。而玩家自由匹配,是指所有玩家进行的单人匹配。因此,目前框架不支持类似于王者荣耀那样的组队匹配。之前,有联系过他们的产品,说以后会上线此功能。
  2. 帧同步,所有逻辑都在客户端完成,因此不需要在服务端写额外的代码。这样一来,有好处也有坏处。好处就是我们不用关心服务端的实现,坏处就是灵活性不够强,很多问题,只能通过在客户端想办法来实现。另外,此框架有个需要注意的地方就是,在这种情况下,也需要下载实时服务器的代码(即服务端),然后发布到实时服务器。操作流程可查看官方文档。
  3. 框架所有的API都可以在 MGOBE.t.ds文件里找到相对应的解释和使用方法。因此,多看此文件会让你更加熟悉整个框架。
  4. 代码中有很多被注释掉的代码。有的是为了不让之前的代码影响到现在的逻辑,有的是在调试过程中,为了对比各种实现方式而留下的。忽略即可。
  5. 代码下载下来可以用cocoscreator 2.0.10 直接跑起来,暂时用我的服务器参数就可以。

原文地址:https://www.cnblogs.com/starry-skys/p/11980419.html

时间: 2024-08-14 20:52:38

帧同步坦克大战匹配系统的相关文章

帧同步坦克大战移动系统

上节讲到了匹配系统,匹配完成之后,我们就需要开始进行帧同步了.但是,需要注意,只有房主才可以调用开始帧同步的方法.因此,需要加一层判断. 然后,房间内的其他玩家需要监听开始帧同步的广播,接收到开始帧同步的消息之后,进入游戏场景. game_scene:游戏主场景.(终于到最关键的逻辑部分了) 首先,进入游戏主场景之后,进行一些玩家的初始化(比如位置,血量,攻击,防御等信息),还有摇杆的初始化. 需要注意的是,玩家的出生位置这一部分逻辑稍微复杂一些.因为,没有服务器逻辑支持,所以只能在客户端想办法

帧同步坦克大战开篇

?最近在用腾讯的小游戏联机对战引擎(以下简称MGOBE)改写我之前写的坦克大战.因为时间有限,每天都是下班业余时间去搞,也是第一次写帧同步,因此遇到了很多问题,也因此学到了很多东西.(不了解这个框架的可以看我之前的简单介绍以及我为什么要用这个框架:惊!!!个人游戏开发者的福音来了!) 目前主要实现的功能,就是匹配系统和帧同步的平滑移动,自我感觉效果还可以,不过还是有很多需要优化的地方. 因无法上传视频,想看视频效果的可以关注公众号「如若清风」,查找近期文章帧同步一即可看到. 匹配系统:包括小游戏

坦克大战系列11.0版

好学而不勤问非真好学者. 本讲内容:坦克大战11.0版(面向对象的思想) 一.解决:播放声音 1.定义一个播放声音的类AePlayWave 2.在面板构造方法启动声音 二.同一个包下建二个文件分别为:MyTankGame.Members(负责其它成员譬如:制造坦克.子弹等) MyTankGame类 /** * 功能:坦克游戏的8.0版本 1:画出坦克 * 2:实现我方坦克可以上下左右移动 * 3:可以發射子彈,子彈可以連發(最多可以发5颗) * 4:画出敌人的坦克 * 5:当我方坦克击中敌人坦克

Java坦克大战(四)

这是我的坦克游戏大战的最后一版,里面添加很多新的功能.这个坦克大战的有很多不足之处,但是对于初学者来说依然是一个很好的练习项目,从中我们可以学习Java基础知识,将知识与项目结合,学习面向对象编程思想,最主要的是编程的逻辑练习,代码往往不像是写文章从上到下一气呵成完成,中间很可能为增加一个功能来添加一个类一个方法等,中间有很多细节需要我们考虑.文章最后会附加该坦克大战涉及的相关素材. 功能: 1.防止坦克重叠 2.可以分关(闪烁效果) 3.记录成绩(小型游戏都是写在文件中) 4.存盘退出,可以记

黑马2018年最新kotlin项目实战视频 (手机影音、即时通讯、黑马外卖、坦克大战等)

├─1.kotlin简介和学习方法│ 01_kotlin课程简介_01.mp4│ 02_kotlin学习方法_01.mp4│ 03_kotlin选好教练车_01.mp4│ 03_kotlin选好教练车_02.mp4│ 04_kotlin你好世界_01.mp4│ 05_kotlin变量与输出_01.mp4│ 05_kotlin变量与输出_02.mp4│ ├─10.类,对象和接口(三)│ 38_kotlin面向对象-抽象类和接口_01.mp4│ 38_kotlin面向对象-抽象类和接口_02.mp4

Python3——坦克大战

# coding=utf-8 # Version:python3.6.1 __date__ = '2018/9/20 18:51' __author__ = 'Lgsp_Harold' import pygame, sys, time from random import randint from pygame.locals import * # 坦克大战主窗口 class TankMain(object): width = 600 height = 500 my_tank_missile_li

JAVA课程设计(坦克大战)

2019-01-16 坦克大战游戏背景: 1. 需求分析 1.1环境要求 操作系统:Windows 7(SP1)以上 JAVA虚拟机:JDK1.8以上 开发环境:Eclipse(4.5以上) 1.2角色设定 用户在系统中扮演的角色,以及可以执行的职责. 玩 家 操纵玩家坦克,与敌方坦克作战,同时保护本基地.敌方坦克随机移动,发射子弹. 1.3设定玩家(玩家一,玩家二,即一个人玩还是两个人玩),我方坦克的方向和子弹由用户控制,所有墙块都可以打碎,但是铁墙是打不碎的,草地不能阻止坦克和子弹的前进,河

手游帧同步的研究

网络游戏的同步可以做的很简单,也可以做的很复杂.简单来说就是通过Http或者Socket来跟服务器同步数据.而如果往复杂了说,可以有p2p.帧同步.航位预测等等高级课题可以研究. 因为我们的项目需求----几百个独立单位的实时同步(带pvp的rts),所以研究了下帧同步.不过后来发现它其实有很多问题,所以具体如何还要看其他同事的研究成果.以我个人来说,修改游戏方案反而是最合理的解决方案. 首先从需求上来说,几百个独立单位的作战,本身结果和士兵强弱从策划的角度来看就是不可控制的.玩家更加不可控制.

Java__线程---基础知识全面实战---坦克大战系列为例

今天想将自己去年自己编写的坦克大战的代码与大家分享一下,主要面向学习过java但对java运用并不是很熟悉的同学,该编程代码基本上涉及了java基础知识的各个方面,大家可以通过练习该程序对自己的java进行一下实战. 每个程序版本代码中,都附有相关注释,看完注释大家就可以对本程序设计有个很明显的思路.真的很有趣,想对java重新温习的同学完全不必再对厚厚的java基础书籍进行阅读了,在跟着本次代码练习并分析后,大家一定会对java各方面基础知识 尤其是线程的知识有更深一步的了解!!! 本次坦克大