0xAA55 发表于 2017-2-28 23:14:34

【VB6】Minecraft地图画生成器:使用抖动算法,支持用户自定义图片,生成bash脚本(给服务器用)


下载地址在后面。

之所以不像上个版本那样直接发送命令到MC窗口是因为……那会让用户无法操作电脑上的其它东西,并且,现在因为支持很大的图片,命令很多而又不好做中止功能的话,实在是令人头疼。
所以干脆让它能自动在当前文件夹目录下生成一个txt文本和一个bash脚本,Linux服务器端直接执行这个bash脚本就行了。

这个bash脚本又是怎么发送服务器命令到服务器后台的呢?其实不是什么靠谱的办法,说白了就是常见的往screen的stdin写入字符的方式来完成的。



每发送一条命令就sleep 0.05秒,而MC的游戏刻是20分之一秒,正好是这个时间。当然这些设定都可以调整。
为了考虑国际化,我这些功能都用英文写。现在请看功能介绍。


其中“凹凸”调色板,含义是根据MC对地图颜色处理的原理,凸起和凹陷的地图,有特殊的颜色处理。打个比方,我在超平坦世界里放置了一个方块,那么因为这个方块是凸起的,它的南面紧贴着它的位置并没有比它更高的方块,于是在地图上,它的颜色比它本身的平均色更亮,而它南面那个方块,因为比它低,所以颜色更暗。

借助这个特性,我们可以利用方块的位置高度差,来创建颜色更丰富的地图图像。



调色板数据,我是从这里获取的:
http://minecraft.gamepedia.com/Map_item_format
但1.10和1.12的调色板我是靠自己找出追加的新方块来确定的。顺带,我不知道,这个wikipedia描述的每种方块都有4种调色板颜色的第四种颜色到底怎么获取。所以我直接无视了其中的第四种暗色,而取用了前面三种颜色。

顺带对于颜色降级的处理,抖动算法可以解决颜色降级的问题,也就是,如果我们把真彩色(16777216色)降级为调色板颜色,我们如何通过仿色来还原最终的效果,这里请看下面的资料:
https://en.wikipedia.org/wiki/Ordered_dithering
https://en.wikipedia.org/wiki/Floyd%E2%80%93Steinberg_dithering

最后,我会放出整个程序的源码和bin,欢迎大家下载。


要下载的话还请注册会员哦~

嗷嗷叫的老马 发表于 2017-3-1 03:54:11

http://img01.sogoucdn.com/app/a/100520032/e179http://img01.sogoucdn.com/app/a/100520032/e179http://img01.sogoucdn.com/app/a/100520032/e179http://img01.sogoucdn.com/app/a/100520032/e179http://img01.sogoucdn.com/app/a/100520032/e179http://img01.sogoucdn.com/app/a/100520032/e179http://img01.sogoucdn.com/app/a/100520032/e179

大爱夏娜 发表于 2017-3-1 10:00:15

感谢楼主~

LuLu-001 发表于 2018-3-4 17:53:45

好东西mark了

0xAA55 发表于 2018-3-5 16:09:50

更新了一下,解决持续的“上坡”或“下坡”带来的突破高度限制的问题,以及水方块到处乱流的问题。

因为建造高度的限制是256格,而如果有一列像素它使用的方块总是“上坡”或者“下坡”的话,有时候就会超出边界。

以前的做法是用一个对话框提示一下,如果没被点“取消”的话,它就继续生成命令出来了——比如/setblock 0 777 0这种Y值严重超标的命令,导致设置方块失败的问题。

解决办法是,当一个方块因为“上坡”或者“下坡”超出了边界的话,那就往前逆推,伺机上下调整前面的整体的方块,来保证在画面不会变化的情况下,通过让前面的“上坡”或者“下坡”由1格变为多格,来空出高度。

而如果得不到调整的机会——比如前面整体全都在“上坡”或者“下坡”,持续爬升256格或者降低256格,没有转折的话,那就干脆制造几个颜色不对但不起眼的像素,来“破罐子破摔”、无视高度重新生成方块。这样会产生几个亮度错误的方块,但开了抖动的话就看不出来了。

此外水流的问题,我是用/fill命令把水方块周围用特定方块(可以修改的,默认是glass 0)围起来,不让水乱流。这个选项可以关掉。此外,在“平坦调色板”模式下你不需要把水方块围起来——除非你设置的初始Y较高,然后不喜欢水一直往下流。

这个修复过的版本是有个版本号的,1.0.0.2。

