Bileşen tabanlı oyun nesnelerini kullanan bir oyun yapıyorum ve her bileşenin oyun nesnesiyle iletişim kurması için bir yol uygulamakta zorlanıyorum. Her şeyi bir kerede açıklamak yerine, ilgili örnek kodun her bir bölümünü açıklayacağım:
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;
}
GameObjectManager
Tüm oyun nesneleri ve onların bileşenleri tutar. Oyun nesnelerini güncellemekten de sorumludur. Bunu, bileşen vektörlerini belirli bir sırayla güncelleyerek yapar. Aynı anda var olabilecek oyun nesnelerinin sayısında neredeyse hiçbir sınırlama olmaması için diziler yerine vektörler kullanıyorum.
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;
}
GameObject
Sınıf onun bileşenleridir bilir ve onlara mesaj gönderebilirsiniz.
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);
}
Component
Sınıf bileşenlerinin farklı türleri için sınıflar mesajları ve güncelleştirme nasıl işleneceğini uygulayabilir saf sanal böyledir. Ayrıca mesaj gönderebilir.
Şimdi sorun, bileşenlerin ve içindeki sendMessage
işlevleri nasıl çağırabileceğiyle ilgili . İki olası çözüm buldum:GameObject
GameObjectManager
Component
Bir işaretçi verinGameObject
.
Bununla birlikte, oyun nesneleri bir vektörde olduğu için, işaretçiler hızla geçersiz hale gelebilir (Aynı şey vektör içinde de söylenebilir GameObject
, ancak umarım bu sorunun çözümü de bunu çözebilir). Oyun nesnelerini bir diziye koyabilirdim, ancak boyut için rasgele bir sayı geçmem gerekecekti, bu da gereksiz yere yüksek ve bellek kaybı olabilir.
Component
İşaretçisi verinGameObjectManager
.
Ancak, bileşenlerin yöneticinin güncelleme işlevini çağırabilmesini istemiyorum. Bu proje üzerinde çalışan tek kişi benim, ancak potansiyel olarak tehlikeli kod yazma alışkanlığına girmek istemiyorum.
Kodumu güvenli ve önbellek dostu tutarken bu sorunu nasıl çözebilirim?