Project1

标题: 哪位大神手里有地图的数据详解? [打印本页]

作者: 雪在燃    时间: 2018-1-31 16:25
标题: 哪位大神手里有地图的数据详解?
本帖最后由 雪在燃 于 2018-1-31 16:29 编辑

首先,基于某种蜜汁自信,我决定要写一个mv的随机地图生成脚本
然后,就卡在了地图数据上
地图数据相当鬼畜,是一个地图的长*宽*6长度的数组,而且不同自动元件有着不同的处理,简直让人头疼
不知道编辑器对这些进行了怎样的处理,于是就只能进游戏里捣鼓,然后慢慢的摸索编辑器是如何根据元件生成的数据结构

我还以为就是个简单友好的长*宽的数组

真是令人摸不着头脑
想要吐槽点什么发在水区,结果好像是求问贴了,因为脑袋已经变成了浆糊
作者: MeowSnow    时间: 2018-1-31 16:57

要不就不要自动原件了,对素材的衔接稍微修改一下,做一种即使是野外地图也是瓷砖的风格。
作者: 雪在燃    时间: 2018-1-31 17:20
MeowSnow 发表于 2018-1-31 16:57
要不就不要自动原件了,对素材的衔接稍微修改一下,做一种即使是野外地图也是瓷砖的风格。 ...

大神我根本看不懂你说的啥~
不过你可能理解错了,我是指画的地图,也就是map.json那个文件里,不同的元件代表不同的数字,想要一个详解
比如一个13x17的地图就是data:[0,0,0,2086,……]这个2086是啥
作者: chd114    时间: 2018-1-31 17:38
雪在燃 发表于 2018-1-31 17:20
大神我根本看不懂你说的啥~
不过你可能理解错了,我是指画的地图,也就是map.json那个文件里, ...

2086/2/2/2/2/2/2/2/2/2/2/2=1.018555
你确定是2086而不是2056吗···
如果想要弄清楚,感觉一步步修改地图可能能明白?mv的地图最小好像是可以改成1x1的,那就先从1x1开始,慢慢改1x2、2x2、2x3、3x3···然后对比数据的不同
作者: RaidenInfinity    时间: 2018-1-31 17:55
我觉得2楼和4楼不懂就别瞎比比了。这灌的一桶热翔水又烫又恶心。

楼主是真的懂程序真的有心要研究的话,我可以帮个忙。我算是研究了整半年的地图数据然后才成功制作了一个地图编辑器。
私信留QQ,一对一说比较好。不然啊,呵呵,你来水区发帖就得准备好被灌无营养的废水呗。




作者: 雪在燃    时间: 2018-1-31 17:57
RaidenInfinity 发表于 2018-1-31 17:55
我觉得2楼和4楼不懂就别瞎比比了。这灌的一桶热翔水又烫又恶心。

楼主是真的懂程序真的有心要研究的话,我 ...

发在水区就是希望能够吐槽的,这种事情发在提问区反而是一堆人看不懂而白白沉下去啦~
慢慢的研究也是有趣的一环~
作者: 芯☆淡茹水    时间: 2018-2-1 13:08
本帖最后由 芯☆淡茹水 于 2018-2-1 13:14 编辑

类似于 一键生成迷宫 的功能么?!
说实话,软件的地图图块素材可自由添加和变动,不同的地图图片各种景物的图块组成和搭配都不一样。
想象中就算做出可以自动生成地图的程序,所需要标注的东西也非常之多,对于地图需求量不是那么大的,还不如手动画地图。

