这种游戏如何开发?

开发这种地图,只是实现家具摆放功能。用什么游戏引擎,学习路线是什么。谢谢。

 

 

作者:猴与花果山
链接:https://www.zhihu.com/question/630177419/answer/3291077871
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这个无所谓引擎的,主要是一个制作的思路。这种2.5d视角的2000年初被大菠萝2带起来之后就很流行了,一度“韩国泡菜”(当年对来自韩国的网游的统称)都是大菠萝2换皮,这其中最出名的莫过于《传奇》,《传奇》是用Delphi5+WinGDI做的,没有任何引擎,包括现在这些做引擎的,甚至有不少听都没听过Delphi。所以这跟引擎无关,只要你思路到位了,用不用引擎都能做。那么言归正传,这玩意儿怎么做?学习路线是怎样的呢?

首先是TileBased

你别管他是不是斜45度,他都是tilebased,tilebased是一种逻辑数据,他是把你肉眼可见的“块”当做一个逻辑中的“点”来处理。你要做出这个画面里面的这些东西, 你在TileBased游戏里面得经历这样几个游戏制作的历练:

Step1,仓库番或俄罗斯方块

这也是我推荐给新人们的,就是如果你想入行做游戏,先动手做仓库番或者俄罗斯方块,当然大多傲慢的蠢货是不接受的,认为这种东西是侮辱了他们,简直可笑。

仓库番和俄罗斯方块都是标准的TileBased的,仓库番讲究的是静态的tileBased逻辑地图的概念,当你会做仓库番的时候,你就可以做FF、DQ(早年)那种游戏的大地图模式了,真别小看了仓库番这种麻雀虽小五脏俱全的玩意儿——仓库番里面藏着你走向游戏开发的道路包括:

  1. TileBased游戏地图逻辑上是怎样的:他的地图块是TileBased,也就是二维数组储存地图。很多教程里就告诉你每个地图块里面有个贴图id就行了,然后根据这个id来判断是否可过,这是不对的,每个地图块都是一个独特的struct,这是根据游戏设计来定的。但是无论如何,你首先可以学到的是,绝大多数游戏的地图,是一个YouStruct[,]二维数组结构。这是一个基底。
  2. TileBased游戏中并不是每一个单元格的东西都是单元格的数据:比如仓库番里面小人和箱子,都是一个单独的结构去记录的,而他们跟单元格的关系,是一个VectorInt InGrid,也就是他们逻辑上在那个格子里面。当你理解了这个之后,你会发现你图里面的格子里这些家具,实际上完全可以用这个方法去做,当然这中间还要做一个抉择就是数据存储量,这个抉择在今天已经不重要了,你要知道家具要有一个Vector2Int代表他的坐标就行了,每个家具都有一个Anchor单元格,这个家具的InGrid就是这个Anchor单元格在这里的作用,当然你只做仓库番是无法理解Anchor Grid的意义的。
  3. 角色在TileBased施如何运动的,是以单元格为单位运动的,这是为什么?因为从二维数组结构就可以看出他每个格子都只是一个点。所以有追求的人会发现什么?我仓库番、也包括早年的FF和DQ里面,角色推一下方向是走一格对吧,但是他不是瞬间就移动了一格了,这有个过程的,而且在过程中你推摇杆就没用了对吧?到这里你将会学会游戏正确的状态机和TileBased与世界坐标之间的转换关系。当然这个可能对你题目里的这个游戏作用不大,如果里面并不涉及角色移动的话。
  4. 寻路和UI技巧:到了今天了,你的仓库番总不能还是手柄上下左右操作移动对吧,得鼠标点击或者手指点击一个坐标,这时候角色能不能过去?不能过去是不是要一个表现(UI),能不能过去怎么做?走什么路过去怎么做?你会在这里接触到AStar和派生出AStar的Dijkstra

看明白了吗?做个俄罗斯方块,就是你做题目里面这个东西的基础,首先你得有tilebased相关概念。这个“Tilebased相关概念”可不是只有贴图问题(贴图是另一层问题),还有上面说的这些逻辑问题。

 仓库番,再标准不过的tilebased

