跳到主要内容

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:在启动时指定propertyt88.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类结构图,在新标签页打开以放大查看。不保证即时性和完整性。

image

信息

以下文档并未覆盖全部方法。不建议使用/弃用/内部使用/一般不适用的方法不提及。

基础设施

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

TComponentGuiComponentTWidget的基本实现。

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)

只取消渲染,但不像setVisibleT那样也取消功能。

void setOnPress(OnPress onPress)

指定被按下时的动作。

TCycleButton<E>

循环式按钮,在选项元素中循环切换。继承于TButton,而非继承于原版CycleButton

选项元素是内部类Entry,含有实际内容E content和响应器Consumer<TCycleButton<E>>

建议泛型E实现接口ToTranslatableString,以指定语言文件中的键值。未实现的E将直接调用toString()

TCycleButton(Collection<Entry> entries)

指定选项元素。

void addElement(E e)
void addElement(E e, Consumer<TCycleButton<E>> consumer)
void addElement(Entry e)
void removeElement(E e)

添加/移除选项。不指定被选中时的触发器并自动包装为Entry,指定选中时的触发器并自动包装为Entry,直接添加Entry

信息

Entryequals方法经过重写,以实际内容字段E content为准,而不论响应器字段。故你可以使用removeElement(new Entry(twidget ))来移除对应的选项。

int getSelectedIndex()

返回当前被选中的选项序号。

LinkedList<Entry> getValues()

返回所有选项。

@Nullable Entry getSelected()

返回被选中的选项。当无选中的选项时返回null

void select(int index) throws IndexOutOfBoundsException
void select(Entry entry)
void select(E content)

选择指定的选项。

被选中的元素会触发其响应器Consumer<TCycleButton<EonSwitched>

发出事件TWidgetContentUpdatedEvent

TSelectList<E>

选择表,原版ObjectSelectionList<TSelectList<E>.Entry>的T88封装。

TCycleButton<E>相似,选项是内部类Entry,含有实际内容E content和响应器Consumer<TSelectList<E>>,以及可以单独指定的前景色Integer specialForeground`。

建议泛型E实现接口ToTranslatableString,以指定语言文件中的键值。未实现的将直接调用toString()

添加/移除选项同TCycleButton<E>

TSelectList(int pItemHeight, int scrollbarGap)

指定每栏的高度,指定主要区域和滚动条的间隙大小。默认为20和0。

void setScrollbarGap(int scrollbarGap)

指定滚动条与选择列表之间的间隙。

void setForeground(int foreground)

指定选项前景色。

void setBackground(int background)

指定选项背景色。

void setSelectedForeGround(int selectedForeGround)

指定选项被选中时的前景色。用于强调。

void setHorizontalAlignment(HorizontalAlignment horizontalAlignment)

指定选项显示文字的对齐方式。默认是居中。

void setSelected(@Nullable TSelectList<E>.Entry pSelected)
void setSelected(int index)

选择指定的选项,与TCycleButton<E>类似。填入null即为取消选择所有。

被选中的元素会触发其响应器Consumer<TSelectList<E>>

但不会发出事件TWidgetContentUpdatedEvent

TEditBox

输入框,原版EditBox的T88封装。实现了接口TResponder<String

在被聚焦时发出事件EditBoxFocusedEvent,由其他输入框接受并取消自己的聚焦状态。防止多个输入框同时显示为聚焦状态。

在输入内容时发出事件TWidgetContentUpdatedEvent

TEditBox(Component tipText)

tipText暂不起实际作用。

void setEditable(boolean pEnabled)
boolean isEditable()

指定/获取是否可以被编辑。若指定为不可编辑时没有输入内容,则显示不可用

void addResponder(Consumer<String> responder)
void clearResponders()

添加/清除响应器。响应器在修改内容时触发。

TImage

显示一张图片。

TImage(ResourceLocation imageLocation)

填入图片路径即可。

void setImageFit(ImageFit imageFit)

指定图片展示时的契合方式。提供FILL填充、FIT适应、STRETCH拉伸和TILE平铺。参考桌面壁纸设置方式。默认为FILL填充。

void setScale(float scale)

指定图片的大小缩放。仅推荐在TILE模式下使用。默认值为1。

void setAlpha(float alpha)

指定透明度。

void setImageLocation(ResourceLocation imageLocation)

重新指定图片路径。

TTimer

计时器。

TTimer()
static TTimer newTimerAndStart()
static TTimer newTimerCountDown(int secs)
static TTimer newTimerCountDownAndStart(int secs)

创建一个计时器。立即开始。倒计时器。倒计时器并立即开始。

public void start()
public void pause()
public void resume()
public void stop()

启动/暂停/恢复/停止计时器。停止计时器指仅停止显示变化。

void setPrefix(String prefix)

指定计时器数字前的文字。

void setShowFullFormat(boolean showFullFormat)

指定显示完整数字格式。完整数字格式指高位为0时保留。

void setKeepDigitsLength(boolean keepDigitsLength)

指定补足数字前的0。防止数字长度频繁变化。

void setShowMillis(boolean showMillis)

指定是否显示毫秒数。

void setShowUpto(TimeCategory showUpto)

指定最高显示的级别。

void setCountdown(boolean countdown)

指定正计时或倒计时。

void setCountDownSec(int countDownSec)

指定倒计时时长。单位为秒。

void setTime(long time)

指定计时器内部存储的时长。

TDotChart

TODO 暂不成熟


复合组件

TTitledComponent<T extends TWidget>

这是一个组合组件,用于给某个组件添加一个标题。

提供的实现有TTitledButtonTTitledCycleButton<ETTitledEditBoxTTitledSelectList<ETTitledSimpleConstrainedEditBoxTTitledSuggestedEditBox

子组件的位置在defaultLayout()中被自动地设置。若要手动指定其位置,请重写defaultLayout()(而不是layout()),不需要在最后调用超类的此方法。

标题默认为左对齐。

就像这句话相对于下面这个引用框一样。

int getGap()
void setGap(int gap)

返回(指定)标题与组件的间隙大小。默认为0。

int getLabelHeight()
void setLabelHeight(int labelHeight)

返回(指定)标题的高度。默认为12。

以下是三种更高级的输入框。

TSimpleConstrainedEditBox

特殊的TEditBox,允许简单地限定输入内容。

TSimpleConstrainedEditBox(ArgumentType<?argument)

填入所需ArgumentType的实现即限定允许输入的内容。在检测到非法输入时,输入框内的文字将变为红色。

TCommandConstrainedEditBox

借用原版指令系统来进行更高级的判断。

TCommandConstrainedEditBox(Consumer<CommandDispatcher<CommandSourceStackconsumer)

填入一个Consumer,像编写原版指令那样对CommandDispatcher<CommandSourceStack进行任何你想要的处理。

未经完整测试。不保证实现Commands的所有功能。

TSuggestedEditBox

在限定输入上与TCommandConstrainedEditBox相同,额外地在输入时提供一个候选菜单。使用键盘的移动选择框,tab填入选中项。