MC Fabric 1.20.1 学习笔记 —— 制作一个独立配方的工作台 07 Screen

179 阅读1分钟

之前编写了合成台的后端,现在来编写前端部分,仅继承HandledScreen即可。详细介绍见代码注释。

/**
 * 合成台GUI前端部分内容,包括绘制GUI和背景,需要实现HandledScreen<ScreenHandler>,我以前干后端的,不了解这方面内容,只能做大概注释
 */
public class WorkBlockScreen extends HandledScreen<ScreenHandler> {
    /**
     * 设置背景图片,这里直接套用了MC自己的合成台背景图片,可以在下面这个目录找到
     * minecraft-merged-project-root-1.20.1-net.fabricmc.yarn.1_20_1.1.20.1+build.10-v2.jar!\assets\minecraft\textures\gui\container\crafting_table.png
      */

    private static final Identifier TEXTURE = new Identifier("minecraft", "textures/gui/container/crafting_table.png");

    public WorkBlockScreen(ScreenHandler handler, PlayerInventory inventory, Text title) {
        super(handler, inventory, title);
    }
    // 涉及到渲染部分,绘制背景图片,这里我还没完全看明白,有理解的大佬麻烦评论区解惑
    @Override
    protected void drawBackground(DrawContext context, float delta, int mouseX, int mouseY) {
        // 使用positionTex渲染程序
        RenderSystem.setShader(GameRenderer::getPositionTexProgram);
        // 黑色
        RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
        // 没懂,写上就完事了
        RenderSystem.setShaderTexture(0, TEXTURE);
        // 计算GUI显示位置的左上角坐标
        int x = (width - backgroundWidth) / 2;
        int y = (height - backgroundHeight) / 2;
        // 在x,y处绘制坐标。我们不需要做切割,因此uv均设置为0,这里背景的长宽使用HandledScreen默认长宽
        context.drawTexture(TEXTURE, x, y, 0, 0, backgroundWidth, backgroundHeight);
    }

    // 所有的绘制步骤在这里进行,似乎是每一帧都会被fabric调用
    @Override
    public void render(DrawContext context, int mouseX, int mouseY, float delta) {
        renderBackground(context);
        super.render(context, mouseX, mouseY, delta);
        drawMouseoverTooltip(context, mouseX, mouseY);
    }

    // 初始化
    @Override
    protected void init() {
        super.init();
        // 将标题居中,(背景宽-文字宽)/2得到x轴坐标,是整个文字的左上角坐标
        titleX = (backgroundWidth - textRenderer.getWidth(title)) / 2;
    }
}