Belajar Menciptakan Game 2D Dengan Java Dan Netbeans Bab 4: Thread Dan Game Loop
Pada tutorial berguru menciptakan game 2D dengan java pecahan 4 ini anda akan mempelajari perihal thread dan juga game loop.
Jadi, apa itu thread pada Java?
Di sini tidak akan dijelaskan klarifikasi mengenai thread secara teknis, sebab begitu banyak artikel dan tutorial di luar sana yang membahas mengenai topik tersebut.
Saya hanya akan menjelaskan sesimpel mungkin mengenai thread ini dalam tujuan pembuatan game sederhana ini.
Thread ialah kegiatan mini.
Maksudnya?
Pada kegiatan game ini terdapat beberapa class. Dan misalkan ketika anda hanya ingin kegiatan class Game yang dijalankan saja, ini di sebut dengan thread. Makara thread ini ialah kegiatan mini yang terdapat di dalam kegiatan besar, dalam hal ini kegiatan game 2D yang anda buat. Hanya inilah poin penting yang harus anda pahami di sini sebenarnya.
Tapi berikut ini ialah pengetahuan lebih lanjut mengenai thread.
Setiap thread kendalikan dan dibentuk oleh class java.lang.Thread. Ketika sebuah thread di buat maka itu menjadi prioritas. Thread dengan prioritas paling tinggi akan dihukum lebih dulu, gres lalu diikuti oleh thread lain yang prioritasnya lebih rendah.
Setiap kegiatan Java mempunyai setidaknya satu thread yang dikenal sebagai thread utama. Thread ini dibentuk oleh JVM pada ketika kegiatan dijalankan, ketika method main dipanggil oleh thread utama.
Thread sanggup tidak boleh oleh JVM ketika salah satu kondisi di bawah ini terpenuhi:
Dari diagram di atas kita sanggup menyimpulkan:
Berikut ini ialah update koding dari class Game yang telah diberi loop dan juga ada beberapa method suplemen yaitu inisialisasi(), updateGame, dan render().
Sekarang fokus ke method startThread() pada line 59. Di body method terdapat pernyataan if, pada line 61 - 62 yaitu:
if(gameRunning)
return;
Ini artinya,jika game sudah berjalan maka jangan sanksi arahan berikutnya, yaitu arahan di line 64 - 70. Dan kalau game belum berjalan, maka gameRunning akan di set ke nilai true (line 64 di eksekusi) dan tentu saja arahan di line 69 - 70 juga akan dieksekusi.
Perhatikan, arahan di line 70, yaitu thread.start() akan memanggil method run().
Nah, apa yang dilakukan oleh method run() tersebut?
Selanjutnya, anda sanggup melihat body method stopThread(),line 75 - 88.
Perhatikan di line 75 - 76 ada pernyatan if:
if(!gameRunning)
return;
Artinya ialah kalau game tidak berjalan (false) maka arahan di bawahnya tidak perlu dieksekusi, yaitu arahan line 78 - 87. Sebaliknya,jika gameRunning itu bernilai true, maka gameRunning akan di set menjadi false, lalu arahan di bawahnya dieksekusi.
Berikut ini ialah arahan class Main tersebut dari tutorial sebelumnya:
Cobalah untuk menjalankan kegiatan dan anda tidak akan melihat window game tersebut.
Apa yang terjadi?
Ini dikarenakan anda tidak memanggil method startThread().
Dan method start ini ialah method objek. Makara anda harus menciptakan objek Game terlebih dahulu untuk memanggil method tersebut.
Lihat arahan di bawah ini untuk memanggil method startThread().
Sekarang coba jalankan aplikasi lagi, anda akan melihat window game ditampilkan di layar. Namun kini anda sudah memakai thread.
Admin harap klarifikasi in masuk logika dan gampang diterima oleh teman-teman meskipun agak rumit. Sampai di sini dulu ya. Pada tutorial berikutnya kita akan masuk ke BufferStrategy dan juga dasar grafik.
Baca juga:
Bagian 3
Jadi, apa itu thread pada Java?
Di sini tidak akan dijelaskan klarifikasi mengenai thread secara teknis, sebab begitu banyak artikel dan tutorial di luar sana yang membahas mengenai topik tersebut.
Saya hanya akan menjelaskan sesimpel mungkin mengenai thread ini dalam tujuan pembuatan game sederhana ini.
Thread ialah kegiatan mini.
Maksudnya?
Pada kegiatan game ini terdapat beberapa class. Dan misalkan ketika anda hanya ingin kegiatan class Game yang dijalankan saja, ini di sebut dengan thread. Makara thread ini ialah kegiatan mini yang terdapat di dalam kegiatan besar, dalam hal ini kegiatan game 2D yang anda buat. Hanya inilah poin penting yang harus anda pahami di sini sebenarnya.
Tapi berikut ini ialah pengetahuan lebih lanjut mengenai thread.
Setiap thread kendalikan dan dibentuk oleh class java.lang.Thread. Ketika sebuah thread di buat maka itu menjadi prioritas. Thread dengan prioritas paling tinggi akan dihukum lebih dulu, gres lalu diikuti oleh thread lain yang prioritasnya lebih rendah.
Setiap kegiatan Java mempunyai setidaknya satu thread yang dikenal sebagai thread utama. Thread ini dibentuk oleh JVM pada ketika kegiatan dijalankan, ketika method main dipanggil oleh thread utama.
Thread sanggup tidak boleh oleh JVM ketika salah satu kondisi di bawah ini terpenuhi:
- Method exit dipanggil dan disahkan
- Tidak ada lagi thread yang berjalan di rahasia (daemon thread)
Membuat Thread Pada Class Game
Sekarang anda akan menciptakan thread pada class Game.
Apa artinya?
Artinya ialah segala sesuatnya yang terdapat di class Game akan dijalankan secara terpisah dari semua arahan lainnya yang terdapat dalam aplikasi. Atau dengan kata lain menjalankan class Game secara terpisah dari keseluruhan arahan program.
Untuk melakukannya anda harus mengimplementasikan interface Runnable dan mengimplementasikan method ajaib run() dengan mengoverride-nya pada class Game.
Berikut ini ialah update arahan kegiatan class Game dengan thread:
package com.bahasajava.gamejava; import com.bahasajava.gamejava.gamedisplay.GameDisplay; import java.util.logging.Level; import java.util.logging.Logger; //Mnegimplementasikan interface Runnable untuk thread public class Game implements Runnable { private GameDisplay gameDisplay; public int lebar, tinggi; private Thread thread;//thread yang dijalankan public Game(String judul, int lebar, int tinggi){ this.lebar = lebar; this.tinggi = tinggi; //objek gameDisplay mempunyai konstruktor dengan parameter //judul, lebar, dan tinggi, jadi semua parameter ini harus terpenuhi gameDisplay = new GameDisplay(judul, lebar, tinggi); } //Method ini akan menginisialisasi semua graphic //dan akan memastikan semuanya siap sebelum game dijalankan private void inisialisasi(){ } //run() ialah method abstract yang harus diimplentasikan //ketika class mengimplementasikan Runnable @Override public void run() { inisialisasi();//Memanggil method inisialisasi() //Di sini kita akan menjalankan loop game } //synchronized dipakai ketika pribadi berafiliasi dengan thread //startThread() akan menjalankan thread public synchronized void startThread(){ //Konstruktor Thread mengambil parameter class mana yang //akan di jalankan, dalam hal ini ialah class Game //oleh sebab itu memakai keyword this thread = new Thread(this); thread.start();//Method start() ini akan menjalankan method run() } //stopThread akan menghentikan thread public synchronized void stopThread(){ //Method join() melemparkan checked exception sehingga //akan memaksa anda untuk memakai blok try-catch //atau sanggup juga dengan memakai clausa Throws try { thread.join();//Method join() akan menunggu thread untuk "mati" } catch (InterruptedException ex) { Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex); } } }
Membuat Loop Pada Game
Secara garis besarnya, setiap game apapun mempunyai diagram loop menyerupai berikut ini:Dari diagram di atas kita sanggup menyimpulkan:
- Pertama ketika kegiatan dijalankan, apakah kegiatan tersebut di close? Jika ya kegiatan dihentikan. Tapi bila tidak, maka input dari user akan didapatkan.
- Setelah itu, semua variabel, posisi objek, grafik, dan lainnya akan diupdate.
- Kemudian, proses render atau menggambar akan dilakukan
- Proses akan kembali lagi ke tahap awal dan loop atau perulangan akan terus berjalan hingga dengan kegiatan di hentikan.
Berikut ini ialah update koding dari class Game yang telah diberi loop dan juga ada beberapa method suplemen yaitu inisialisasi(), updateGame, dan render().
package com.bahasajava.gamejava; import com.bahasajava.gamejava.gamedisplay.GameDisplay; import java.util.logging.Level; import java.util.logging.Logger; //Mnegimplementasikan interface Runnable untuk thread public class Game implements Runnable { private GameDisplay gameDisplay; public int lebar, tinggi; public String judul; private Thread thread;//thread yang dijalankan private boolean gameRunning = false;//Untuk mengontrol while loop public Game(String judul, int lebar, int tinggi){ this.lebar = lebar; this.tinggi = tinggi; this.judul= judul; } //Method inisialisasi() akan menginisialisasi semua graphic //dan akan memastikan semuanya siap sebelum game dijalankan private void inisialisasi(){ //objek gameDisplay mempunyai konstruktor dengan parameter //judul, lebar, dan tinggi, jadi semua parameter ini harus terpenuhi gameDisplay = new GameDisplay(judul, lebar, tinggi); } //Method updateGame() akan terus melaksanakan update game private void updateGame(){ } //Method render() untuk merender private void render(){ } //run() ialah method abstract yang harus diimplentasikan //ketika class mengimplementasikan Runnable @Override public void run() { inisialisasi(); //Di sini kita akan menjalankan loop game while(gameRunning){ updateGame(); render(); } stopThread(); } //synchronized dipakai ketika pribadi berafiliasi dengan thread //startThread() akan menjalankan thread public synchronized void startThread(){ if(gameRunning) return; gameRunning = true; //Konstruktor Thread mengambil parameter class mana yang //akan di jalankan, dalam hal ini ialah class Game //oleh sebab itu memakai keyword this thread = new Thread(this); thread.start();//Method start() ini akan menjalankan method run() } //stopThread akan menghentikan thread public synchronized void stopThread(){ if(!gameRunning) return; gameRunning = false; //Method join() melemparkan checked exception sehingga //akan memaksa anda untuk memakai blok try-catch //atau sanggup juga dengan memakai clausa Throws try { thread.join();//Method join() akan menunggu thread untuk "mati" } catch (InterruptedException ex) { Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex); } } }
Penjelasan kode
Sekarang fokus ke method startThread() pada line 59. Di body method terdapat pernyataan if, pada line 61 - 62 yaitu:
if(gameRunning)
return;
Ini artinya,jika game sudah berjalan maka jangan sanksi arahan berikutnya, yaitu arahan di line 64 - 70. Dan kalau game belum berjalan, maka gameRunning akan di set ke nilai true (line 64 di eksekusi) dan tentu saja arahan di line 69 - 70 juga akan dieksekusi.
Perhatikan, arahan di line 70, yaitu thread.start() akan memanggil method run().
Nah, apa yang dilakukan oleh method run() tersebut?
- Pertama, method tersebut akan memanggil method inisialisasi yang akan menampilkan window game (line 47)
- Kedua, method ini akan menjalankan loop ketika game berjalan, jadi method updateGame() dan render() akan terus dipanggil, selama parameter gameRunning bernilai true,(line 50-53). Secara default anda sudah mengatur nilai gameRunning bernilai false, lihat line 16.
- Ketiga, ketika game berhenti atau gameRunning bernilai false maka method stopThread() akan dipanggil, lihat line 54.
Selanjutnya, anda sanggup melihat body method stopThread(),line 75 - 88.
Perhatikan di line 75 - 76 ada pernyatan if:
if(!gameRunning)
return;
Artinya ialah kalau game tidak berjalan (false) maka arahan di bawahnya tidak perlu dieksekusi, yaitu arahan line 78 - 87. Sebaliknya,jika gameRunning itu bernilai true, maka gameRunning akan di set menjadi false, lalu arahan di bawahnya dieksekusi.
Menjalankan thread
Untuk menjalankan thread ini kita kembali ke class Main, yang mempunyai main method.Berikut ini ialah arahan class Main tersebut dari tutorial sebelumnya:
package com.bahasajava.gamejava; public class Main { //main method public static void main(String[] args) { new Game("My Java Game", 640, 360); } }
Cobalah untuk menjalankan kegiatan dan anda tidak akan melihat window game tersebut.
Apa yang terjadi?
Ini dikarenakan anda tidak memanggil method startThread().
Dan method start ini ialah method objek. Makara anda harus menciptakan objek Game terlebih dahulu untuk memanggil method tersebut.
Lihat arahan di bawah ini untuk memanggil method startThread().
package com.bahasajava.gamejava; public class Main { //main method public static void main(String[] args) { Game game = new Game("My Java Game", 640, 360); game.startThread();//objek Game memanggil method start thread } }
Sekarang coba jalankan aplikasi lagi, anda akan melihat window game ditampilkan di layar. Namun kini anda sudah memakai thread.
Admin harap klarifikasi in masuk logika dan gampang diterima oleh teman-teman meskipun agak rumit. Sampai di sini dulu ya. Pada tutorial berikutnya kita akan masuk ke BufferStrategy dan juga dasar grafik.
Baca juga:
Bagian 3
Belum ada Komentar untuk "Belajar Menciptakan Game 2D Dengan Java Dan Netbeans Bab 4: Thread Dan Game Loop"
Posting Komentar