Mengelola daftar berbagai jenis entitas - adakah cara yang lebih baik?

9

Saya mengembangkan game ruang 2D untuk perangkat seluler, tetapi semakin rumit dan solusi saya benar-benar membingungkan dan menghasilkan banyak segmen kode berulang.

Saya memiliki kelas dunia di mana saya memiliki daftar objek yang berbeda seperti:

List<Enemy> enemys;
List<Projectile> projectiles;
List<Collectable> collectables;
List<Asteroid> asteroids;
List<Effect> effects;
..

Setiap daftar akan diperbarui oleh kelas dunia. tapi bukan itu saja .. Setiap musuh memiliki daftar mesin, dan daftar peluncur senjata yang diperbarui oleh musuh. Sekarang setiap mesin menambahkan beberapa efek api ke 'efek' daftar dunia, dan setiap senjata-senjata menambahkan proyektil ke 'proyektil' daftar dunia. Semua kelas ini memiliki parameter yang berbeda, jadi saya memerlukan pembaruan tambahan dan fungsi render tambahan untuk setiap kelas.

Setidaknya mereka semua adalah anak-anak dari 'GameObject' yang memberikan mereka hal-hal dasar seperti vektor posisi, kecepatan dan akselerasi, mengikat Poligon dan fungsi seperti applyForce dan mesin keadaan terbatas

Apakah ada cara yang lebih baik atau lebih umum untuk melakukan ini? seperti satu kelas catch-all yang berisi semua parameter dan metode yang mungkin untuk semua objek yang berbeda. (saya pikir ini akan menghasilkan kode yang lebih membingungkan)

Kacang
sumber
Ini mirip dengan pertanyaan saya: gamedev.stackexchange.com/questions/22559/... Saya sarankan melihat jawaban yang diberikan.
Derek

Jawaban:

5

Apakah ada cara yang lebih baik atau lebih umum untuk melakukan ini? seperti satu kelas catch-all yang berisi semua parameter dan metode yang mungkin untuk semua objek yang berbeda.

Ya, itu disebut arsitektur . Lihat detailnya di sini .

Ini akan membiarkan hanya satu daftar entitas di kelas dunia Anda:

List<Entity>

Ini adalah salah satu contoh Komposisi atas warisan .

Laurent Couvidou
sumber
3

Dalam batas-batas pertanyaan awal Anda, salah satu pilihan adalah membagi daftar menjadi Tindakan alih-alih Jenis seperti yang Anda miliki. Misalnya, Anda akan memiliki List<HasAI>dan satu untuk List<Collidable>dan ketika Anda membuat objek baru itu menambahkan dirinya sendiri ke daftar tindakan apa pun yang diperlukan, ketika objek dihancurkan maka ia menghapus dirinya sendiri dari daftar tersebut. Objek dapat berada di beberapa daftar.

Langkah dua dari opsi itu adalah untuk memperbaiki kelas Anda dari hierarki menjadi yang menggunakan Antarmuka, jadi tipe HasAI Anda adalah kelas yang mengimplementasikan antarmuka IBrains sebagai contoh. Padanan itu List<HasAI>hanya membutuhkan objek untuk memiliki antarmuka IBrains.

Itu akan membantu membersihkan beberapa kerumitan.

Patrick Hughes
sumber
2

Saya pikir apa yang perlu Anda lakukan adalah mengabstraksi rendering ke kelasnya sendiri, saya pikir satu untuk pemain dan satu untuk musuh (atau mungkin hanya satu untuk pemain, dan kemudian membuat contoh untuk pemain dan musuh - tidak 100% yakin desain game Anda.)

Anda bisa menggunakan pola pengunjung untuk membiarkan perender berputar di sekitar berbagai objek dan memutuskan apa yang akan digambar, yang mungkin tidak terlalu rumit.

nycynik
sumber
2

Menggunakan kelas dasar dan mengandalkan polimorfisme adalah ide yang sangat bagus. Tetapi ada beberapa pendekatan alternatif. Ada dua artikel karya Noel Llopis yang layak dibaca. Saya telah melihat Desain Berorientasi Data akhir-akhir ini dan berpikir itu memiliki beberapa kelebihan.

Artikel ada di sini dan di sini . Ini mungkin menyederhanakan kode Anda sedikit lebih banyak daripada polimorfisme. Tapi seperti YMMV apa pun, lihatlah dan lihat apakah itu cocok dengan apa yang ingin Anda capai. Polimorfisme menggunakan warisan dan DOD menggunakan agregasi, baik pro maupun kontra, jadi pilih racun Anda.

Britchie
sumber
1

Anda dapat menggunakan OOP dan terutama polimorfisme.

Pada dasarnya, Anda harus membuat kelas dasar, tempat semua entitas game mewarisi. Kelas dasar ini, seabstrak mungkin, akan berisi hal-hal seperti fungsi Penciptaan, Pembaruan, dan Mungkin Hancurkan.

Lalu Anda mendapatkan semua objek game lain dari kelas ini. Anda mungkin juga perlu menambahkan semacam refleksi ke dalam kode Anda jika bahasa Anda tidak mendukungnya, untuk melakukan beberapa hal yang lebih maju, tetapi itu bisa dihindari jika Anda tahu bagaimana menyusun warisan Anda dengan benar.

Marlock
sumber
1
Dia sudah melakukan ini - semua kelasnya adalah anak-anak GameObject. Dia hanya perlu mengubah serangkaian daftar menjadi satu daftar GameObjects.
SomeGuy