最近在 Bilibili 上看到一个 SlopeCraft 的介绍视频。这是一个可以在 Minecraft JE 中创建高质量地图画的工具。
受此启发,我开始思考如何在 Minecraft BE 中实现高质量地图画。
啊,问题有点大
不同于 JE 直接使用 NBT 来存储游戏数据,BE 使用的是 经过 Mojang 修改的 LevelDB 来存储数据。不过,存在如 MCC Tool Chest 等工具可以读写 BE 的存档数据,可惜这一工具并不开源。
但是,BE 似乎不像 JE 那样能够获得指定 ID 的地图。这亦有可能是我技术水平有限,欢迎各位指正。
不过,也有好事
在 JE 中,地图(128*128)的 colors 字段大小为 128*128 = 16384 bytes;而在 BE 中,这一字段的大小为 128 * 128 * 4 = 65536 bytes !经过测试,BE 地图中像素的颜色是通过 RGBA 来定义的,这就是说,在 BE 中可以做到色彩的完全还原。
开始吧
调整你的图
首先,调整你图片的大小:将图片的较短边大小调整为 128 的整数倍。我建议这个大小不要超过 512 (128的4倍)。
之后,确认图片的另一边是否为 128 的整数倍,若否,建议裁剪图片。若倍数过大(如大于6),建议重新调整大小。
下一步,切图。
由于单张地图只能显示 128 * 128 的内容,需要将图片分切。下方提供了一个基于 Pillow 的示例 (图片名为 target.png):
from PIL import Image
def cut(file):
name = "./"+file+"_block_"
im = Image.open(file)
n = 1
x1 = 0
y1 = 0
x2 = 128
y2 = 128
w = im.size[0]
h = im.size[1]
while x2 <= w:
while y2 <= h:
d = str(n)
d = (4-len(d))*'0' + d
opt = name+d+".png"
im2 = im.crop((x1, y1, x2, y2))
im2.save(opt)
y1 = y1+128
y2 = y1+128
n = n+1
x1 = x1+128
x2 = x1+128
y1 = 0
y2 = 128
return n-1
re = cut('./target.png')
print(re)
在本例中,我们获得了24张分切之后的图片:
之后,就是将这些图片转移到游戏之中。这里提供一种最稳妥的方法。
摆到世界里
首先,打开你的 Minecraft Bedrock:
因为在切图过程中获得了24张图片,所以需创建24张地图。
请不要使用 give 命令获得24张已创建的地图,这实际上是同一张。
在创建地图之前,我们建议摆设部分标志性物品,便于稍后识别。
请确保每张地图都加载过,否则不利于识别。
完成之后,关闭这个世界。
这时候,我们需要用到另一个东西: MCC Tool Chest
打开你的地图,展开 data :
如你所见,框出来的内容中的一部分便是地图。
剩下很大一部分都是不知道干嘛的,我们只需要关注带有 scale: 0 的条目即可。
查看你的地图,确保是刚刚创建的:
显而易见的,之后就是点击 Change Image 来导入之前切割完成的图片:
依次将24张地图全部处理完成之后,重新打开你的世界。
好耶!之后就是把这些地图按序摆起来。
好!完事,收工。
后话
我承认,这是一个很繁琐的方法。我也相信,存在更容易的方法。
借用影视飓风的4个字:
无限进步!
补一个 MCC Chest Tool 下载地址: https://mcctoolchest.weebly.com/download.html