HUD

在这节中我们将来学习如何绘制HUD。首先以免读者不清楚,HUD或者又称为inGameGui,指的是你在游戏中看到的类似于经验条、准星之类的东西。

那我们开始吧。

Forge给我提供了一个事件让我们可以渲染HUD,这个事件是RenderGameOverlayEvent

@Mod.EventBusSubscriber(value = Dist.CLIENT)
public class HudClientEvent {
   @SubscribeEvent
   public static void onOverlayRender(RenderGameOverlayEvent event) {
       if (event.getType() != RenderGameOverlayEvent.ElementType.ALL) {
           return;
       }
       if (Minecraft.getInstance().player == null || Minecraft.getInstance().player.getHeldItem(Hand.MAIN_HAND).getItem() != ItemRegistry.obsidianHud.get()) {
           return;
       }
       ObsidianGUI obsidianGUI = new ObsidianGUI(event.getMatrixStack());
       obsidianGUI.render();
   }
}

可以看到,我们订阅了这个事件做了一些判断,最后调用obsidianGUI.render();进行了渲染。RenderGameOverlayEvent事件有PrePost两个子事件,大家可以按需选用。另外RenderGameOverlayEvent这个事件包含有不同的ElementType,在渲染你的内容前(特别是要渲染图片时),务必判断一次ElementType,以防导致原版内容的错误渲染,同样的这里别忘了value = Dist.CLIENT

if (Minecraft.getInstance().player == null || Minecraft.getInstance().player.getHeldItem(Hand.MAIN_HAND).getItem() != ItemRegistry.obsidianHud.get()) {
  return;
}

这里只是简单的判断玩家手上拿的东西是不是我们规定的物品,因为渲染肯定发生在客户端,所以这里我们调用Minecraft.getInstance()

接下来我们来看ObsidianGUI的具体内容。

public class ObsidianGUI extends AbstractGui {
    private final int width;
    private final int height;
    private final Minecraft minecraft;
    private final ResourceLocation HUD = new ResourceLocation(Utils.MOD_ID, "textures/gui/hud.png");
    private MatrixStack matrixStack;

    public ObsidianGUI(MatrixStack matrixStack) {
        this.width = Minecraft.getInstance().getMainWindow().getScaledWidth();
        this.height = Minecraft.getInstance().getMainWindow().getScaledHeight();
        this.minecraft = Minecraft.getInstance();
        this.matrixStack = matrixStack;
    }

    public void setMatrixStack(MatrixStack stack) {
        this.matrixStack = stack;
    }

    public void render() {
        RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
        this.minecraft.getTextureManager().bindTexture(HUD);
        blit(matrixStack, width / 2 - 16, height / 2 - 64, 0, 0, 32, 32, 32, 32);
    }

}

可以看到我们继承了AbstractGui,这允许我们直接使用AbstractGui自带的一系列方法,比如blit。然后我们在构造方法里,手动的设置里类似于width hegiht等变量。

然后手动的创建了render方法,render方法的写法你之前在Screen中的render的写法是一样的。我在这里就只是渲染了一张图片而已。

打开游戏,把物品拿在手上,你应该就能看见物品被渲染出来了。

image-20200509082639854

源代码

另外原版的HUD渲染内容都在IngameGui这个类中。