为什么要做俄罗斯方块,就是他有“动态改变逻辑单元格”的能力在里面,学会这个,你的家具变动位置之后,阻挡信息怎么做才会清楚,家具阻挡信息总是要的对吧——我已经在(3,3)放了个桌子了,那么会覆盖到(3,3)的橱柜应该放不下来了对吧。

所以第一步,你得耐心的学习做一个俄罗斯方块和仓库番——就像武侠小说里学武功都是从挑水和扎马步开始的,上来就学个华山剑法的,最后都是被我们这种反派人物一下秒的。

Step2,类似火纹的SLG

接着为什么要做火纹呢?火纹里面藏着你这个游戏里面图里的另外一个问题(当然未必是火纹,英雄无敌也有这个问题)——就是火纹系列有些单位不是只站一个格子的对吧:

 火纹站多个格子的单位

 

在这里,你要学会的是上面提到的Anchor Grid的概念,就是虽然每个单位逻辑上的坐标只有一个Vector2Int,但实际上他可能占据了多格,这个多格并不是简单的“我再来个List<Vector2Int>代表他的offset坐标格”就行了,而是:

你的角色决定落点的时候,这些格子必须不能覆盖到一些格子或者棋盘外,这是需要解决的第一个问题对吧,所以你判断某个东西是否能放进某个格子,要判断的是一个坐标+一个offset数组对吧,通常来说你看到的教程,告诉你的都是判断一个坐标能否放置,这是大错特错的。

第二个是简单一点的,就是他作为阻挡者,在地图上占了多个单元格对吧。这个如果搞清楚了Tilebased的概念之后,并不是特别难以理解。

说到这里是不是和你图片里很多家具一样?

 没工具凑合看看

比如这个柜子,就是(3x1)或者(1x3)的对吧,同样比如床之类的会更大,而且还不一定是一个完整的矩形,所以你用Vector2Int作为offset,针对了一个代表他坐标的Anchor Grid就能解决,这是你要做一个这样的游戏要学的第二个东西

Step3,斜45度角(坐标系转换)

接着就是斜45度游戏,除了传奇大菠萝这样只有一层的,你还得有个多层的,所以得研究要做的是《皇家骑士团》like的游戏,在斜45度会遇到什么坑呢?

皇家骑士团就是这样典型的斜45度(2.5D)tilebased

 首先你得学会的是坐标轴转换,就是二维数组跟坐标系之间的关系,是平行世界关系,他并不是一个绝对的关系,也就是简单地说,二维数组可以用来储存平面俯视视角,也可以用来转化为其他视角,他们只是数据,所以这里就是一个简单的坐标到下标的转换问题:

 比如你用了这个坐标系,无非就是这样转换一下,当然草图的点没那么精准,但就是那个意思

接着就是一个贴图谁盖在谁上面的问题,用unity里面的说法就是sorting order的赋值问题,如果是平面俯视的,比如仓库番这样的,只要无脑越下面的格子越靠前就好了对吧,但是斜45度就有了一个谁覆盖谁的问题了,比如你问题图中的:

 

 最后也是一个天坑级的问题,就是我怎么知道我鼠标选中了那个家具?毕竟你看图里我鼠标点在了红圈内的一些位置,比如最左边,我是要点灶头还是点那个白板就很难说了对吧,这里也是要做一下皇家骑士团like才会遇到的,其实并不麻烦:

所以……

这个用什么引擎都能做,就放心的做吧,但在此之前,先学会上面说的一些知识和技巧即可。

 

提供几个关键词吧。

isometric

building

unity

如果英文水平够的话,去油管搜这几个词找教程就可以了。



作者:猴与花果山
链接:https://www.zhihu.com/question/630177419/answer/3291077871
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

posted on 2025-02-02 16:38  癫狂编程  阅读(50)  评论(0)    收藏  举报

导航

好的代码像粥一样,都是用时间熬出来的