Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. Java
Gamedevelopment

Pengenalan kepada JavaFX untuk Pembangunan Permainan

by
Difficulty:IntermediateLength:LongLanguages:

Malay (Melayu) translation by Meyria (you can also view the original English article)

JavaFX adalah toolkit GUI platform salib untuk Java, dan merupakan pengganti kepada perpustakaan Java Swing. Dalam tutorial ini, kami akan meneroka ciri-ciri JavaFX yang menjadikannya mudah digunakan untuk memulakan permainan pengaturcaraan di Jawa.

Tutorial ini mengandaikan anda sudah mengetahui cara kod di Java. Jika tidak, periksa Pelajari Java untuk Android, Pengenalan Pemrograman Komputer Dengan Java: 101 dan 201, Ketua Java Pertama, Greenfoot, atau Pelajari Java Cara Hard untuk bermula.

Pemasangan

Jika anda sudah membangunkan aplikasi dengan Java, anda mungkin tidak perlu memuat turun apa-apa sama sekali: JavaFX telah disertakan dengan pakej JDK (Java Development Kit) standard sejak JDK versi 7u6 (Ogos 2012). Sekiranya anda belum mengemas kini pemasangan Java anda, ketik ke laman web muat turun Java untuk versi terkini.

Kelas Kerangka Asas

Mencipta program JavaFX bermula dengan kelas Permohonan, yang mana semua aplikasi JavaFX dilanjutkan. Kelas utama anda perlu memanggil kaedah pelancaran (), yang kemudiannya akan memanggil kaedah init () dan kemudian kaedah mula (), tunggu aplikasi selesai, dan kemudian panggil kaedah stop (). Daripada kaedah ini, hanya permulaan () kaedah yang abstrak dan mesti ditindih.

The Pentas kelas adalah kontena kelas atas JavaFX. Apabila Aplikasi dilancarkan, Peringkat awal dicipta dan diluluskan kepada kaedah permulaan Aplikasi. Tahap mengawal sifat tetingkap asas seperti tajuk, ikon, penglihatan, resizability, mod skrin penuh dan hiasan; yang terakhir dikonfigurasikan menggunakan StageStyle. Tahap tambahan boleh dibina seperti yang diperlukan. Selepas Peringkat dikonfigurasikan dan kandungan ditambahkan, kaedah pameran () dipanggil.

Mengetahui semua ini, kita boleh menulis contoh minimal yang melancarkan tetingkap di JavaFX:

Kandungan Penstrukturan

Kandungan dalam JavaFX (seperti teks, imej, dan kawalan UI) dianjurkan dengan menggunakan struktur data seperti pohon yang dikenali sebagai graf adegan, yang mengelompokkan dan mengatur unsur-unsur adegan grafis.

JavaFX Scene Graph
Perwakilan Grafik Pemandangan JawaFX.

Unsur umum graf adegan dalam JavaFX dipanggil Node. Setiap Node dalam pokok mempunyai satu nod ''induk'', kecuali Node khas yang ditetapkan sebagai ''root''. Kumpulan adalah Node yang boleh mempunyai banyak unsur 'anak' Node. Transformasi grafik (terjemahan, putaran, dan skala) dan kesan yang dikenakan kepada Kumpulan juga dikenakan kepada anak-anaknya. Node dapat ditata menggunakan JavaFX Cascading Style Sheets (CSS), sangat mirip dengan CSS yang digunakan untuk memformat dokumen HTML.

Kelas Scene mengandungi semua kandungan untuk graf adegan, dan memerlukan akar Node yang akan ditetapkan (dalam amalan, ini sering menjadi Kumpulan). Anda boleh menetapkan saiz Adegan secara khusus; sebaliknya, saiz Adegan akan dikira secara automatik berdasarkan kandungannya. Objek Scene mesti dihantar ke Tahap (oleh kaedah setScene ()) untuk dipaparkan.

Grafik Rendering

Memaparkan grafik sangat penting kepada pengatur cara permainan! Di JavaFX, objek kanvas adalah imej di mana kita boleh menarik teks, bentuk, dan imej, menggunakan objek GraphicsContext yang berkaitan. (Bagi pemaju yang biasa dengan toolkit Java Swing, ini sama dengan objek Grafik yang dihantar ke kaedah cat () dalam kelas JFrame.)

