Khởi tạo GameObjects trong Custom Game Engine
Vì vậy, tôi gặp một chút vấn đề với việc khởi tạo đối tượng trò chơi của mình vào vũ trụ (đối tượng Cảnh của tôi).
Tôi có thể tạo một đối tượng trống từ đầu và điền nó từ đó một cách dễ dàng, vấn đề của tôi bắt đầu khi tôi cố gắng sao chép đối tượng trò chơi mà tôi vừa tạo.
Các bước của tôi là
- Tôi tạo một đối tượng trò chơi trống (GAMEOBJECT A)
- Tôi thêm một thành phần vào nó (THÀNH PHẦN A)
- Bây giờ tôi tạo một gameobject B từ A
- GameObject B đã được tạo và thành phần A nằm trong danh sách thành phần của gameobject B
- Tôi cố gắng lấy thành phần bằng cách sử dụng kế thừa nhưng nullptr trả về
Có vẻ như khi tôi cố gắng sao chép các thành phần, nó chỉ trả về con trỏ lớp cơ sở. Ở đó tôi cố gắng tạo lại lớp dẫn xuất và thêm nó vào danh sách thành phần của gameobject mới nhưng rõ ràng là tôi thất bại.
- Nếu tôi không thể giải quyết vấn đề này với kế thừa, làm thế nào tôi có thể giải quyết nó?
- có cách nào tốt hơn để thực hiện một desing như vậy không?
- hoặc tôi không thể sử dụng kế thừa trong c ++. Nếu có, các bạn có thể chỉ ra tôi đang làm gì sai ở đây không
Đây là GameObject AKA RGameElement của tôi
class RGameElement
{
protected:
vector<RElementComponent*> Elements;
public:
template <class T>
T* GetComponent() {
int elementSize = Elements.size();
for (int i = 0;i < elementSize;i++)
{
T* pr = dynamic_cast<T*>(Elements[i]);
if (pr != nullptr)
return pr;
}
return nullptr;
}
template <class T>
T* AddComponent() {
T* newElementComp = new T();
Elements.push_back(newElementComp);
return newElementComp;
}
void AddComponent(RElementComponent* targetComponent)
{
RElementComponent* newElement = new RElementComponent();
*newElement = *targetElement;
Elements.push_back(newElement);
}
/*void AddComponent(RElementComponent* targetComponent);*/
vector<RElementComponent*> GetComponent() const;
}
Đây là Thành phần AKA RElementComponent của tôi
class RGameElement;
class RElementComponent
{
public:
RGameElement* RootGameElement;
virtual RElementComponent GetReference() { return RElementComponent(); };
virtual void Setup() {};
virtual void StartLogic() {};
virtual void UpdateLogic() {};
}
và đây là Instantiate của tôi thông qua chức năng ref gameobject
RGameElement* RUniverse::Instantiate(RGameElement* targetGameElement)
{
RGameElement* newElement = new RGameElement();
vector<RElementComponent*> components = targetGameElement->GetComponents();
int componentSize = components.size();
for (int i = 0;i < componentSize;i++)
{
newElement->AddComponent(components[i]);
}
Elements.push_back(newElement);
return newElement;
}
Trả lời
Tôi quản lý để giải quyết nó với sự giúp đỡ của các ý kiến.
Có vẻ như tôi cần một giao diện để sao chép dữ liệu của đối tượng dẫn xuất.
Vì thế
- Đã tạo một hàm ảo thuần túy bên trong một lớp cơ sở Clone ()
- Đã triển khai hàm ảo đó bên trong lớp dẫn xuất
Mã trông như thế này
Lớp phần tử cơ sở
class RElementComponent
{
public:
RElementComponent* RootGameElement;
virtual RElementComponent* Clone() = 0;
virtual void Setup() {};
virtual void StartLogic() {};
virtual void UpdateLogic() {};
};
Lớp có nguồn gốc
class RObserver : public RElementComponent
{
public:
int myOb;
RObserver();
void WhoAreYou();
RObserver* Clone()
{
RObserver* observer = new RObserver();
*observer = *this;
return observer;
}
};