GUI
目前,T88的GUI部分主要特点是:仅客户端、非Inventory/Container、尽量贴近原版风格、带有一些Swing风格。
目前API方法风格正在由单纯void setXXX
转变为Tthis setXXX
以便于链式调用,这两种方法风格可能会同时存在。
快速Q&A
-
Q:我可以将原版或者第三方的GUI类转移到T88吗?
-
A:可以。在大多数情况下,只需要实现
TWidget
接口即可。 -
Q:我要如何新建自己的组件?
-
A:继承
TPanel
即可。 -
Q:开发时懒得写Input,有什么方便的办法快捷地可以在游戏中查看我写的Screen吗?
-
A:在启动时指定property
t88.test_screen_override
的值为你所写的Screen的名称,进入游戏后按ctrl+T
,T88会简单地使用Class.forName
来查找你的Screen并尝试实例化一个(所以构造函数得是无参的),让MC显示它。
基础
在构造函数中使用add(TWidget child)
方法以添加子组件。继承于TWidget
的子组件会自动地被渲染(调用其render
方法),不需要您在render(PoseStack...)
中手动指出。
和Swing的LayoutManager
类似(不过没有那么高级),在layout()
方法中使用setBounds(int x, int y, int width, int height)
对子组件以相对坐标设置位置和大小。
如果要使用tick方法,请使用tickT()
方法。T88中与原版重名的方法均在后面加T
。
请注意,在正常情况下,重写layout()
、tickT()
、render(PoseStack...)
之后,你都应该在方法末尾调用超类的相应方法。即
@Override
void layout() {
child.setBounds...
...
super.layout();
}
结构图
这是一张T88的GUI类结构图,在新标签页打开以放大查看。不保证即时性和完整性。
以下文档并未覆盖全部方法。不建议使用/弃用/内部使用/一般不适用的方法不提及。
基础设施
HudManager
static void add(TComponent... tComponents)
static void remove(TComponent... tComponents)
添加/移除HUD组件。
static LinkedHashSet<TComponent> getChildren()
获取所有现存的组件。
TWidget
TWidget
是整个T88的基础,一切组件都实现此接口。
由于重名的缘故,对变量visible
的getter和setter为isVisibleT()
和setVisibleT(boolean visible)
。
ResourceLocation PLACEHOLDER_IMAGE
占位图片,16x16
的全透明图片。用于不允许填入null
为参数时使用。
boolean isVisibleT()
void setVisibleT(boolean visible)
检查/设置组件是否可见。注意此可见性会影响组件的交互性。但不会影响被tick。
void setBounds(int x, int y, int width, int height)
指定组件的位置和大小。使用相对位置,即(0,0)
表示父类的最左上角。
void setAbsBounds(int x, int y, int width, int height)
指定组件的位置和大小。使用绝对位置,即(0,0)
表示窗口(Screen)的最左上角。
Vec2i getPreferredSize()
返回组件自我建议的大小。以按钮为例,其返回(52,20)
表示一个长度为52,但高度为20的黄金比例大小。
没有指定建议的大小时应返回当前大小。
组件刚被构造出来时,当前的大小会是(0,0)
。调用没有被复写的getPreferredSize
可能会使组件行为不符合预期。
Vector2i getSize();
获取当前大小。
@Nullable
TComponent getParent()
获取父组件。
void setParentScreen(@Nullable TScreen parentScreen)
@Nullable
TScreen getParentScreen()
获取父Screen。仅当是Screen的直接子组件时有效。
@Nullable TScreen getTopParentScreen()
获取父Screen。是间接子组件时也有效。
int getXT()
int getYT()
获取组件左上角位置。坐标原点为窗口最左上角。
void renderTop(GuiGraphics graphics, int pMouseX, int pMouseY, float pPartialTick)
用于在一次Screen及子组件正常渲染完成之后再进行渲染。
boolean isInRange(double pMouseX, double pMouseY, double xPadding, double yPadding)
判断输入的鼠标位置是否在本组件的范围内。padding为向外延伸的容差值。
void onFinalClose()
在Screen关闭时调用,可以用于取消注册等。
@Nullable <T extends TWidgetT getParentInstanceOf(Class<T> c)
返回指定类型的父组件。若找不到则返回null
。
double getParentScrollAmountIfExist()
返回父滚动面板(TScrollPanel
)的滚动值。若无父滚动面板则返回0。
此返回值在向上滚动(向下滚滚轮)时为正,故若要将此用于鼠标判定修正,则取此数;若要用于渲染修正,则取相反数。
boolean isOutOfParentScrollContainerScissor()
判断是否在父滚动容器的显示范围之外。
TComponent
TComponent
是GuiComponent
和TWidget
的基本实现。
void add(TWidget child)
void remove(TWidget tWidget)
将组件添加到子组件表(或移除)。使得在本组件的layout()
、tickT()
、render(PoseStack...)
等方法执行完成之后,子组件的对应方法将被相应地调用。
void setBorder(Border border)
Border(int color, int thickness)
设置一个边界框。通常用于开发环境调试。
以0xAARRGGBB
格式指定边界框的颜色,指定边界框的厚度,正数为外边框,负数为内边界框。。
void setBackground(int background)
以0xAARRGGBB
格式指定背景颜色。
void setForeground(int foreground)
以0xAARRGGBB
格式指定前景颜色。前景颜色在此处并无实际作用。
void resizeAsHud(int screenWidth, int screenHeight)
作为HUD根面板时,更改窗口大小时被调用。
boolean isShowHudEvenLoggedOut()
void setShowHudEvenLoggedOut(boolean showHudEvenLoggedOut)
作为HUD根面板时,是否在玩家退出世界时关闭。默认在玩家 退出世界时关闭。
static void blitById(GuiGraphics graphics, int id, int x, int y, int width, int height, float uOffset, float vOffset, int uWidth, int vHeight, int textureWidth, int textureHeight)
static void blitById(GuiGraphics graphics, int id, int x0, int x1, int y0, int y1, int z, int uWidth, int vHeight, float uOffset, float vOffset, int textureWidth, int textureHeight)
使用id而不是ResourceLocation
绘制指定图片。用于绘制DynamicTexture
等。
void drawStringSingleLine(GuiGraphics graphics, Font font, Component text, float fontSize, HorizontalAlignment align, int minX, int maxX, int minY, int maxYOnlyForScissor, int color)
...
static void drawStringSingleLine(TWidget thiz, GuiGraphics graphics, Font font, Component text, float fontSize, HorizontalAlignment align, int minX, int maxX, int minY, int maxYOnlyForScissor, int color)
绘制文字,超出指定宽度时自动启用滚动。
基础组件
TPanel
TComponent
的封装。目前没有特别的功能。一切新组件都应该继承TPanel
。
TLabel
用于显示一行文字。
TLabel(Component s, int foreground)
指定要显示的文本,以0xAARRGGBB
格式指定文本的颜色。
void setHorizontalAlignment(HorizontalAlignment horizontalAlignment)
设置文本的对齐方式。提供左对齐、居中和右对齐。
void setFontSize(int size)
指定文本大小。默认大小为7。
void setLineSpacing(int lineSpacing)
指定文本行距。
void setAutoScroll(boolean autoScroll)
设置是否在文字超出组件宽度时自动滚动。
TSlider
滑动条。原版SliderButton
的T88封装。
实现了接口TResponder<T
标志着这个类有响应器。其中的T通常是组件自己或自己的值,在此处是滑动条的浮点数值。
TSlider(String title, double minValue, double maxValue, boolean showValueInTitle, @Nullable Component tipText)
TSlider(String title, double minValue, double maxValue, BiFunction<Component, Double, Component> getLabelFromCaptionAndValue, @Nullable Component tipText)
指定滑动条中央要显示的提示文字,最小值,最大值,是否在滑动条中央提示文字后附加显示当前值,悬浮提示;
指定滑动条中央要显示的提示文字,最小值,最大值,滑动条中央提示文字的生成函数,悬浮提示。
void setRelValue(double relativeValue)
void setRelValueWithoutRespond(double relativeValue)
double getRelValue()
以相对值指定滑动条的值,触发/不触发触发器,有上下限减剪除。以相对值获取滑动条的值。
相对值指数值百分比。范围0~1
,0为滑动条最左侧,1为最右侧。
不触发响应器适用于滑动条和其他组件相互进行更改的情况,避免无限相互调用。
void setAbsValue(double absoluteValue)
void setAbsValueWithoutRespond(double absoluteValue)
double getAbsValue()
以绝对值指定滑动条的值,触发/不触发触发器,有上下限减剪除。以绝对值获取滑动条的值。
绝对值即真实值。范围在设定的最小值和最大值之间,最小值在左侧,最大值在右侧。
TButton
按钮。原版Button的T88封装。
TButton(Component pMessage, OnPress pOnPress)
指定按钮上要显示的文本,指定被按下时的动作。
void setSkipRenderAsBackend(boolean skipRenderAsBackend)