Objek GraphicsContext mengandungi banyak kebolehan penyesuaian yang berkuasa. Untuk memilih warna untuk melukis teks dan bentuk, anda boleh menetapkan warna (dalaman) dan stroke (sempadan) warna, yang merupakan objek Cat: ini boleh menjadi satu Warna pepejal, kecerunan yang ditentukan pengguna (sama ada LinearGradient atau RadialGradient), atau walaupun ImagePattern. Anda juga boleh menggunakan satu atau lebih objek Gaya Kesan, seperti Lampu, Bayangan, atau GaussianBlur, dan menukar fon dari lalai dengan menggunakan kelas Fon.

Kelas Imej menjadikannya mudah memuat imej dari pelbagai format dari fail dan menarik mereka melalui kelas GraphicsContext. Sangat mudah untuk membina imej yang dijana secara procedural dengan menggunakan kelas WritableImage bersama kelas PixelReader dan PixelWriter.

Dengan menggunakan kelas-kelas ini, kita boleh menulis contoh ''Hello, World''-style yang lebih baik seperti berikut. Untuk kecingkungan, kami hanya akan memasukkan kaedah start () di sini (kami akan melangkau kenyataan import dan kaedah utama ()); Walau bagaimanapun, kod sumber kerja yang lengkap boleh didapati di repo GitHub yang mengiringi tutorial ini.

Loop Permainan

Seterusnya, kita perlu membuat program kami dinamik, bermakna keadaan permainan berubah seiring dengan masa. Kami akan melaksanakan gelang permainan: gelung tak terhingga yang mengemas kini objek permainan dan menjadikan pemandangan ke skrin, dengan ideal pada kadar 60 kali sesaat.

Cara paling mudah untuk menyelesaikannya di JavaFX ialah menggunakan kelas AnimationTimer, di mana kaedah (bernama pemegang ()) boleh ditulis yang akan dipanggil pada kadar 60 kali sesaat, atau hampir dengan kadar yang mungkin. (Kelas ini tidak perlu digunakan semata-mata untuk tujuan animasi, ia boleh menjadi jauh lebih banyak.)

Menggunakan kelas AnimationTimer agak rumit: kerana ia adalah kelas abstrak, ia tidak boleh dibuat secara langsung-kelas mesti dilanjutkan sebelum contoh boleh dibuat. Walau bagaimanapun, untuk contoh ringkas kami, kami akan memperluaskan kelas dengan menulis kelas dalaman tanpa nama. Kelas dalam ini mesti menentukan pengendalian kaedah abstrak (), yang akan diluluskan satu hujah: masa sistem semasa dalam nanodetik. Selepas mendefinisikan kelas dalaman, kami segera memohon permulaan () kaedah, yang memulakan gelung. (Gelung boleh dihentikan dengan memanggil kaedah stop ().)

Dengan kelas ini, kita boleh mengubah suai ''Hello, Dunia'' contoh kami, mewujudkan animasi yang terdiri daripada Bumi yang mengorbit mengelilingi Matahari terhadap imej latar belakang berbintang.

Terdapat cara alternatif untuk melaksanakan gelung permainan di JavaFX. Pendekatan yang lebih sedikit (tetapi lebih fleksibel) melibatkan kelas Timeline, yang merupakan urutan animasi yang terdiri daripada satu set objek KeyFrame. Untuk membuat gelung permainan, Garis Masa perlu ditetapkan untuk mengulangi selama-lamanya, dan hanya satu KeyFrame diperlukan, dengan Jangka masa ditetapkan untuk 0.016 saat (untuk mencapai 60 kitaran sesaat). Pelaksanaan ini boleh didapati dalam fail Example3T.java dalam repo GitHub.

Animasi-Berasaskan Frame

Satu lagi komponen pengaturcaraan permainan yang diperlukan adalah animasi berasaskan bingkai: memaparkan urutan imej dalam penggantian pantas untuk mencipta ilusi pergerakan.

Dengan mengandaikan bahawa semua gelung animasi dan semua bingkai dipamerkan untuk bilangan detik yang sama, pelaksanaan dasar dapat semudah seperti berikut:

Untuk mengintegrasikan kelas ini ke dalam contoh terdahulu, kita boleh membuat UFO animasi, memulakan objek dengan menggunakan kod:

... dan, dalam AnimationTimer, menambah satu baris kod:

... di tempat yang sesuai. Untuk contoh kod kerja yang lengkap, lihat Contoh3AI.java fail dalam repo GitHub.

Mengendalikan Input Pengguna

