Menulis game di LWJGL

Membuat game di LWJGL # 1


Menulis game adalah proses yang kompleks dan menarik yang membutuhkan banyak waktu. Dalam seri artikel ini, saya akan menunjukkan kepada Anda cara membuat game Java 3D sederhana menggunakan perpustakaan LWJGL.


Untuk membuat game, Anda memerlukan yang berikut:


  • Kemampuan untuk menulis kode dalam Java (minimum yang diperlukan: memahami operasi kondisi, loop, string, array, fungsi, kelas)
  • Lingkungan Pengembangan (Saya akan menggunakan Eclipse)
  • Perpustakaan LWJGL
  • Kartu video yang mendukung versi OpengGL tidak kurang dari 3.3
  • Waktu luang
  • Ide

Siapa yang peduli, tolong, di bawah kucing.

Langkah Satu, Persiapan


Cara menginstal gerhana .

Unduh LWJGL 2.9.3 , perpustakaan grafik 3D, tambahkan ke proyek Anda.

Unduh licin util , perpustakaan yang menyederhanakan pemuatan tekstur, tambahkan ke proyek.

Langkah dua, periksa


Pertama, buat kelas Utama di paket utama, masukkan kode berikut ke dalamnya:



Jika baris dengan input tidak disorot dengan warna merah, maka semuanya baik-baik saja (itu disorot dengan warna kuning di layar, karena perpustakaan ini belum digunakan dalam kode).

Langkah Tiga, Tampilkan


Isi kelas Utama dengan kode berikut:

Mulai kode
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); } } 


Jadi apa yang terjadi di sini:

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

Di baris ini:

  1. mengatur posisi tampilan (di tengah layar)
  2. diizinkan untuk mengubah ukurannya
  3. sinkronisasi vertikal diaktifkan
  4. atur DisplayMode yang menyimpan ukuran layar dan beberapa parameter lainnya
  5. di baris terakhir, tampilan dibuat dan ditampilkan di layar.

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

Dalam fungsi pembaruan, yang disebut dalam infinite loop:

  1. Periksa Ubah Ukuran Jendela
  2. Tampilkan pembaruan
  3. Pada baris Display.sync (60), layar disinkronkan dengan 60 hertz (jika Anda memiliki frekuensi pembaruan layar yang berbeda, misalnya 59, 76, 120, 144, dll., Atur frekuensi Anda).
  4. Jendela Tutup Periksa

Perhatikan bagaimana program berakhir ketika pengguna mengklik tanda silang, jendela tutup bendera, Display.isCloseRequested () menjadi true, dan variabel yang berjalan menjadi salah, dan iterasi berikutnya loop while (running) tidak akan dieksekusi dan akan ada transisi ke baris Display .destroy (), yang merusak tampilan dan System.exit (0), panggilan yang menghentikan program.

Langkah Empat, OpenGL


Untuk menginisialisasi OpenGL ke fungsi utama sebelum loop while (running), Anda perlu menambahkan kode berikut:

 if (!GLContext.getCapabilities().OpenGL33) { System.err.println("    OpenGL 3.3."); System.exit(0); } 

Kode ini memeriksa apakah kartu video mendukung OpenGL 3.3, jika kartu video tidak mendukung versi ini, cobalah memperbarui driver atau beralih ke kartu video lain (jika Anda memiliki lebih dari satu).

Jadi, pemeriksaan sudah selesai, jika semuanya baik-baik saja, kartu video mendukung OpenGL 3.3, kemudian kita melanjutkan. Setelah kode verifikasi, sebelum loop, tambahkan kode berikut:

 glShadeModel(GL_SMOOTH); glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); glClearColor(1f, 0f, 0f, 1f); 

Kode ini akan mengonfigurasi OpenGL sebagai berikut:

  1. Hidupkan pencahayaan lembut di shader
  2. Nyalakan tekstur
  3. Menyalakan pemeriksaan kedalaman (sehingga objek yang dekat tumpang tindih dengan objek yang jauh)
  4. Atur warna pembersih

Di loop while (running), sebelum memanggil fungsi update (), tambahkan baris

 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

Yang akan menghapus buffer warna dan buffer kedalaman setiap kali layar diperbarui.

Kode akhir


Klik untuk melihat
 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); } } 


Ini menyimpulkan artikel pertama tentang menulis game di LWJGL, jika survei berisi lebih dari 50% jawaban positif, saya akan terus menulis serangkaian artikel.

Source: https://habr.com/ru/post/id427979/


All Articles