আমি এমন একটি গেম তৈরি করছি যা কম্পোনেন্ট-ভিত্তিক গেম অবজেক্ট ব্যবহার করে এবং প্রতিটি উপাদান তার গেম অবজেক্টের সাথে যোগাযোগের জন্য একটি উপায় কার্যকর করতে আমার বেশ কষ্ট হচ্ছে। একবারে সবকিছু ব্যাখ্যা করার পরিবর্তে, আমি প্রাসঙ্গিক নমুনা কোডের প্রতিটি অংশ ব্যাখ্যা করব:
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।
তবে আমি চাই না যে উপাদানগুলি পরিচালকের আপডেট ফাংশনটিতে কল করতে সক্ষম হোক। আমি এই প্রকল্পে কাজ করা একমাত্র ব্যক্তি, তবে আমি সম্ভাব্য বিপজ্জনক কোড লেখার অভ্যাস পেতে চাই না।
আমার কোডটি নিরাপদ এবং ক্যাশে বন্ধুত্বপূর্ণ রাখার সময় আমি কীভাবে এই সমস্যার সমাধান করতে পারি?