Mengesan dan memproses input pengguna dalam JavaFX adalah mudah. Tindakan pengguna yang dapat dikesan oleh sistem, seperti menekan kekunci dan klik tetikus, dipanggil peristiwa. Dalam JavaFX, tindakan ini secara automatik menyebabkan penjanaan objek (seperti KeyEvent dan MouseEvent)yang menyimpan data yang berkaitan (seperti kekunci sebenar yang ditekan atau lokasi penunjuk tetikus). Mana-mana kelas JavaFX yang melaksanakan kelas EventTarget, seperti Scene, boleh 'mendengar' untuk acara dan mengendalikannya; dalam contoh-contoh yang berikut, kami akan menunjukkan bagaimana untuk menubuhkan Scene untuk memproses pelbagai acara.

Muncul melalui dokumentasi untuk kelas Scene, terdapat banyak kaedah yang mendengarkan untuk mengendalikan pelbagai jenis input dari pelbagai sumber. Sebagai contoh, kaedah setOnKeyPressed () boleh menetapkan EventHandler yang akan diaktifkan apabila kunci ditekan, kaedah setOnMouseClicked () boleh menetapkan EventHandler yang diaktifkan apabila butang tetikus ditekan, dan sebagainya. Kelas EventHandler berfungsi satu tujuan: untuk merangkum kaedah (dipanggil pemegang ()) yang dipanggil apabila peristiwa sepadan berlaku.

Apabila membuat EventHandler, anda mesti menentukan jenis Acara yang ditangani: anda boleh mengisytiharkan EventHandler<KeyEvent> atau a EventHandler<MouseEvent>, sebagai contoh. Juga, EventHandlers sering kali dicipta sebagai kelas dalaman tanpa nama, kerana ia biasanya hanya digunakan sekali (apabila mereka diluluskan sebagai hujah kepada salah satu kaedah yang disenaraikan di atas).

Menangani Acara Papan Kekunci

Input pengguna sering diproses dalam gelung permainan utama, dan oleh itu rekod mesti disimpan di mana kunci sedang aktif. Satu cara untuk mencapainya ialah dengan membuat objek ArrayList String. Apabila kunci pada awalnya ditekan, kami menambah perwakilan String dari KeyCode KeyCode ke senarai; apabila kunci dikeluarkan, kami mengeluarkannya dari senarai.

Dalam contoh di bawah, kanvas mengandungi dua imej kekunci anak panah; apabila kunci ditekan, imej yang sama menjadi hijau.


Kod sumber terkandung dalam contoh Example4K.java dalam repo GitHub.

Mengendalikan Peristiwa Mouse

Sekarang mari kita lihat contoh yang memfokuskan pada kelas MouseEvent dan bukannya kelas KeyEvent. Dalam permainan mini ini, pemain memperoleh titik setiap kali sasaran diklik.


