GUI
在本节,我们将创建我们自己的GUI。
在开始之前,我们还是要注意一下,GUI的相关操作只能在客户端进行,不能在服务端进行。有关的将会在下一节讲解。
我们在3.3.3章节创建了一个铁箱子,那么我们现在就来给它添加GUI。
创建GUI
首先,我们要创建类IronChestScreen.java
,并使其继承Screen
类。它还要求你传入一个标题,类似于这个GUI的ID,我们填入即可。
public class IronChestScreen extends Screen {
public IronChestScreen() {
super(new StringTextComponent("iron_chest"));
}
}
然后就是GUI的组件和渲染部分了。组件在init()
方法添加,渲染在render()
方法进行。
添加组件
首先,我们覆写init()
方法。在Screen
中有一个方法addButton()
,专门用于添加按钮。它还有一个List
叫children
,用于添加按钮以外的组件。
我们先添加一个关闭按钮。
this.addButton(new Button(int widthIn, // 按钮在屏幕上的X坐标
int heightIn, // 按钮在屏幕上的Y坐标
int width, // 按钮的宽
int height, // 按钮的高
String text, // 按钮上显示的文字
Button.IPressable onPress // 按钮按下后执行的语句,要用到lambda语句
);
其他部分没什么好讲的,主要就是onPress
这里。这里需要用到lambda
语句:
(press) -> {
this.getMinecraft().displayGuiScreen(null); // 使Minecraft显示的GUI为null,即关闭GUI
}
然后我们还要创建一个文本框,用于搜索。
private TextFieldWidget textFieldWidget; // 创建一个成员变量,待会渲染会用到
this.textFieldWidget = new TextFieldWidget(this.font, this.width / 2 - 75, 5, 150, 15, "搜索");
this.children.add(this.textFieldWidget);
界面渲染
我们接下来就要渲染我们的GUI界面。
我们先覆写render
方法,然后再加一句this.renderBackground();
让Minecraft为我们渲染渐变背景。然后,我们还要再加一句RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
确保渲染出来的内容不会偏色。
我们接着还要绑定材质:
private static final ResourceLocation TEXTURE = new ResourceLocation(ModderGuide.MODID, "textures/gui/iron_chest.png");
this.getMinecraft().getTextureManager().bindTexture(TEXTURE);
然后就是最重要的了:渲染材质。我们用blit
方法渲染。
this.blit(int x, int y, int u, int v, int width, int height);
blit
其实有很多种方法,这里演示的只是我常用的一种。
但我们的GUI还没有完工,打开游戏,会发现我们的按钮和文本框并没有被渲染出来。因为我们只是往GUI中添加了组件,但并没有渲染组件。因此,我们还要为其添加渲染。
this.textFieldWidget.render(p_render_1_, p_render_2_, p_render_3_); // 渲染文本框
super.render(p_render_1_, p_render_2_, p_render_3_); // 调用父类的render方法,渲染按钮的语句,父类已经帮我们写好了
打开GUI
// TOTO 待更新 2020-01-17 vvvbbbcz