在LWJGL上编写游戏

在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(); 

在这些行中:

  1. 设置显示位置(在屏幕中央)
  2. 允许调整大小
  3. 启用垂直同步
  4. 设置DisplayMode来存储屏幕尺寸和其他一些参数
  5. 在最后一行,将创建显示并显示在屏幕上。

 static void update() { if (Display.wasResized()) { width = Display.getWidth(); height = Display.getHeight(); } Display.update(); Display.sync(60); if (Display.isCloseRequested()) { running = false; } } 

在无限循环中调用的更新函数中:

  1. 检查调整大小窗口
  2. 显示更新
  3. 在Display.sync(60)行中,显示以60赫兹同步(如果屏幕更新频率不同,例如59、76、120、144等,请设置频率)。
  4. 窗口关闭检查

请注意,当用户单击十字时,程序如何结束,窗口关闭标志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:

  1. 打开着色器中的柔光
  2. 打开纹理
  3. 启用深度检查(以便附近的物体与远处的物体重叠)
  4. 设置清洁颜色

在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%的肯定答案,我将继续撰写一系列文章。

Source: https://habr.com/ru/post/zh-CN427979/


All Articles