Oleh kerana EventHandlers adalah kelas dalaman, sebarang pembolehubah yang mereka gunakan mestilah muktamad atau ''berkesan secara berkesan'', yang bermaksud bahawa pembolehubah tidak dapat dikukuhkan semula. Dalam contoh terdahulu, data telah dihantar kepada EventHandler dengan menggunakan ArrayList, yang nilainya boleh diubah tanpa menerangkan (melalui kaedah add () dan keluarkan ().

Bagaimanapun, dalam kes jenis data asas, nilai-nilai tidak boleh diubah setelah diinisialisasi. Sekiranya anda ingin EventHandler mengakses jenis data asas yang diubah di tempat lain dalam program, anda boleh membuat kelas wrapper yang mengandungi sama ada pembolehubah awam atau kaedah getter / setter. (Dalam contoh di bawah, IntValue adalah kelas yang mengandungi pembolehubah int awam yang dipanggil nilai.)

Kod sumber penuh terkandung dalam repo GitHub; kelas utama adalah Example4M.java.

Mewujudkan Kelas Sprite Asas Dengan JavaFX

Dalam permainan video, sprite adalah istilah untuk entiti visual tunggal. Berikut adalah contoh kelas Sprite yang menyimpan imej dan kedudukan, serta maklumat halaju (untuk entiti mudah alih) dan maklumat lebar / ketinggian untuk digunakan apabila mengira kotak terikat untuk tujuan pengesanan perlanggaran. Kami juga mempunyai kaedah standard getter / setter untuk kebanyakan data ini (ditinggalkan untuk kekurangan), dan beberapa kaedah standard yang diperlukan dalam pembangunan permainan:

  • kemas kini (): mengira kedudukan baru berdasarkan halaju Sprite.
  • render (): menarik imej bersekutu ke kanvas (melalui kelas GraphicsContext) menggunakan kedudukan sebagai koordinat.
  • getBoundary (): mengembalikan objek JavaFX Rectangle2D, berguna dalam pengesanan perlanggaran kerana kaedah silangnya.
  • intersects (): menentukan sama ada kotak sempadan Sprite ini berpotongan dengan Sprite yang lain.

Kod sumber penuh disertakan dalam Sprite.java dalam repo GitHub.

Menggunakan Kelas Sprite

Dengan bantuan kelas Sprite, kita boleh dengan mudah membuat permainan mengumpul mudah di JavaFX. Dalam permainan ini, anda menganggap peranan beg bimbit yang menjadi matlamatnya adalah untuk mengumpul beg wang banyak yang telah ditinggalkan oleh pemilik sebelumnya yang cuai. Kekunci anak panah bergerak pemain di sekitar skrin.

Kod ini banyak meminjam dari contoh sebelumnya: menetapkan fon untuk memaparkan skor, menyimpan input papan kekunci dengan ArrayList, melaksanakan gelang permainan dengan AnimationTimer, dan membuat kelas wrapper untuk nilai mudah yang perlu diubah suai semasa gelung permainan.

Satu segmen kod kepentingan tertentu melibatkan mewujudkan objek Sprite untuk pemain (beg bimbit) dan objek ArrayList of Sprite untuk koleksi (beg wang):

Segmen kode lain yang diminati adalah pembuatan AnimationTimer, yang ditugasi:

  • mengira masa berlalu sejak kemas kini terakhir
  • menetapkan halaju pemain bergantung pada kekunci yang sedang ditekan
  • melakukan pengesanan perlanggaran antara pemain dan koleksi, dan mengemas kini skor dan senarai koleksi ketika ini berlaku (seorang Iterator digunakan daripada ArrayList secara langsung untuk mengelakkan Pengecualian Pengubahsuaian Pesaingapabila mengeluarkan objek dari senarai)
  • memberikan spit dan teks ke kanvas

Seperti biasa, kod lengkap boleh didapati dalam fail kod yang dilampirkan (Example5.java) dalam repo GitHub.

Langkah seterusnya

  • Terdapat koleksi tutorial pengenalan di laman web Oracle, yang akan membantu anda mempelajari tugas umum JavaFX: Bermula dengan Aplikasi Sampingan JavaFX.
  • Anda mungkin berminat mempelajari cara menggunakan Scene Builder, persekitaran susun atur visual untuk mereka bentuk antara muka pengguna. Program ini menjana FXML, yang merupakan bahasa berasaskan XML yang boleh digunakan untuk menentukan antara muka pengguna untuk program JavaFX. Untuk ini, lihat JavaFX Scene Builder: Bermula.
  • Pengalaman FX adalah blog yang hebat, dikemas kini secara teratur, yang mengandungi maklumat dan projek sampel yang menarik kepada pemaju JavaFX. Kebanyakan demo yang disenaraikan agak inspirasi!
  • José Pereda mempunyai contoh yang sangat baik dalam permainan yang lebih maju yang dibina dengan JavaFX dalam repositori GitHubnya. 
  • Projek JFxtras terdiri daripada sekumpulan pemaju yang telah membuat komponen tambahan JavaFX yang menyediakan fungsi yang lazim diperlukan yang kini hilang dari JavaFX.
  • Projek JavaFXPorts membolehkan anda membungkus aplikasi JavaFX anda untuk penggunaan pada iOS dan Android.
  • Anda harus menandakan rujukan rasmi untuk JavaFX, khususnya, panduan JavaFX Oracle dan dokumentasi API.
  • Beberapa buku yang disemak di JavaFX termasuk Pro JavaFX 8, JavaFX 8 - Pengenalan dengan Contoh, dan minat khusus kepada pemaju permainan, Pembangunan Java 8 Permainan.

Kesimpulannya

Dalam tutorial ini, saya telah memperkenalkan anda kepada kelas JavaFX yang berguna dalam pengaturcaraan permainan. Kami bekerja melalui beberapa contoh peningkatan kerumitan, yang memuncak dalam permainan gaya-koleksi berasaskan sprite. Sekarang anda sudah bersedia untuk menyiasat beberapa sumber yang tersenarai di atas, atau menyelam masuk dan mula membuat permainan anda sendiri. Yang terbaik nasib anda dalam usaha anda!

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.