Saya telah menghabiskan 48 jam terakhir membaca tentang sistem Komponen Objek, dan merasa saya cukup siap untuk mulai mengimplementasikannya. Saya mendapat kelas Obyek dan Komponen dasar yang dibuat, tetapi sekarang saya harus mulai membuat komponen yang sebenarnya. Saya agak bingung. Ketika saya memikirkan mereka dalam hal HealthComponent atau sesuatu yang pada dasarnya hanya akan menjadi sebuah properti, itu masuk akal. Ketika itu adalah sesuatu yang lebih umum sebagai komponen Fisika / Grafik, saya agak bingung.
Kelas Object saya terlihat seperti ini sejauh ini (Jika Anda melihat ada perubahan yang harus saya buat, tolong beri tahu saya, masih baru dalam hal ini) ...
typedef unsigned int ID;
class GameObject
{
public:
GameObject(ID id, Ogre::String name = "");
~GameObject();
ID &getID();
Ogre::String &getName();
virtual void update() = 0;
// Component Functions
void addComponent(Component *component);
void removeComponent(Ogre::String familyName);
template<typename T>
T* getComponent(Ogre::String familyName)
{
return dynamic_cast<T*>(m_components[familyName]);
}
protected:
// Properties
ID m_ID;
Ogre::String m_Name;
float m_flVelocity;
Ogre::Vector3 m_vecPosition;
// Components
std::map<std::string,Component*> m_components;
std::map<std::string,Component*>::iterator m_componentItr;
};
Sekarang masalah yang saya hadapi adalah apa yang akan dimasukkan populasi umum ke dalam Komponen seperti Fisika / Grafik? Untuk Ogre (mesin render saya) Objek yang terlihat akan terdiri dari beberapa Ogre :: SceneNode (mungkin beberapa) untuk melampirkannya ke adegan, Ogre :: Entity (mungkin beberapa) untuk menampilkan jerat yang terlihat, dan sebagainya. Apakah lebih baik menambahkan beberapa GraphicComponent ke Object dan membiarkan setiap GraphicComponent menangani satu SceneNode / Entity atau apakah ide untuk memiliki satu dari setiap Komponen diperlukan?
Untuk Fisika saya bahkan lebih bingung. Saya kira mungkin membuat RigidBody dan melacak massa / interia / dll. akan masuk akal. Tetapi saya mengalami kesulitan memikirkan bagaimana sebenarnya menempatkan spesifik ke dalam Komponen.
Setelah saya menyelesaikan beberapa komponen "Diperlukan" ini, saya pikir itu akan lebih masuk akal. Sampai sekarang meskipun saya masih agak bingung.
sumber
Arsitektur komponen adalah alternatif untuk menghindari hierarki besar yang dicapai mewarisi semua elemen dari node yang sama, dan masalah kopling yang mengarah.
Anda menunjukkan arsitektur komponen dengan komponen "generik". Anda memiliki logika dasar untuk melampirkan dan melepaskan komponen "generik". Arsitektur dengan komponen generik lebih sulit dicapai karena Anda tidak tahu komponen mana. Manfaatnya adalah bahwa pendekatan ini dapat diperluas.
Arsitektur komponen yang valid dicapai dengan komponen yang ditentukan. Dengan didefinisikan maksudku, antarmuka didefinisikan, bukan implementasi. Misalnya, GameObject dapat memiliki IPhysicInstance, Transformation, IMesh, IAnimationController. Ini memiliki keuntungan karena Anda tahu antarmuka dan GameObject tahu cara menangani setiap komponen.
Menanggapi istilah generalisasi yang berlebihan
Saya pikir konsepnya tidak jelas. Ketika saya mengatakan komponen, tidak berarti bahwa semua komponen objek game harus diwariskan dari antarmuka komponen atau yang serupa. Namun ini adalah pendekatan untuk Komponen Generik, saya pikir itu adalah konsep yang Anda namakan sebagai komponen.
Arsitektur komponen adalah salah satu dari arsitektur yang ada untuk model objek runtime. Ini bukan satu-satunya dan bukan yang terbaik untuk semua kasus, tetapi pengalaman telah menunjukkan bahwa memiliki banyak manfaat, seperti kopling rendah.
Fitur utama yang membedakan arsitektur komponen adalah mengubah relasi is-a menjadi has-a. Misalnya arsitektur objek adalah-a:
Alih-alih arsitektur objek memiliki-a (komponen):
Ada juga arsitektur properti-sentris:
Misalnya, arsitektur objek normal adalah seperti ini:
Objek1
Objek2
Arsitektur properti-sentris:
Posisi
Orientasi
Lebih baik arsitektur model objek? Dalam perspektif kinerja, lebih baik properti-sentris karena lebih ramah-cache.
Komponen yang dimaksud adalah relasi is-a bukannya has-a. Komponen dapat berupa matriks Transformasi, angka empat, dll. Tetapi hubungan dengan objek game adalah relasi is-a, objek game tidak memiliki transformasi karena diwariskan. Game-objek memiliki (hubungan memiliki-a) transformasi. Transformasi kemudian menjadi komponen.
Objek permainan seperti hub. jika Anda menginginkan komponen yang selalu ada, maka mungkin komponen (seperti matriks) harus berada di dalam objek dan bukan pointer.
Tidak ada objek permainan yang sempurna untuk semua kasus, itu tergantung mesin, perpustakaan yang digunakan mesin. Mungkin saya ingin kamera yang tidak memiliki jala. Masalah dengan is-a architecture adalah bahwa jika objek-game memiliki mesh, maka kamera yang mewarisi dari objek-game harus memiliki mesh. Dengan komponen, kamera memiliki transformasi, pengontrol gerakan, dan apa pun yang Anda butuhkan.
Untuk informasi lebih lanjut, bab "14.2. Arsitektur Model Obyek Runtime" dari buku "Arsitektur Mesin Game" dari "Jason Gregory" membahas secara khusus subjek ini.
Diagram UML diekstraksi dari sana
sumber