Tôi đang tạo một trò chơi sử dụng các đối tượng trò chơi dựa trên thành phần và tôi đang gặp khó khăn khi thực hiện một cách để mỗi thành phần giao tiếp với đối tượng trò chơi của nó. Thay vì giải thích mọi thứ cùng một lúc, tôi sẽ giải thích từng phần của mã mẫu có liên quan:
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;
}
Việc GameObjectManager
giữ tất cả các đối tượng trò chơi và các thành phần của chúng. Nó cũng chịu trách nhiệm cập nhật các đối tượng trò chơi. Nó thực hiện điều này bằng cách cập nhật các vectơ thành phần theo một thứ tự cụ thể. Tôi sử dụng các vectơ thay vì các mảng để hầu như không có giới hạn về số lượng đối tượng trò chơi có thể tồn tại cùng một lúc.
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;
}
Các GameObject
lớp biết những gì các thành phần của nó đang có và có thể gửi tin nhắn cho họ.
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);
}
Các Component
lớp học là tinh khiết để ảo mà lớp dành cho các loại khác nhau của các thành phần có thể thực hiện như thế nào để xử lý tin nhắn và cập nhật. Nó cũng có thể gửi tin nhắn.
Bây giờ vấn đề phát sinh về cách các thành phần có thể gọi các sendMessage
hàm trong GameObject
và GameObjectManager
. Tôi đã đưa ra hai giải pháp khả thi:
- Đưa ra
Component
một con trỏ tới nóGameObject
.
Tuy nhiên, vì các đối tượng trò chơi nằm trong một vectơ, các con trỏ có thể nhanh chóng bị vô hiệu hóa (Điều tương tự có thể được nói về vectơ trong GameObject
, nhưng hy vọng giải pháp cho vấn đề này cũng có thể giải quyết vấn đề đó). Tôi có thể đặt các đối tượng trò chơi trong một mảng, nhưng sau đó tôi sẽ phải chuyển một số tùy ý cho kích thước, có thể dễ dàng gây ra bộ nhớ cao và lãng phí một cách không cần thiết.
- Đưa ra
Component
một con trỏ tớiGameObjectManager
.
Tuy nhiên, tôi không muốn các thành phần có thể gọi chức năng cập nhật của người quản lý. Tôi là người duy nhất làm việc trong dự án này, nhưng tôi không muốn có thói quen viết mã nguy hiểm tiềm tàng.
Làm cách nào để giải quyết vấn đề này trong khi giữ cho mã của tôi an toàn và thân thiện với bộ đệm?