决战平安京吧 关注:398,411贴子:15,427,248

决战平安京地图实现原理分析

只看楼主收藏回复

作为一个比较喜欢moba类游戏的玩家,我以前玩过dota、lol、300英雄、三国杀英雄传、王者荣耀等多款moba游戏,仅从地图的角度来看,这些游戏可以分为两大类。
第一类是以dota、lol为首的比较传统的moba游戏,dota分天辉夜魇,lol分红蓝色方。除了战争迷雾以外,双方的地图并没有其它的区别,也就是说,如果你是夜魇方或者红色方,那么在你看来,你的出生点都位于地图的右上角,你的敌人在你的左下角。由于人类的生理构造,所以大多数人在蓝色方会获得更好的操作体验,不过这些游戏是使用鼠标和键盘来操作,非常灵活,所以即使有统计说蓝色方胜率高于红色方,我们也不能贸然认定这个胜率差距来自操作习惯,毕竟地图构造以及bp顺序也都会影响双方的胜率。
第二类自然就是以王者荣耀为首的手游moba游戏,这类游戏需要占用一部分手机屏幕用来给方向盘以及技能键提供空间,而通常方向盘和技能键放在屏幕下方比较方便操作。如果王者荣耀依然像lol一样,不对地图作任何处理,那么红色方的游戏体验将会变得极差,因为与他们对线的英雄都被自己的手指挡住了。所以如果你是红色方,那么在你看来,地图会被做一点小小的处理,也就是旋转180°,这样红色方也在下方了,操作上保证了双方的基本公平,所以有一个有趣的现象是,有时候大龙在上路,有时候在下路,但是下路的buff却总是红buff。
决战平安京则是第三类,一种我以前从来没有见过甚至刚开始不能理解的模式,不仅能保证玩家的出生点永远在下方,而且还能保证大龙永远在上路,小龙永远在下路。当然,大龙在上路,小龙在下路这对游戏体验没有太多实际意义,真正的意义是,在保证玩家出生点永远处于下方的同时,让玩家的下路,同时也是敌方的下路,这样就不会出现我方上路1打2的尴尬局面。当我第一次在网上见到有人说平安京有这个机制的时候,我还没有激活码,觉得这简直不可思议,后来亲自进入游戏体验了一番,发现确实是这样,然后我自己想了想,总结出了这种机制的实现原理,并写了个小程序来模拟,接下来就分析下三种类型的具体实现。
首先是传统模式,这种模式下,红蓝双方从服务器接受到的各种坐标(基地、英雄、野怪)完全一致,只是战争迷雾不一致而已:


(左方的窗口为蓝色方,右边的窗口为红色方,红色大方块表示敌方基地,蓝色大方块表示我方基地,红蓝小方块分别表示红蓝buff,紫色表示大龙,棕褐色表示小龙,天蓝色表示我方英雄,粉红色表示敌方英雄,其它模式也一样)
对比上下两幅图(当然,不要吐槽这个图很简陋,我只是尝试从安装包中提取地图文件失败),我们可以发现,当蓝色方英雄朝着地图的上方移动的时候,红色方的视角里,他也是朝着上方移动,这是所谓的不对地图本身作任何处理,如果没有战争迷雾,双方的眼中的地图是完全一致的。
第二种模式则是王者荣耀的模式,这种模式下,红色方的视角中,整个地图被旋转了180°,当然这个旋转操作发生在服务器上还是红色方的客户端上我们就不得而知了(我选择的是让它发生在服务器上):


同样对比上下两幅图,我们发现,当蓝色方的英雄朝着上方移动时,红色方的视角中,他却在往下方移动,同时,红色方的视角中,大龙位于下路。这样,蓝色方的上路实际上就是红色方的下路。
这个旋转操作是非常简单的,比如蓝色方英雄的位置,在红色方的眼里,处于其实际位置的中心对称的位置,当然这个中心对称的点是地图的中点。
如果蓝色方英雄的位置是(x,y),那么换算到红色方的视角中就是(w-x,w-y),w是地图的大小,假设地图是正方形。
这个换算公式的正确性是可以以数学手段证明的,即:中心对称的两个点连线经过对称中心且被对称中心平分,证明过程比较简单,这里省略证明过程。
第三种模式则是平安京的模式,红色方的视角中,地图被做了如下处理:首先将地图旋转180°,然后以中路为对称轴,将所有的物体的坐标转换为其对称点的坐标:


