之前编写了合成台的后端,现在来编写前端部分,仅继承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;
}
}