使用资源包隐藏和调整 HUD 元素大小
快捷栏、准星和经验条都位于同一张纹理图集中。本文将介绍如何让其中部分内容变为不可见、哪些元素无法移动,以及用字体实现自定义 HUD 文本的技巧,替换用的图片必须和原图尺寸完全一致,尺寸不同就会被拉伸涂抹到变形。
隐藏快捷栏并没有什么配置选项。真正存在的是一张纹理——只要让其中一部分变透明,就能在视觉上将其移除,而一切功能照常运行。
所有内容都在同一个文件夹里
assets/minecraft/textures/gui/sprites/hud/
现代版本将旧的 widgets.png 图集拆分为一个个独立的精灵图(sprite): hotbar.png、crosshair.png、experience_bar_background.png、heart/full.png 等等。将其中任意一张替换为尺寸相同的全透明 PNG,即可将其隐藏。
对于任何你绘制的图像,尺寸相同都至关重要。 精灵图默认会拉伸以填满其槽位,因此如果画布更小、里面又有可见的图案,最终效果就会糊成一团。而全透明的精灵图无论什么尺寸都能隐藏——因为根本没有东西会被拉伸。
能做与不能做的事
能做:
- 通过将精灵图变为透明来隐藏任意元素
- 重新设计一切外观——不同的心形、极简准星、主题化快捷栏
- 在相同尺寸的画布内绘制更小的内容,从而改变视觉大小
不能做:
- 移动元素。位置是硬编码的,只有图像素材是数据。
- 独立于边框隐藏快捷栏的槽位——它们属于同一张精灵图。
- 改变槽位的功能。这纯粹是外观上的改动,物品依然可以被选中。
最后一点值得明确说明:隐藏的快捷栏仍然是快捷栏。这不是物品栏限制,玩家依然可以使用这些槽位。
九宫格陷阱
部分 GUI 精灵图是九宫格(nine-sliced)的——四角固定,边缘拉伸。在 HUD 中只有定位条背景是这种类型;而 gui/sprites/ 中其他地方的多数按钮和方框都是。PNG 旁边的 .mcmeta 文件会声明边框:
{ "gui": { "scaling": { "type": "nine_slice", "width": 200, "height": 20,
"border": { "left": 2, "top": 2, "right": 2, "bottom": 2 } } } }
如果替换这类精灵图时没有配套的 mcmeta 文件,它就会错误地拉伸。拿不准时,把原版的 .mcmeta 和你的 PNG 放在一起。
通过字体实现自定义 HUD 文本
真正强大的技巧:定义一个字体提供器(font provider),让它的字形就是图像,然后用 /title 或 Boss 栏来显示这些字符。文本就会渲染成你的图像。
assets/minecraft/font/default.json
把它放进 minecraft 命名空间,你的提供器就会与原版默认字体合并。如果改用你自己的命名空间,那么每个使用它的文本组件都必须声明,通过 "font":"my_pack:default"。
{ "providers": [
{ "type": "bitmap", "file": "my_pack:font/icons.png", "ascent": 8, "height": 9,
"chars": [""] }
] }
使用私用区码位( 及以上),这样就不会与真实文本冲突。然后 /title @a actionbar {"text":""} 就会在动作栏上绘制你的图像。
这就是服务器无需客户端安装模组、仅靠资源包就能显示自定义血条、货币图标和进度条的方法。
负空间字体
定义一个 advances 为负值的字形,就能让光标向后移动,从而将图像层层叠加。这就是那些看起来像正规界面的服务器 HUD 背后的技术。它很繁琐,但也是唯一能定位任何元素的方法。
在 HUD 定制器与字体包制作工具 中,隐藏或重新设计 HUD 元素,并用为你分配好的码位构建字体提供器。