Minecraft 2DDrawing tutorial (1)

简述 / 介绍

MC使用了Java的3D游戏引擎 LWJGL,LWJGL集成了:

绘制主要用到 OpenGL。
OpenGL在这里是个高性能的绘图库,有一系列函数/方法调整状态和绘制图形。


这里使用的版本是Forge 1.12.2。

首先你需要一个屏幕,或者说需要一个 “画布” ,只有当你有了一个载体的时候才可以在上面进行绘制。
首先需要一个类,去继承GuiScreen类,这是屏幕的基类。
(注: 我略过了配置开发环境的步骤,这一步可以参考其他教程。)

这里我创建了一个GuiDemoScreen类,然后继承了GuiScreen,这样就得到了一个基本的屏幕。
那如何才能显示我们的屏幕呢? 我们可以通过监听 GuiOpenEvent 事件来把主界面屏幕替换成刚刚写的GuiDemoScreen。

这里监听的GuiOpenEvent在打开一个GuiScreen的时候触发,我们可以监听此事件然后去吧打开的GuiScreen替换成为我们自己的屏幕,这里我把GuiMainMenu(主菜单)替换成了自己的屏幕。

现在进入游戏,之前显示的主界面也就替换成了刚刚写的GuiDemoScreen,目前还是一片空,什么都没有。

现在的屏幕还是有点单调,没有任何的控件或者说GUI,MC自带了一些GUI控件,可供使用。


常用控件与GuiScreen

如何你继承了GuiScreen,并且需要在上面添加一些GUI控件的时候,就需要覆盖其中的 initGui,此方法会在进入和调整窗口大小时被调用:

Button

按钮,作为最常见的GUI,MC自己本身做了一个封装: net.minecraft.client.gui.GuiButton

从GuiButton类的构造中可以看出,我们需要最少指定按钮的id, x, y轴方向以及按钮文字。

下面放置一个按钮在刚刚的DemoScreen上:

这里是往buttonList中添加了一个按钮,那为什么要这么做呢?

GuiScreen类中的绘制方法为drawScreen,如果你需要绘制一些控件之外的东西,列如图片,就需要覆写这个方法,并且记住需要super调用父类GuiScreen的drawScreen,不然你在initGui中添加的button与label都不会被绘制:

这里是GuiScreen的drawScreen具体实现。

Label

这里的Label用于绘制多行内容:

这里的fontRenderer是Minecraft类的成员,用于绘制文字。
GuiLabel类内部维护了一个labels的列表,用于储存添加的文字,效果:

TextField

文本输入,如果你要做一个登陆的界面或者是与用户交换信息的控件,这个可能是最佳选择,
但是GuiScreen没有所谓的 “textFieldList” 所以可以在initGui中去初始化,然后覆写drawScreen来绘制这个TextField:

这里创建了一个TextField,指定了必须的参数,设置最大输入长度为16,在覆写drawScreen后调用其中的drawTextBox去绘制这个输入框,并且你需要指定输入框被点击和输入的行为。

覆写mouseClicked并调用textField的mouseClicked传入相同参数,此方法在鼠标点击时调用,这样就做到点击时选择到这个输入框。

覆写keyTyped并调用其中的textboxKeyTyped传入相同参数,keyTyped在键盘输入时被触发,这样就可以让输入框可输入。

最后可通过其中的getText和getSelectedText获得你想要的数据:


项目代码: https://github.com/Mainyf/drawTutorial

0%