以前也貌似看见过类似的:https://rpg.blue/thread-403319-1-1.html
作者: fux2    时间: 2018-2-1 15:12
很久以前研究过,现在忘的差不多了,不过每层的tileid似乎是包含了通行和地形标记之类的信息,
你可以参考一下Game_Map的autotileType函数,还有terrainTag函数,具体的忘光了(x

追加:
去翻了一下代码,
你把data里每个数字转成二进制显示大概就能看懂了。
2086包含的信息有但可能不仅有以下内容:
地形标记:2086>>12 = 1 (二进制首位)
图块种类:2086>= 2048 ? Math.floor((2086- 2048) / 48) : -1 = 0
通行:最后4位二进制数,代表4个方向的通行
作者: 雪在燃    时间: 2018-2-1 19:02
芯☆淡茹水 发表于 2018-2-1 13:08
类似于 一键生成迷宫 的功能么?!
说实话,软件的地图图块素材可自由添加和变动,不同的地图图片各种景物 ...

游戏运行时的随机地图,用来提供游戏性的
作者: 雪在燃    时间: 2018-2-1 19:04
fux2 发表于 2018-2-1 15:12
很久以前研究过,现在忘的差不多了,不过每层的tileid似乎是包含了通行和地形标记之类的信息,
你可以参考 ...

是用地图数据来生成地图数据,脚本读取的是已经生成好的,所以不能反推出数据是如何表示的呢
作者: SailCat    时间: 2018-2-1 19:06
长X宽X6的数组含义如下:
[p, a, c, k, e, d]
p:第一层的图块ID
a:第二层的图块ID
c:第三层的图块ID
k:第四层的图块ID(此处是2086,应该是A1的第1个图块)
e:图块的通行标记,具体为:
  1 下通行不可
  2 左通行不可
  4 右通行不可
  8 左通行不可
  16 优先级
  32 柜台标记
  64 伤害地形
  128 梯子标记
  256-2048 地形标志
  (这条具体记不太清了)
d:区域ID(0-255)
作者: RaidenInfinity    时间: 2018-2-2 17:44
虽然已经私聊向楼主解释了,不过我还是发出来科普一下吧。

VA和MV的地图数据基本上是一样的,只是MV多了一个上层。
获取数组里某个数值的指标的公式是: (z * 高度 + y) * 宽度 + x

MV地图的层数如下(z坐标):
0 - 下层1(A1~5图块)
1 - 下层2(A1或A2图块的草丛等装饰)
2 - 上层1(B~E图块)
3 - 上层2(同上,VA缺了这层)
4 - 影笔
5 - 区域ID




那么各层内的数值代表什么呢?第1~4(Z坐标0~3)层都是一样的。
我们来看MV的rpg_core.js里的定义:

  1. Tilemap.TILE_ID_B      = 0;
  2. Tilemap.TILE_ID_C      = 256;
  3. Tilemap.TILE_ID_D      = 512;
  4. Tilemap.TILE_ID_E      = 768;
  5. Tilemap.TILE_ID_A5     = 1536;
  6. Tilemap.TILE_ID_A1     = 2048;
  7. Tilemap.TILE_ID_A2     = 2816;
  8. Tilemap.TILE_ID_A3     = 4352;
  9. Tilemap.TILE_ID_A4     = 5888;
  10. Tilemap.TILE_ID_MAX    = 8192;
复制代码


从上面的定义里我们可以看到:
B图块是0~255,C图块是256~511,D图块是512~767,E图块是768~1023,A5图块是1536~1663。
这些图块都是非自动的图块,是直接绘制上地图的。理解上应该没什么问题。

A1是2048~2815。其中一共多少个ID呢?答案是768个(包括2048)。
那下一个问题是,A1有多少种图块?水面啊浮萍啊瀑布啊什么的。2排,一排8格,所以一共16种。
768 / 16 = 48。这儿我们可以知道的是,一种图块最多可以占48种差分。
这个公式对A2,A3,A4也适用。

于是3楼提到的2086是啥?我们来算算。
2086位于2048和2815之间,所以是A1类型的图块ID
2086 - 2048 = 38。是A1类型的第39个图块ID。(注:要从0开始算)
38 / 48 = 0 然后 38 % 48 = 38
所以,我们可以知道的是,2086是A1类型的第一种图块第39个差分

如下图所示:(这2年前为了研究地图数据弄的东西…)

噢,原来是这个图块差分啊。真的假的?嘛,那我们进游戏实测一下。我目前没有MV,所以用VA来顶替一下。
各位知道怎么获取一个坐标的图块ID吗?要用脚本?不。事件就够了。


获取坐标0,0第一层的图块ID,放进1号公共变量里。

成果是?


好,那就对了哟。




现在我们知道了,图块ID 2086 是第一种A1图块的第39个差分。那为什么会画出这个形状出来的呢?
我们来看MV里的定义:

  1. Tilemap.FLOOR_AUTOTILE_TABLE = [
  2.     [[2,4],[1,4],[2,3],[1,3]],[[2,0],[1,4],[2,3],[1,3]],
  3.     [[2,4],[3,0],[2,3],[1,3]],[[2,0],[3,0],[2,3],[1,3]],
  4.     [[2,4],[1,4],[2,3],[3,1]],[[2,0],[1,4],[2,3],[3,1]],
  5.     [[2,4],[3,0],[2,3],[3,1]],[[2,0],[3,0],[2,3],[3,1]],
  6.     [[2,4],[1,4],[2,1],[1,3]],[[2,0],[1,4],[2,1],[1,3]],
  7.     [[2,4],[3,0],[2,1],[1,3]],[[2,0],[3,0],[2,1],[1,3]],
  8.     [[2,4],[1,4],[2,1],[3,1]],[[2,0],[1,4],[2,1],[3,1]],
  9.     [[2,4],[3,0],[2,1],[3,1]],[[2,0],[3,0],[2,1],[3,1]],
  10.     [[0,4],[1,4],[0,3],[1,3]],[[0,4],[3,0],[0,3],[1,3]],
  11.     [[0,4],[1,4],[0,3],[3,1]],[[0,4],[3,0],[0,3],[3,1]],
  12.     [[2,2],[1,2],[2,3],[1,3]],[[2,2],[1,2],[2,3],[3,1]],
  13.     [[2,2],[1,2],[2,1],[1,3]],[[2,2],[1,2],[2,1],[3,1]],
  14.     [[2,4],[3,4],[2,3],[3,3]],[[2,4],[3,4],[2,1],[3,3]],
  15.     [[2,0],[3,4],[2,3],[3,3]],[[2,0],[3,4],[2,1],[3,3]],
  16.     [[2,4],[1,4],[2,5],[1,5]],[[2,0],[1,4],[2,5],[1,5]],
  17.     [[2,4],[3,0],[2,5],[1,5]],[[2,0],[3,0],[2,5],[1,5]],
  18.     [[0,4],[3,4],[0,3],[3,3]],[[2,2],[1,2],[2,5],[1,5]],
  19.     [[0,2],[1,2],[0,3],[1,3]],[[0,2],[1,2],[0,3],[3,1]],
  20.     [[2,2],[3,2],[2,3],[3,3]],[[2,2],[3,2],[2,1],[3,3]],
  21.     [[2,4],[3,4],[2,5],[3,5]],[[2,0],[3,4],[2,5],[3,5]],
  22.     [[0,4],[1,4],[0,5],[1,5]],[[0,4],[3,0],[0,5],[1,5]],
  23.     [[0,2],[3,2],[0,3],[3,3]],[[0,2],[1,2],[0,5],[1,5]],
  24.     [[0,4],[3,4],[0,5],[3,5]],[[2,2],[3,2],[2,5],[3,5]],
  25.     [[0,2],[3,2],[0,5],[3,5]],[[0,0],[1,0],[0,1],[1,1]]
  26. ];
复制代码

我去!这么多数字!这个复合数组表里面存着的是地面图块差分的绘制方法。一共有48种,对应48个差分ID。
地面指素材图内原图有2x3格的图块种类。除此之外还有2x2的墙壁(WALL,16个差分)还有2x1(WATERFALL,4个差分)的瀑布类型。

这是A1的第一个图块的素材图(的其中一帧):


自动图块是怎么绘制的呢?首先,这个2x3的素材图需要拆成4x6的半格。


然后,系统会按照表格里指定的区块进行整合。
第39个差分的表格是[[2,4],[3,4],[2,5],[3,5]]


这就是VA/MV的自动图块绘制的原理。




那么编辑器是怎么知道要放这个差分的呀?
答案是检查图块的四周是否有相似的图块,来做出判定。
地面和墙壁的算法是不同的。地面只需要检查周围,但是墙壁要牵涉到整面墙。





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1