啥时候有空了我把它改成能自动生成mca文件的。

Ayala 发表于 2018-3-19 20:33:01

让数据维持在区间
a + (b - a) / 2 + (b - a) * (数据 - 数据中值) / (数据中最大值 - 数据中最小值)
计算机中求区间中值经常用 a + (b - a) / 2 而不是 (a + b) / 2的方式 因为后者溢出几率高很多:(
这样就可以让方块维持在了

0xAA55 发表于 2018-3-20 10:19:45

Ayala 发表于 2018-3-19 20:33
让数据维持在区间
a + (b - a) / 2 + (b - a) * (数据 - 数据中值) / (数据中最大值 - 数据中最小值) ...

这里地图画的“坡度”的数据是不能用简单的插值方式来压缩高度的。它的+1和-1的过程就是定死的。你可以把+1改成+2、+3、+4、+255等,或者把-1改成-2、-3、-4、-255等。因为Y值的高度+1会让颜色变亮,-1会让颜色亮度变暗。所以如果使用了插值的话,一整条纵列都会有几个颜色异常的像素,影响较大。

Ayala 发表于 2018-3-21 19:44:32

本身就是有损压缩 不过这样可以让曲线变得平滑一些 这应该属于基本的投影问题 +1、+2、+3、+4、+255 转换成 + fix(1 * 梯度),+fix(2 * 梯度)、+fix(3 * 梯度)、+fix(4 * 梯度)、+fix(255 * 梯度) 两种不同做法有不同的效果 好比一幅画,其中有几个部分浸了水 还是整幅画均匀的漂洗了下

xxdoc 发表于 2018-5-6 07:24:41

我的世界吗.看到像素样的游戏界面,头痛

Alter 发表于 2018-8-21 17:18:44

真的厉害啊,我们这些肥宅看呆了

Tao0Lu 发表于 2018-8-22 13:02:33

本帖最后由 套路 于 2018-8-22 13:07 编辑

然而1.13羊毛声明颜色的方法不一样了

0xAA55 发表于 2019-4-23 21:06:03

套路 发表于 2018-8-22 13:02
然而1.13羊毛声明颜色的方法不一样了

1.13有一个“平坦化”的设定,把所有物品的名字都微调了一下。
新一代的地图画生成器我打算做成直接写mca文件的那种方式。
我正在啃mca文件和NBT标签。

Tao0Lu 发表于 2019-8-13 18:23:20

本帖最后由 套路 于 2019-8-13 21:38 编辑

对了,生成立体羊毛48色那个有bug,好像因为for(For I = 0 To m_NumColors - 1)循环声明羊毛颜色设置错了,有些setblock和fill羊毛后的nbt会大于15
顺便说一下,可以试试用schematic来做。
这个文件是mcedit用的,java版地图和基岩版地图都可以使用。用NBTExplorer来查看NBTExplorer
我研究了一下,它使用zip压缩字符的,有长宽高3个变量、DATA(也就是setblock后面那个0~15的数字)、biomes(生物群落,默认全是1就可以了)、Blocks(这个都是数字ID)、Materials(默认Alpha就是了)和实体(全0就是了)。
WIKI上有介绍,但是其中很多都是不需要的。
Schematic
mcedit
mcedit2
我也在试着做,但是写入文件要48,530,904,089次循环,直接卡住了,正在想办法呢。

0xAA55 发表于 2019-8-15 03:24:51

套路 发表于 2019-8-13 18:23
对了,生成立体羊毛48色那个有bug,好像因为for(For I = 0 To m_NumColors - 1)循环声明羊毛颜色设置错了, ...

我直接就忽略了mcedit,你说的那些我都知道,schematic也考虑过。但我不想使用mcedit。

此外,我现在考虑用function来快速执行大量命令。

MCA文件我已经啃完,生成mca问题也不大。



Tao0Lu 发表于 2019-8-15 22:48:08

本帖最后由 套路 于 2019-8-16 14:13 编辑

0xAA55 发表于 2019-8-15 03:24
我直接就忽略了mcedit,你说的那些我都知道,schematic也考虑过。但我不想使用mcedit。

此外,我现在考 ...

schematic做错什么,为什么直接忽略她了。
我觉得不错啊,很多地图作者都用mcedit,格式也比较简单,基岩版和java都能使用,就是作者更新的慢。
mcedit离得远会默认羊毛为白色
页: [1]
查看完整版本: 【VB6】Minecraft地图画生成器:使用抖动算法,支持用户自定义图片,生成bash脚本(给服务器用)