Saya baru-baru ini memutuskan untuk mengubah arsitektur game saya untuk menyingkirkan hierarki kelas yang dalam dan menggantinya dengan komponen yang dapat dikonfigurasi. Hirarki pertama yang saya ganti adalah hirarki Item dan saya ingin beberapa saran untuk mengetahui apakah saya berada di jalur yang benar.
Sebelumnya, saya memiliki hierarki yang berbunyi seperti ini:
Item -> Equipment -> Weapon
-> Armor
-> Accessory
-> SyntehsisItem
-> BattleUseItem -> HealingItem
-> ThrowingItem -> ThrowsAsAttackItem
Tak perlu dikatakan itu mulai menjadi berantakan dan ini bukan solusi mudah untuk item yang perlu beberapa jenis (yaitu beberapa peralatan digunakan dalam sintesis barang, beberapa peralatan dapat dibuang, dll.)
Saya kemudian mencoba untuk memperbaiki dan menempatkan fungsionalitas ke dalam kelas item dasar. Tapi kemudian saya memperhatikan bahwa Item memiliki banyak data yang tidak terpakai / berlebihan. Sekarang saya mencoba melakukan komponen seperti arsitektur, setidaknya untuk item saya sebelum mencoba melakukannya ke kelas permainan saya yang lain.
Inilah yang sedang saya pikirkan untuk pengaturan komponen:
Saya memiliki kelas item dasar yang memiliki slot untuk berbagai komponen (yaitu slot komponen peralatan, slot komponen penyembuhan, dll. Serta peta untuk komponen sewenang-wenang) jadi sesuatu seperti ini:
class Item
{
//Basic item properties (name, ID, etc.) excluded
EquipmentComponent* equipmentComponent;
HealingComponent* healingComponent;
SynthesisComponent* synthesisComponent;
ThrowComponent* throwComponent;
boost::unordered_map<std::string, std::pair<bool, ItemComponent*> > AdditionalComponents;
}
Semua komponen item akan diwarisi dari kelas ItemComponent dasar, dan masing-masing tipe Komponen bertanggung jawab untuk memberi tahu mesin cara mengimplementasikan fungsi itu. yaitu HealingComponent memberi tahu mekanika pertempuran cara mengonsumsi item sebagai item penyembuhan, sedangkan ThrowComponent memberi tahu mesin pertempuran cara memperlakukan item sebagai item yang bisa dibuang.
Peta ini digunakan untuk menyimpan komponen acak yang bukan komponen inti. Saya memasangkannya dengan bool untuk menunjukkan apakah Wadah Item harus mengelola ItemComponent atau jika dikelola oleh sumber eksternal.
Ide saya di sini adalah bahwa saya mendefinisikan komponen inti yang digunakan oleh mesin gim saya di muka, dan pabrik item saya akan menetapkan komponen yang benar-benar dimiliki oleh item tersebut, jika tidak maka itu adalah nol. Peta akan mengandung komponen arbitrer yang umumnya akan ditambahkan / dikonsumsi oleh file skrip.
Pertanyaan saya adalah, apakah ini desain yang bagus? Jika tidak, bagaimana cara meningkatkannya? Saya mempertimbangkan untuk mengelompokkan semua komponen ke dalam peta, tetapi menggunakan pengindeksan string tampaknya tidak diperlukan untuk komponen item inti