ฉันกำลังสร้างเกมที่ใช้วัตถุเกมตามองค์ประกอบและฉันมีเวลายากที่จะใช้วิธีการสำหรับแต่ละองค์ประกอบในการสื่อสารกับวัตถุเกม แทนที่จะอธิบายทุกอย่างพร้อมกันฉันจะอธิบายแต่ละส่วนของโค้ดตัวอย่างที่เกี่ยวข้อง:
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
เก็บวัตถุเกมทั้งหมดและส่วนประกอบของพวกเขา นอกจากนี้ยังรับผิดชอบในการปรับปรุงวัตถุของเกม มันทำได้โดยการอัพเดทเวกเตอร์ส่วนประกอบตามลำดับเฉพาะ ฉันใช้เวกเตอร์แทนอาร์เรย์เพื่อให้แทบจะไม่ จำกัด จำนวนวัตถุเกมที่สามารถมีอยู่ได้ในครั้งเดียว
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
ชั้นรู้ว่าสิ่งที่ส่วนประกอบและสามารถส่งข้อความให้กับพวกเขา
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
ระดับบริสุทธิ์เสมือนเพื่อให้ชั้นเรียนสำหรับประเภทที่แตกต่างกันของส่วนประกอบที่สามารถใช้วิธีการจัดการกับข้อความและการปรับปรุง นอกจากนี้ยังสามารถส่งข้อความได้
ตอนนี้ปัญหาที่เกิดขึ้นเกี่ยวกับวิธีส่วนประกอบสามารถเรียกsendMessage
ฟังก์ชั่นในและGameObject
GameObjectManager
ฉันคิดหาวิธีแก้ปัญหาสองวิธี
- ให้ชี้ไปของมัน
Component
GameObject
อย่างไรก็ตามเนื่องจากวัตถุของเกมอยู่ในเวกเตอร์พอยน์เตอร์อาจกลายเป็นโมฆะได้อย่างรวดเร็ว (เช่นเดียวกันกับที่พูดในเวกเตอร์GameObject
แต่หวังว่าการแก้ปัญหานี้จะสามารถแก้ปัญหานี้ได้) ฉันสามารถวางวัตถุของเกมในอาร์เรย์ได้ แต่จากนั้นฉันจะต้องส่งผ่านจำนวนที่กำหนดเองซึ่งอาจสูงและไม่จำเป็นโดยไม่จำเป็น
- ให้ชี้ไปที่
Component
GameObjectManager
อย่างไรก็ตามฉันไม่ต้องการให้ส่วนประกอบสามารถเรียกใช้ฟังก์ชั่นอัพเดทของผู้จัดการได้ ฉันเป็นคนเดียวที่ทำงานในโครงการนี้ แต่ฉันไม่ต้องการให้นิสัยในการเขียนรหัสที่อาจเป็นอันตราย
ฉันจะแก้ไขปัญหานี้ในขณะที่รักษารหัสของฉันให้ปลอดภัยและเป็นมิตรกับแคชได้อย่างไร