Özel Oyun Motorunda GameObjects Örneği

Oct 18 2020

Bu yüzden, oyun nesnelerimi evrene (Sahne nesnem) örnekleme konusunda biraz sorun yaşıyorum.

Sıfırdan boş bir nesne oluşturup oradan kolaylıkla doldurabilirim, sorunum az önce oluşturduğum gameobject'i klonlamaya çalıştığımda başlıyor.

Adımlarım

  1. Boş bir oyun nesnesi oluşturuyorum (GAMEOBJECT A)
  2. Ona bir bileşen ekliyorum (BİLEŞEN A)
  3. Şimdi A'dan bir oyun nesnesi B oluşturuyorum
  4. GameObject B oluşturuldu ve bileşen A, gameobject B'nin bileşen listesinde yer alıyor
  5. Kalıtımı kullanarak bileşeni almaya çalışıyorum ama nullptr döner

Görünüşe göre bileşenleri klonlamaya çalıştığımda, sadece temel sınıf işaretçisini döndürüyor. Burada türetilmiş sınıfı yeniden oluşturmaya ve onu yeni gameobject bileşen listesine eklemeye çalışıyorum ama açıkçası başarısız oluyorum.

  • Bunu kalıtımla çözemezsem nasıl çözebilirim?
  • Böyle bir tasarımı uygulamanın daha iyi bir yolu var mı?
  • veya c ++ 'da kalıtımı kullanamıyorum. Eğer öyleyse, burada neyi yanlış yaptığımı söyler misiniz?

Bu benim GameObject AKA RGameElement'im

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;
}

Bu benim Bileşenim AKA RElementComponent

class RGameElement;

class RElementComponent
{
public:
    RGameElement* RootGameElement;
    virtual RElementComponent GetReference() { return RElementComponent(); };
    virtual void Setup() {};
    virtual void StartLogic() {};
    virtual void UpdateLogic() {};


}

ve gameobject ref işlevi aracılığıyla bu benim Örneğim

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;
}

Yanıtlar

Roveldo Oct 18 2020 at 17:57

Yorumların yardımıyla çözmeyi başardım.

Türetilen nesnenin verilerini kopyalamak için bir arayüze ihtiyacım var gibi görünüyor.

Yani

  • Temel sınıf Clone () içinde saf bir sanal işlev oluşturuldu
  • Bu sanal işlevi türetilmiş sınıf içinde uyguladı

Kod şuna benzer

Temel Öğe Sınıfı

class RElementComponent
{
public:
    RElementComponent* RootGameElement;
    virtual RElementComponent* Clone() = 0;
    virtual void Setup() {};
    virtual void StartLogic() {};
    virtual void UpdateLogic() {};

};

Türetilmiş sınıf

class RObserver : public RElementComponent
{
public:
    int myOb;
    RObserver();
    void WhoAreYou();
    RObserver* Clone() 
    {
        RObserver* observer = new RObserver();
        *observer = *this;
        return observer;
    }
};