(আমি যা বর্ণনা করছি তা এই নকশার উপর ভিত্তি করে: একটি সত্তা সিস্টেমের কাঠামো কী ? , নীচে স্ক্রোল করুন এবং আপনি এটি খুঁজে পাবেন)
C ++ এ সত্তা-উপাদান সিস্টেম তৈরি করতে আমার কিছু সমস্যা হচ্ছে। আমি আমার উপাদান ক্লাস আছে:
class Component { /* ... */ };
অন্যান্য উপাদান তৈরি করার জন্য যা আসলে একটি ইন্টারফেস। সুতরাং, একটি কাস্টম উপাদান তৈরি করতে, আমি কেবল ইন্টারফেসটি প্রয়োগ করেছি এবং ইন-গেমের জন্য ব্যবহৃত ডেটা যুক্ত করব:
class SampleComponent : public Component { int foo, float bar ... };
এই উপাদানগুলি একটি সত্তা শ্রেণীর ভিতরে সংরক্ষণ করা হয়, যা সত্তার প্রতিটি উদাহরণকে একটি অনন্য আইডি দেয়:
class Entity {
int ID;
std::unordered_map<string, Component*> components;
string getName();
/* ... */
};
উপাদানগুলির নামটি হ্যাশ করে উপাদানগুলিকে সত্তায় যুক্ত করা হয় (এটি সম্ভবত এত বড় ধারণা নয়)। আমি যখন একটি কাস্টম উপাদান যুক্ত করি, তখন এটি উপাদান উপাদান (বেস শ্রেণি) হিসাবে সংরক্ষণ করা হয়।
এখন, অন্যদিকে, আমার একটি সিস্টেম ইন্টারফেস রয়েছে, যা ভিতরে নোড ইন্টারফেস ব্যবহার করে। নোড শ্রেণি একক সত্তার কিছু উপাদান সংরক্ষণ করতে ব্যবহৃত হয় (যেহেতু সিস্টেম সত্তার সমস্ত উপাদান ব্যবহারে আগ্রহী নয়)। যখন সিস্টেমটি করতে হয় update()
, এটি কেবল বিভিন্ন সত্ত্বা থেকে তৈরি নোডগুলির মাধ্যমে পুনরাবৃত্তি করতে হবে। তাই:
/* System and Node implementations: (not the interfaces!) */
class SampleSystem : public System {
std::list<SampleNode> nodes; //uses SampleNode, not Node
void update();
/* ... */
};
class SampleNode : public Node {
/* Here I define which components SampleNode (and SampleSystem) "needs" */
SampleComponent* sc;
PhysicsComponent* pc;
/* ... more components could go here */
};
এখন সমস্যা: ধরা যাক আমি নমুনা সিস্টেমে কোনও সত্তা পাস করে স্যাম্পলনোডগুলি তৈরি করি। স্যাম্পলনোড তারপরে স্যাম্পল সিস্টেম দ্বারা ব্যবহারের জন্য প্রয়োজনীয় উপাদানগুলি রয়েছে কিনা তা "পরীক্ষা করে"। সত্তার অভ্যন্তরে যখন কাঙ্ক্ষিত উপাদানটি অ্যাক্সেস করতে হবে তখন সমস্যাটি উপস্থিত হয়: উপাদানটি একটি Component
(বেস শ্রেণি) সংগ্রহে সঞ্চিত থাকে , তাই আমি উপাদানটি অ্যাক্সেস করতে এবং এটি নতুন নোডে অনুলিপি করতে পারি না। আমি অস্থায়ীভাবে Component
একটি উদ্ভূত প্রকারে নিচে নামিয়ে সমস্যার সমাধান করেছি , তবে আমি আরও জানতে চাই যে এটি করার আরও ভাল উপায় আছে কিনা। আমি বুঝতে পারছি এর অর্থ আমার ইতিমধ্যে যা আছে তা আবার ডিজাইনিং করা উচিত। ধন্যবাদ।