同样对比两幅图,当蓝色方英雄朝上方移动时,红色方的视角中,他却在朝左方移动。同时,蓝色方的上路,对于红色方来说依然是上路。双方眼中的大龙都在上路,小龙都在下路。
游戏中有这么几个现象:
1.下路的buff有时候是红buff,有时候是蓝buff,该buff的缺口位置有时候朝向左下,有时候又朝向右下。
2.对于中路英雄来说,有个不能还手的野怪,永远在左手方的位置。
3.中路一塔有时候贴着左边的墙,有时候贴着右边。
4.lol和王者荣耀中,大龙小龙的位置实际上都属于其中一方的半场,而平安京中大小龙则是绝对中立的,处于一条中线上(只有这样才能保证每次大小龙的位置都是不变的)。
可以看出,这种模式能保证两条边路,单人线对上单人线,双人线对上双人线。不过这种做法到底好不好,现在还不好说,一切看最终测试结果。
前面我们讨论了中心对称的坐标计算方式,现在我们说一说轴对称如何计算:
假设原坐标是(x,y),以中路为对称轴,那么其对称点的坐标是(w-y,w-x),这个计算公式的合理性同样可以利用轴对称的性质来进行数学上的证明,这里同样不展开讨论。
我们说过,地图处理分两步,先中心对称,再轴对称,首先中心对称:
x1=w-x
y1=w-y
然后轴对称:
x2=w-y1
y2=w-x1
两组公式加起来就是:
x2=y
y2=x
也就是说,红色方的地图处理时,直接交换x和y坐标即可。
总结一下,在已知平安京的这种地图处理方式的情况下,将其实现特别简单。不过能想到这种处理方式,真的是非常天才。我不知道这是不是第一款这样处理地图的游戏,但是我确实是从来没见过。希望网易的设计师能继续表现他们天才的一面,为我们带来一个更好玩的手游moba游戏,用自己的实力来改变目前王者荣耀一家独大的局面。
PS:楼下放测试程序、测试源码
PPS:最后有个小小的惊喜


IP属地:四川1楼2017-12-07 20:02回复
    在这里可以下载到测试程序:
    链接: https://pan.baidu.com/s/1ce26Gu
    密码: 7etd
    使用方法如下:

    双击Server.exe启动服务器程序,如果防火墙询问是否允许其访问网络,选择是。
    然后双击Client.exe启动客户端程序,需要启动两次,第一次启动的是蓝色方,第二次启动的则是红色方。
    当双方的客户端都启动完成后,服务器会进入游戏模式,开始模拟:

    我们可以调整游戏模式,分别观察三类moba游戏的处理方式:

    该程序支持win7及以上的32/64位系统,没有为xp系统做兼容处理。
    由于时间仓促,没有仔细做兼容处理,所以可能有的系统不能启动这个程序。
    如果win7以上的系统不能启动程序,提示缺少某某dll,请删除msvcp140.dll和vcruntime.dll,然后运行分享中的这两个文件:


    IP属地:四川2楼2017-12-07 20:12
    收起回复
      2025-07-31 10:04:30
      广告
      不感兴趣
      开通SVIP免广告
      这是源代码的链接:
      服务器:
      https://github.com/Amber-yy/Server
      客户端:
      https://github.com/Amber-yy/Client
      这些代码基于C++的Qt GUI(Qt5.9.1)框架,开发环境为Visual Studio 2015。


      IP属地:四川3楼2017-12-07 20:14
      回复
        dota近卫天灾的图不一样啊,野区差很大


        IP属地:陕西来自Android客户端4楼2017-12-07 20:16
        收起回复
          好吧,看起来并没有人愿意理我,不过说好的小小惊喜还是要有,楼下放一个激活码。


          IP属地:四川来自Android客户端5楼2017-12-07 20:31
          收起回复
            这个激活码是真的激活码,不是挚友码也不是衍生码。在我到处找码的时候不发给我,当我有码了知道给我了。


            IP属地:四川来自Android客户端6楼2017-12-07 20:32
            收起回复
              直接把码放出来,先看到这个贴的人先得,毕竟看的人少,不存在手速问题。
              我只有两个要求:
              1.激活成功了说一声
              2.不管游戏好不好玩,都要把所有的衍生码挚友码什么的打出来,并且免费发到贴吧
              一切靠自觉,不遵守我也没办法。


              IP属地:四川来自Android客户端7楼2017-12-07 20:35
              收起回复
                先到先得


                IP属地:四川来自Android客户端8楼2017-12-07 20:35
                收起回复
                  2025-07-31 09:58:30
                  广告
                  不感兴趣
                  开通SVIP免广告
                  可惜我已经淘宝35元买了


                  IP属地:上海10楼2017-12-07 20:49
                  收起回复
                    可怕的大佬


                    IP属地:广东来自Android客户端11楼2017-12-07 21:25
                    回复
                      这个吧据我观察活跃的不超过20个


                      IP属地:广东来自Android客户端12楼2017-12-07 21:26
                      收起回复
                        哇这个技术贴可以说是非常强了23333


                        IP属地:江苏13楼2017-12-07 21:40
                        收起回复
                          大佬好 不过我不需要激活码


                          来自Android客户端14楼2017-12-07 21:59
                          收起回复
                            太多人急功近利 那种人活该没码


                            来自Android客户端15楼2017-12-07 22:00
                            回复
                              2025-07-31 09:52:30
                              广告
                              不感兴趣
                              开通SVIP免广告
                              分析到位,奈何排位连跪


                              IP属地:上海来自Android客户端16楼2017-12-07 22:01
                              收起回复