Godot在2D环境的仿3D游戏的图层计算

引子

我所用的游戏引擎是Godot,一个用c++写的开源2d/3d游戏引擎,代码托管在github上,拥有一套比较完整的工具,并且使用整个引擎做的游戏对于版本管理工具比较友好,有自己的脚本语言(语法类似Python)。具体的可以到官网上面去看介绍(英文)。

游戏

下面是我做的游戏的一些大致机制的抓屏。


123

可以看到,这是一个固定视角的伪3D游戏,具体操作是通过使用上下左右四个方向来使方块移动,从而是方块达到一定的高度或形状。

问题

我一开始学整个引擎的时候都是在2d环境下制作游戏,而且这个游戏的贴图都是2d的像俗画,所以我在做这个游戏小样的时候就也没有多想,直接在2d环境下开干了。

但是即使我对每个方块都设置各自在整个三维网格中的座标,2d环境能够给我的就只是哪些图片(在我这个游戏中就是方块的贴图)往哪个方向移动,哪些图片先渲染(会被后面的遮住),哪些图片后渲染(不会被遮住)而已。所以为了让整个网格显示正常,必须手动来处理这个网格的渲染顺序,或者说处理好方块的渲染顺序。

引擎

Godot引擎的游戏的制作方法是以“节点”的方式制作,每个节点可以是不同种类的东西,也可以是另外制作好的“节点”,每个独立制作的节点成为“场景”(scene),而节点的顺序,就是引擎渲染的顺序,有撒谎哪个到下依次渲染,所以最下面的节点是最后渲染的。
如果有一个跟节点类型为 Node2D ,字节点是3个TextureRect,那么不论这三个TextureRect的贴图大小如何,位置如何,最下面的TextureRect是不可能被前两个TextureRect遮挡住的。

不过对于 Node2D ,有一个属性是 Z Index ,这个属性是引擎中的 Z 轴,相当于在你手垂直举着一张纸时垂直于直面的一条线。有了这个,就能手动地控制哪些方块在哪些方块的上面了。

设定

游戏内的座标


座标
  • 游戏座标 :是指在上图网格中的座标
  • 引擎座标 :是指在游戏引擎中的座标

计算方式

接下来就是真正的计算方式了,嘿嘿

first try

这里要先弄清楚一点,在上图中最下面的格子中的方块的图层肯定是会比在座标原点的格子的方块图层要高,也就是说最下面的方块的引擎内z轴一定会会比原点的方块高,绝对不会被原点的遮挡的。

那这样的话,即使游戏内是在同一层,也需要根据游戏内x轴和游戏内y轴来计算图层,那在统一层的话是怎么算图层的呢?

从原点开始看吧,在原点的方块上,不论是往游戏内的x轴还是游戏内的y轴方向上移动一格,引擎内的z轴都应该加1(或一个计量),然后在那个格子再继续的话也是加1。那么照这样算,在游戏内z轴相等,也就是同一层的情况下,引擎z轴的计算公式是:

  • 引擎z轴 = 游戏x轴 + 游戏y轴

然后因为游戏内的网格有z轴,也就是类似于”层“的概念,我就非常简单地将每一层叠加起来,所以对于所有方块:

  • 引擎z轴 = 游戏最大x轴 * 游戏最大y轴 * 游戏z轴 + 游戏x轴 + 游戏y轴

这样做的问题

正如你在上面的动图中看到的,方块的移动有时侯会跨”层“。如果使用这样的算法,就会出现方块下降层的时候北原先后面的方块遮挡住,或者上升层的时候遮挡住原先在前面的方块挡住。

finished one

上面这个问题一开始我还没有发现,因为我做一些测试地图的时候,都会做一些比较简单的图来测试。

不过这个问题的解决办法骑士一开始就已经有了,只不过我没有反应过来。那就是既然在同一个”层“上是 x+y ,那么在此基础上,把 x+y 作为一个独立的轴,加上 z ,好像就可以了。

所以对于所有方块:

  • 引擎z轴 = 游戏x轴 + 游戏y轴 + 游戏z轴

这样不论什么情况都不会出现不正确遮挡的问题,下面的两张图能比较好地证明这个:

1.gif

2.gif

写在最后

公式很简单,但是我却花了很多时间去调试第一条公式,不断地调整,试过在每两层之间添加一个过渡层,但是因为引擎本身的图层渲染顺序会有时候看不出来问题。不过有前辈说过,写程序的时候走的弯路都不是弯路。幸好最后都想出来了正确的做法,花的时间应该都是值得的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容