Saya membuat game yang menggunakan objek game berbasis komponen, dan saya mengalami kesulitan menerapkan cara untuk setiap komponen berkomunikasi dengan objek game-nya. Daripada menjelaskan semuanya sekaligus, saya akan menjelaskan setiap bagian dari kode sampel yang relevan:
class GameObjectManager {
public:
//Updates all the game objects
void update(Time dt);
//Sends a message to all game objects
void sendMessage(Message m);
private:
//Vector of all the game objects
std::vector<GameObject> gameObjects;
//vectors of the different types of components
std::vector<InputComponent> input;
std::vector<PhysicsComponent> ai;
...
std::vector<RenderComponent> render;
}
The GameObjectManager
memegang semua objek game dan komponennya. Ini juga bertanggung jawab untuk memperbarui objek game. Ini dilakukan dengan memperbarui vektor komponen dalam urutan tertentu. Saya menggunakan vektor alih-alih array sehingga hampir tidak ada batasan jumlah objek game yang bisa ada sekaligus.
class GameObject {
public:
//Sends a message to the components in this game object
void sendMessage(Message m);
private:
//id to keep track of components in the manager
const int id;
//Pointers to components in the game object manager
std::vector<Component*> components;
}
The GameObject
kelas tahu apa komponennya dan dapat mengirim pesan kepada mereka.
class Component {
public:
//Receives messages and acts accordingly
virtual void handleMessage(Message m) = 0;
virtual void update(Time dt) = 0;
protected:
//Calls GameObject's sendMessage
void sendMessageToObject(Message m);
//Calls GameObjectManager's sendMessage
void sendMessageToWorld(Message m);
}
The Component
kelas begitu virtual murni bahwa kelas untuk berbagai jenis komponen dapat menerapkan cara menangani pesan dan update. Itu juga mampu mengirim pesan.
Sekarang muncul masalah tentang bagaimana komponen dapat memanggil sendMessage
fungsi dalam GameObject
dan GameObjectManager
. Saya datang dengan dua solusi yang mungkin:
- Berikan
Component
pointer ke nyaGameObject
.
Namun, karena objek permainan berada dalam vektor, pointer dapat dengan cepat menjadi tidak valid (Hal yang sama dapat dikatakan tentang vektor dalam GameObject
, tetapi mudah-mudahan solusi untuk masalah ini juga dapat menyelesaikannya). Saya bisa meletakkan objek game dalam array, tapi kemudian saya harus memberikan angka arbitrer untuk ukurannya, yang bisa dengan mudah menjadi tinggi dan membuang-buang memori.
- Berikan
Component
pointer keGameObjectManager
.
Namun, saya tidak ingin komponen dapat memanggil fungsi pembaruan manajer. Saya satu-satunya orang yang mengerjakan proyek ini, tetapi saya tidak ingin terbiasa menulis kode yang berpotensi berbahaya.
Bagaimana saya bisa mengatasi masalah ini sambil menjaga kode saya aman dan ramah cache?