在LWJGL#1上创建游戏
编写游戏是一个复杂而有趣的过程,需要花费大量时间。 在本系列文章中,我将向您展示如何使用LWJGL库创建简单的3D Java游戏。
要创建您的游戏,您需要以下内容:
- 能够用Java编写代码(必要的最低要求:了解条件,循环,字符串,数组,函数,类的操作)
- 开发环境(我将使用Eclipse)
- LWJGL库
- 支持OpengGL版本不低于3.3的视频卡
- 空闲时间
- 主意
谁在乎,请在猫下。
第一步,准备
如何安装eclipse 。
下载
LWJGL 2.9.3 (一个3D图形库),
并将其
添加到您的项目中。
下载
slick-util (一个简化加载纹理的库),将其添加到项目中。
第二步,检查
首先,在主包中创建Main类,将以下代码放入其中:

如果输入行未用红色突出显示,则一切正常(在屏幕上以黄色突出显示,因为该库尚未在代码中使用)。
第三步,显示
用以下代码填充Main类:
起始码import org.lwjgl.LWJGLException; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode; public class Main { static int width = 800, height = 600; static DisplayMode mainDisplayMode = new DisplayMode(width, height); static boolean running = true; static void update() { if (Display.wasResized()) { width = Display.getWidth(); height = Display.getHeight(); } Display.update(); Display.sync(60); if (Display.isCloseRequested()) { running = false; } } public static void main(String[] args) { try { Display.setLocation( (Display.getDesktopDisplayMode().getWidth() - mainDisplayMode.getWidth()) / 2, Display.getDesktopDisplayMode().getHeight() - mainDisplayMode.getHeight()) / 2); Display.setResizable(true); Display.setVSyncEnabled(true); Display.setDisplayMode(mainDisplayMode); Display.create(); } catch (LWJGLException ex) { System.err.println(ex.getStackTrace().toString()); Display.destroy(); System.exit(1); } while (running) { update(); } Display.destroy(); System.exit(0); } }
所以这是怎么回事:
Display.setLocation( (Display.getDesktopDisplayMode().getWidth() - mainDisplayMode.getWidth()) / 2, (Display.getDesktopDisplayMode().getHeight() - mainDisplayMode.getHeight()) / 2); Display.setResizable(true); Display.setVSyncEnabled(true); Display.setDisplayMode(mainDisplayMode); Display.create();
在这些行中:
- 设置显示位置(在屏幕中央)
- 允许调整大小
- 启用垂直同步
- 设置DisplayMode来存储屏幕尺寸和其他一些参数
- 在最后一行,将创建显示并显示在屏幕上。
static void update() { if (Display.wasResized()) { width = Display.getWidth(); height = Display.getHeight(); } Display.update(); Display.sync(60); if (Display.isCloseRequested()) { running = false; } }
在无限循环中调用的更新函数中:
- 检查调整大小窗口
- 显示更新
- 在Display.sync(60)行中,显示以60赫兹同步(如果屏幕更新频率不同,例如59、76、120、144等,请设置频率)。
- 窗口关闭检查
请注意,当用户单击十字时,程序如何结束,窗口关闭标志Display.isCloseRequested()变为true,运行变量变为false,并且下一次迭代时while(运行)循环将不执行,并且将过渡到Display行.destroy(),这将破坏显示,而System.exit(0),其调用将终止程序。
第四步,OpenGL
要在while(运行)循环之前将OpenGL初始化为主要功能,您需要添加以下代码:
if (!GLContext.getCapabilities().OpenGL33) { System.err.println(" OpenGL 3.3."); System.exit(0); }
此代码检查视频卡是否支持OpenGL 3.3,如果视频卡不支持此版本,请尝试更新驱动程序或切换到另一视频卡(如果有多个)。
因此,检查完成,如果一切正常,显卡支持OpenGL 3.3,那么我们继续进行。 在验证码之后,循环之前,添加以下代码:
glShadeModel(GL_SMOOTH); glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); glClearColor(1f, 0f, 0f, 1f);
此代码将如下配置OpenGL:
- 打开着色器中的柔光
- 打开纹理
- 启用深度检查(以便附近的物体与远处的物体重叠)
- 设置清洁颜色
在while(运行)循环中,在调用update()函数之前,添加以下行
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
每次更新屏幕时,它将清除颜色缓冲区和深度缓冲区。
最终代码
点击查看 import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_TEST; import static org.lwjgl.opengl.GL11.GL_SMOOTH; import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D; import static org.lwjgl.opengl.GL11.glClear; import static org.lwjgl.opengl.GL11.glClearColor; import static org.lwjgl.opengl.GL11.glEnable; import static org.lwjgl.opengl.GL11.glShadeModel; import org.lwjgl.LWJGLException; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode; import org.lwjgl.opengl.GLContext; public class Main { static int width = 800, height = 600; static DisplayMode mainDisplayMode = new DisplayMode(width, height); static boolean running = true; static void update() { if (Display.wasResized()) { width = Display.getWidth(); height = Display.getHeight(); } Display.update(); Display.sync(60); if (Display.isCloseRequested()) { running = false; } } public static void main(String[] args) { try { Display.setLocation((Display.getDesktopDisplayMode().getWidth() - mainDisplayMode.getWidth()) / 2, (Display.getDesktopDisplayMode().getHeight() - mainDisplayMode.getHeight()) / 2); Display.setResizable(true); Display.setVSyncEnabled(true); Display.setDisplayMode(mainDisplayMode); Display.create(); } catch (LWJGLException ex) { System.err.println(ex.getStackTrace().toString()); Display.destroy(); System.exit(1); } if (!GLContext.getCapabilities().OpenGL33) { System.err.println(" OpenGL 3.3."); System.exit(0); } glShadeModel(GL_SMOOTH); glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); glClearColor(1f, 0f, 0f, 1f); while (running) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); update(); } Display.destroy(); System.exit(0); } }
到此为止,第一篇有关在LWJGL上编写游戏的文章结束了。如果调查包含超过50%的肯定答案,我将继续撰写一系列文章。