Bagaimana saya bisa mendefinisikan item dalam RPG saya seperti game Java?

21

Saya dengan santai mengerjakan game jenis RPG di Jawa tetapi saya mengalami kesulitan mencari tahu bagaimana saya bisa memiliki item yang dapat melakukan banyak hal yang berbeda tanpa membuat kelas yang berbeda untuk setiap item.

Sebagai contoh, bagaimana saya membuat Kapak yang dapat menebang pohon dan menyerang monster?

Jika saya memperpanjang kelas memotong atau senjata maka saya tidak dapat memperpanjang kelas lainnya.

Jika saya telah memotong dan senjata menjadi antarmuka maka saya akan memiliki banyak kode duplikat ketika belati juga dapat menyerang monster dan kapak yang berbeda dapat memotong pohon.

Saya berharap ada cara untuk memiliki kelas Item tunggal dan memuat item dan kemampuan masing-masing dari file. Jika itu mungkin, bagaimana bisa dilakukan? Jika tidak maka apa cara terbaik untuk memiliki item dalam game?

MESLewis
sumber

Jawaban:

15

Jawaban Gregory Weir adalah favorit saya untuk bagaimana menyusun contoh item untuk melakukan beberapa peran.

Untuk memuat dari file:

Pertama, gunakan YAML. YAML adalah bahasa deskripsi data yang memiliki fitur; itu dapat diurai relatif cepat, dibaca dan diedit oleh manusia, mendukung data biner, dan perpustakaan ada untuk sebagian besar bahasa pemrograman, termasuk Java. Ini memecahkan "bagaimana cara saya mendapatkan data dari file ke objek?"

Kedua, gunakan pola bobot terbang . Sebagian besar data yang Anda baca dari file-file itu statis. Ini tidak akan berubah per instance ("kapak merusak 1d10 dan merusak kayu tetapi bukan batu" - itu benar dari kelima kapak yang dimiliki pemain). Apa yang sebenarnya Anda baca dari file YAML adalah definisi platonis ini, dan instance item individual Anda memiliki referensi yang tidak dimiliki (dan konstan) untuk ini, bersama dengan data per-instance seperti "Berapa ayunan sebelum saya putus?", "Apakah pemain memberikan saya nama khusus? ", dan seterusnya.

Dengan berbagi data lintas-contoh dalam satu objek, Anda menghemat banyak memori, dan membuatnya mudah untuk memperbarui item tanpa status permainan yang bertahan lama (simpan game atau basis data pemain).

Jadi struktur kelas Anda terlihat seperti:

  • Item kelas - Satu instance per item
    • Own-a Weapon instance
    • Own-a Tool instance
    • Memiliki-nama khusus, dll.
  • class Weapon - (Hingga) satu instance per item
    • Is-a ItemComponent
    • Merujuk pada WeaponDef
    • Memiliki tingkat pesona bonus, dll.
  • Alat kelas - (Hingga) satu instance per item
    • Is-a ItemComponent
    • Merujuk pada ToolDef
    • Memiliki daya tahan, dll.
  • class WeaponDef - Satu instance per jenis senjata
    • Baca dari file, bidang harus konstan.
    • Memiliki-jumlah kerusakan dasar, 1 atau 2 tangan, dll.
  • class ToolDef - Satu instance per jenis alat
    • Baca dari file, bidang harus konstan.
    • Memiliki daya tahan dasar, bahan yang bisa pecah, dll.
Marko Zajc
sumber
18

Pola desain Component (not Composite) sangat bagus untuk tujuan ini: http://gameprogrammingpatterns.com/component.html

Pada dasarnya, sebuah Ax akan menjadi instance dari kelas Item yang berisi WeaponComponent dan ToolComponent (mungkin). Untuk menguji apakah sesuatu dapat digunakan sebagai senjata, periksa apakah itu memiliki WeaponComponent yang terpasang, dan kemudian bicara dengan instance WeaponComponent untuk mendapatkan info senjata item tersebut.

Memuat dari file tentu saja merupakan latihan terpisah.

Gregory Avery-Weir
sumber
Dan tentu saja, setelah Anda memiliki komponen, Anda dapat menggunakan antarmuka lagi. Tipe Axe Anda dapat mengimplementasikan IChopper dan IWeapon tetapi kemudian dapat mengekspos perilaku komponen untuk itu, memungkinkan Anda untuk menggunakan kembali tipe dan implementasinya sesuai kebutuhan dan memotong tes untuk komponen. Jika semua sumbu memiliki kemampuan yang sama tetapi statistik berbeda, maka Anda emas. Jika Anda membutuhkan item untuk memiliki kemampuan unik, Anda mungkin perlu mengimplementasikan koleksi-komponen-game dan meminta rutinitas pembaruan untuk menanyakan objek apa yang dapat mereka lakukan melalui komponen mana yang ada.
CodexArcanum
6
@ CodexArcanum: "Tipe kapak Anda dapat mengimplementasikan IChopper dan IWeapon tetapi kemudian dapat mengekspos perilaku komponen untuk itu" - Apa gunanya ini? Itu hanya menggembungkan hierarki kelas Anda. Inti dari pola komponen adalah bahwa Anda tidak memerlukan kelas Axe atau antarmuka IChopper atau antarmuka IWeapon, hanya komponen Chopper dan Senjata yang konkret, dan Item tingkat atas.
Saat ini saya sedang mengerjakan sistem komponen untuk item permainan saya, dan benar-benar hanya memiliki satu keluhan utama tentang bagaimana pola tersebut digunakan. Mengingat komponen-komponen Senjata, Pakaian, dan Barang Habis, sebuah item bisa secara teoritis "rusak" dalam hal barang-barang yang tidak bisa menjadi Senjata dan Pakaian, atau Pakaian yang juga Dapat Dikonsumsi. Logikanya suatu item hanya dapat menjadi satu "Komponen Utama", tetapi dengan membatasi komponen Anda melanggar kebutuhan untuk sistem komponen secara bersamaan. Dengan demikian, salah satu kelemahan mendasar dengan sistem yang luar biasa
Krythic