一.先创建一个Item用于打开菜单
public class GuiItem extends Item {
public GuiItem() {
super(new Properties());
}
@Override
public InteractionResultHolder<ItemStack> use(Level level, Player player, InteractionHand usedHand) {
if(level.isClientSide){
FirstGui.openFirstGui();
}
return super.use(level, player, usedHand);
}
}
- FirstGui.openFirstGui : 是等会儿要执行的打开GUI逻辑
记得注册Item
public static final Supplier<Item> GUI_ITEM=ITEMS.register("gui_item", GuiItem::new);
二.实现我们的Screen
public class FirstGui extends Screen {
public FirstGui(Component component) {
super(component);
}
EditBox editBox;
Button button;
ResourceLocation FIRST_GUI_TEXTURE = new ResourceLocation(TestMod.MODID, "textures/gui/first_gui.png");
Component content = Component.translatable("gui." + TestMod.MODID + ".first_gui_title");
ExtendedSlider sliderBar;
@Override
protected void init() {
this.editBox = new EditBox(this.font, this.width / 2 - 100, 66, 200, 20, Component.translatable("gui." + TestMod.MODID + ".first_gui"));
this.addWidget(this.editBox);
this.button = new Button.Builder(
Component.translatable("gui." + TestMod.MODID + ".first_gui.save"),
pButton -> {}).pos(this.width / 2 - 40, 96).size(80, 20).build();
this.addWidget(this.button);
this.sliderBar = new ExtendedSlider(
this.width / 2 - 100,
120,
200,
10,
Component.translatable("gui." + TestMod.MODID + ".first_gui.slider"),
Component.empty(), 0, 100, 0, true);
this.addWidget(this.sliderBar);
super.init();
}
@Override
public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) {
this.renderBackground(guiGraphics, mouseX, mouseY, partialTick);
guiGraphics.setColor(1, 1, 1, 1);
int textureWidth = 208;
int textureHeight = 156;
guiGraphics.blit(FIRST_GUI_TEXTURE, this.width / 2 - 150, 10, 0, 0, 300, 200, textureWidth, textureHeight);
guiGraphics.drawCenteredString(this.font, content, this.width / 2 - 10, 30, 0xeb0505);
this.editBox.render(guiGraphics, mouseX, mouseY, partialTick);
this.button.render(guiGraphics, mouseX, mouseY, partialTick);
this.sliderBar.render(guiGraphics, mouseX, mouseY, partialTick);
super.render(guiGraphics, mouseX, mouseY, partialTick);
}
public static void openFirstGui(){
Minecraft.getInstance().setScreen(new FirstGui(Component.translatable("test")));
}
}
- editBox : 文本输入框
- button : 按钮
- sliderBar : 滑动条
- FIRST_GUI_TEXTURE : 材质路径
- content : 文本
- init : 初始化组件
- this.editBox = new EditBox(this.font, this.width/2 - 100, 66, 200, 20, ...) : 初始化文本框(位置居中,宽度200,高度20)
- this.button = new Button.Builder(...)
.pos(this.width/2 - 40, 96).size(80, 20).build() : 初始化按钮(位置居中下方,点击事件暂未实现)
- this.sliderBar = new ExtendedSlider(..., 0, 100, 0, true) : 初始化滑动条(范围0-100,初始值0)
- render : 绘制界面
- this.renderBackground(guiGraphics, mouseX, mouseY, partialTick) : 绘制默认半透明背景
- guiGraphics.setColor(1, 1, 1, 1) : 重置颜色为白色不透明
- guiGraphics.blit(FIRST_GUI_TEXTURE, this.width/2 - 150, 10, 0, 0, 300, 200, textureWidth, textureHeight) : 绘制自定义背景纹理(从材质文件加载)
- guiGraphics.drawCenteredString(this.font, content, this.width/2 - 10, 30, 0xeb0505) : 绘制居中红色标题
- 渲染所有子组件 : this.editBox.render(...);
this.button.render(...);
this.sliderBar.render(...);
- super.render(...) : 调用父类渲染逻辑
- openFirstGui : 打开GUI