UID82897性别保密经验 EP铁粒 粒回帖0主题精华在线时间 小时注册时间2021-7-23最后登录1970-1-1
|
我终于实现了某某世界的大字牌!当然,表现形式完全不同,就连它的底层原理——字符显示器,也是我原创的、独一无二的。
要在我的世界基岩版中显示更大的文字,一直是麻烦的事情。英文字母还好说,可以用旗帜。但是中文就没办法了,告示牌的字太小,地图画太麻烦了。
但是现在,如果装上我的万象添补附加包的 0.0.6 版本(此版本预计本周六发布),我们就可以按照如下流程在生存模式下显示文字。
首先,在工作台用六块圆石(或深板岩圆石或黑石等)摆成门的形状,合成三个石板。石板是一个新的用于记录文字的物品。
(三种石头可以混用。)
然后,合成一个唱片机(一圈木板,中间一个钻石),准备一个拉杆之类的能发出红石能量的玩意。
最后,在工作台用两块青金石,一点红石粉和五块圆石合成石板投影仪。配合着唱片机,它可以将石板的文字投影出来。
(其他圆石类合成材料均可。)
现在,我们放置一个唱片机,向后退一步,紧挨着唱片机放置石板投影仪,注意这个过程中玩家视角不能变,确保放置的投影仪的方向正确。

现在可以在石板上刻录要显示的文字了!右键或长按使用石板,弹出了一个菜单。
(第二个文本框不用管,之后我会替换成更简明的开关和滑块。)
在第一个文本框里输入要刻录的文字,这里以“我好饿”为例。理论上可以输入很多文字,但实际上我在 UI 层面做了限制,最多只能输入 32767 个字符。
在第二个文本框(以后会是一些开关和滑块)修改石板的文本显示设置。之后我会详细解释每个选项有什么用。
完成之后,点击下方的“刻录文本”,就可以把文本刻在石板上了(同时保存显示设置)。这时候,石板的二级描述栏(也就是 lore)会显示我们刚才刻录的文字。由于一些限制,这里的字符长度不能超过 50,所以如果我们刻录的文本过长,这里会显示省略号,但实际上确实是刻录了所有文字的。
之后,我们可以把石板装进唱片机里,手持石板右键点击唱片机即可。这时候,随便用各种红石能量源(比如拉杆或者压力板)激活石板投影仪,就可以把文字投影在世界中了。

