LWJGLでゲームを書く

LWJGL#1でゲームを作成する



ゲームの作成は複雑で興味深いプロセスであり、多くの時間がかかります。 この連載では、LWJGLライブラリーを使用して単純な3D Javaゲームを作成する方法を紹介します。







ゲームを作成するには、次のものが必要です。









猫の下で誰が気にしてください。



ステップ1、準備



eclipseのインストール方法



3DグラフィックスのライブラリであるLWJGL 2.9.3をダウンロードして、プロジェクトに追加します。



テクスチャの読み込みを簡単にするライブラリであるslick-utilをダウンロードして、プロジェクトに追加します。



ステップ2、確認



まず、メインパッケージにMainクラスを作成し、次のコードをそこに入れます。







入力のある行が赤で強調表示されていない場合、すべて問題ありません(このライブラリはまだコードで使用されていないため、画面上で黄色で強調表示されます)。



ステップ3、表示



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)はその呼び出しによりプログラムを終了します。



ステップ4、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%以上含まれている場合は、引き続き一連の記事を作成します。



All Articles