Membuat instance GameObjects di Custom Game Engine

Oct 18 2020

Jadi, saya mengalami sedikit masalah dengan memberi contoh objek game saya ke alam semesta (Objek Adegan Saya).

Saya dapat membuat objek kosong dari awal dan mengisinya dari sana dengan mudah, masalah saya dimulai ketika saya mencoba mengkloning gameobject yang baru saja saya buat.

Langkah saya

  1. Saya membuat gameobject kosong (GAMEOBJECT A)
  2. Saya menambahkan komponen ke dalamnya (KOMPONEN A)
  3. Sekarang saya membuat gameobject B dari A
  4. GameObject B dibuat, dan komponen A ada di daftar komponen gameobject B
  5. Saya mencoba untuk mendapatkan komponen menggunakan warisan tetapi pengembalian nullptr

Sepertinya ketika saya mencoba untuk mengkloning komponen, itu hanya mengembalikan penunjuk kelas dasar. Di sana saya mencoba untuk membuat ulang kelas turunan dan menambahkannya ke daftar komponen gameobject baru tetapi jelas saya gagal.

  • Jika saya tidak bisa menyelesaikan ini dengan warisan, bagaimana saya bisa menyelesaikannya?
  • apakah ada cara yang lebih baik untuk menerapkan desing seperti itu?
  • atau saya hanya gagal menggunakan warisan di c ++. Jika ya, dapatkah kalian menunjukkan apa yang saya lakukan salah di sini

Ini adalah GameObject AKA RGameElement saya

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

Ini adalah Komponen AKA RElementComponent saya

class RGameElement;

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


}

dan ini Instantiate saya melalui fungsi 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;
}

Jawaban

Roveldo Oct 18 2020 at 17:57

Saya berhasil menyelesaikannya dengan bantuan komentar.

Sepertinya saya membutuhkan antarmuka untuk menyalin data objek turunan.

Begitu

  • Membuat fungsi virtual murni di dalam kelas dasar Clone ()
  • Menerapkan fungsi virtual itu di dalam kelas turunan

Kode terlihat seperti ini

Kelas Elemen Dasar

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

};

Kelas turunan

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