投影出来的文字不是真实的——它只是投影。而且从技术层面讲,整个过程没有用到一个实体,因此 kill 命令影响不到这个投影。
刚才投影出的文字只是白色的,而且沿着水平面投影(也就是躺在地上)。
如果要修改文字的颜色,我们可以放一个炼药锅,里面加水,然后用染料给水染色。最后拿着石板点击炼药锅,就可以给石板染色。这时候把石板放进唱片机,配合石板投影仪,投影出来的文字就是染色的颜色。炼药锅里的水可以调色,红绿蓝三个整数分量各有 [0, 255] 的范围,因此一共有 16777216 种颜色,而这些就是石板能染的所有颜色。
但要想让它竖立起来,或者调整排版方式,就要修改石板的显示设置了。
这是默认显示设置的 JSON 文本表示:- {"plane":"xz",
- "additionalHeight":2,
- "invertU":false,
- "invertV":false,
- "horizontalSpacing":1,
- "verticalSpacing":0,
- "depthSpacing":0}
复制代码
下面来介绍 JSON 文本中每个字段对应的作用。
plane - 文字显示的平面,使用 xyz 字母组合。
xz - 水平投影文字,文字会躺在地上。
xy - 沿 Z 轴的垂直方向,X Y 轴的水平面投影文字,文字会挂在墙上。
yz - 沿 X 轴的垂直方向,Y Z 轴的水平面投影文字,文字会挂在墙上。
additionalHeight - 文字投影的高度,浮点数,负数即向下投影文字,正数即向上投影文字。数越大,投影离石板投影仪的距离越远。
invertU - 使文字水平镜像翻转。
invertV - 使文字垂直镜像翻转。这两个字段配合着 plane 字段就可以实现六个方向的文本渲染。
horizontalSpacing - 水平排版中每个字符的间距。如果设为 0,则不启用水平排版模式。如果设为非 0 的值,则启用水平排版模式。如果设为正数,文字从左向右排列。中文建议设为 1,西文建议设为 0.5。如果设为负数,文字从右向左排列。如果设为小数,则指定字符间距。
verticalSpacing - 垂直排版中每个字符的间距。详细解释与 horizontalSpacing 相同。
depthSpacing - 深度排版(第三个轴向的排版)中每个字符的间距。
最后这三个选项很有意思。本来我想给它做成开关,开启了竖向排版就不能开启横向排版,也没打算添加深度排版,但后来我想还是开放这个限制为好,毕竟这个系统有这个能力。
我们来说一说它们产生的效果。下文用 H 表示水平排版,V 表示垂直排版,D 表示深度排版,用 [x, y, z] 表示一个排列组合。
[1, 0, 0] - 沿着 X 轴将文字排开,每个字符的中心间距为 1 个方块。
[0, 1, 0] - 沿着 Y 轴将文字排开,每个字符的中心间距为 1 个方块。这时如果将平面设为 xz,那么文字会一个接一个地向上排开,层层叠叠,就像千层饼。这时,V 就等效于“深度排版”了——三维世界中的第三个排版方式。
[0, 0, 1] - 沿着 Z 轴将文字排开,每个字符的中心间距为 1 个方块。
[1, 0, 1] - 我们可以把 V 分量简化掉,形成 [1, 1] 的一个矢量,它是 [1, 0] 与 [0, 1] 相加的结果。是的,如果我们既设置水平排版,又设置垂直排版,结果就会是以原点为中心,排版方向为方向,排版间距为大小的两个矢量的和。换言之,水平排版和垂直排版一起使用,结果就会是斜向排版,文字会排成一条斜线。
[1, 1, 1] - 同理,如果加入 V 分量,我们就会得到在三维空间中的斜向上排版的文字。
[0.5, 0, 0] - 如果我们指定 H 分量为小数,那么文字会在水平方向上排开,而且水平字间距是 0.5 个方块。这种排版很适合英文等西文。
[-1, 0, 0] - 前面说的每个分量都是正数,如果是负数呢?答案是,反向排版。这里,H 分量是 -1,那么它会从右向左排文字。
它的基本原理其实是,取一个分量在对应的轴向上乘字符的大小再乘这个字符在整个字符串中的索引。
为什么会是这样呢?要回答这个问题,就需要说明字符显示器的原理了。
首先,我们都知道在 Unicode 编码中,每个字符都对应一个码位,我们常用的汉字的码位都是四位十六进制数,比如“我”的码位是 6211。
而我们又知道,原版资源包中 font 文件夹下存储着一套由 225 张图片组成的 unifont 字体文件,这就是原版 MC 所使用的字体。常见的一些图标,比如饥饿值的图标,也可以通过修改这些图片,再输入对应码位的字符实现。
我们还知道,粒子可以方便地显示一些图案,而且它引起的卡顿比实体引起的少多了。
于是,我们可以为每个平面每个字形文件,也就是存储在 font 文件夹下的那些 glyph_xx.png 图像,创建一个粒子。其他的特性,比如粒子大小,都可以通过传入 MolangVariableMap 修改。
现在,如果要显示多个文字,首先就要显示单个文字。我们可以获取单个字符的码位,前两位就是 glyph_xx.png 中的 xx,后两位转换成图片中的 UV 坐标,UV 坐标就是相对于纹理而言的二维坐标系。
然后我们把这些参数通过各种方式传入粒子,就可以显示单个文字了。之后,我们把要显示的字符串分割成含有长度为 1 的字符串的列表了。我们按顺序处理这个列表,把每个文字都显示出来,同时要考虑每个字符的位移。
这时候,我们就要获取这个字符串在列表中的索引了。而且,因为我们只能制作等宽字符,间距的宽度还要乘上一个字符的宽度。
因此,所谓水平排版、垂直排版、字符间距,实际上就是每次迭代渲染字符时的偏移。这个偏移是矢量,有大小,也有方向。 |
|