Instanziieren von GameObjects in der Custom Game Engine

Oct 18 2020

Ich habe also ein kleines Problem damit, meine Spielobjekte in das Universum (My Scene-Objekt) zu instanziieren.

Ich kann ein leeres Objekt von Grund auf neu erstellen und es von dort aus problemlos füllen. Mein Problem beginnt, wenn ich versuche, das gerade erstellte Spielobjekt zu klonen.

Meine Schritte sind

  1. Ich erstelle ein leeres Spielobjekt (GAMEOBJECT A)
  2. Ich füge eine Komponente hinzu (KOMPONENTE A)
  3. Jetzt erstelle ich ein Spielobjekt B aus A.
  4. GameObject B wurde erstellt und die Komponente A befindet sich in der Komponentenliste des Gameobjects B.
  5. Ich versuche, die Komponente mithilfe der Vererbung abzurufen, aber nullptr gibt zurück

Es scheint, wenn ich versuche, Komponenten zu klonen, gibt es nur den Basisklassenzeiger zurück. Dort versuche ich, die abgeleitete Klasse neu zu erstellen und sie zur Komponentenliste des neuen Gameobjects hinzuzufügen, aber offensichtlich scheitere ich.

  • Wenn ich das nicht mit Vererbung lösen kann, wie kann ich es lösen?
  • Gibt es einen besseren Weg, um ein solches Design umzusetzen?
  • oder ich verwende die Vererbung in C ++ einfach nicht. Wenn ja, könnt ihr darauf hinweisen, was ich hier falsch mache

Dies ist mein GameObject AKA RGameElement

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

Dies ist meine Komponente AKA RElementComponent

class RGameElement;

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


}

und dies ist meine Instantiate via Gameobject Ref Funktion

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

Antworten

Roveldo Oct 18 2020 at 17:57

Ich habe es mit Hilfe der Kommentare gelöst.

Es scheint, dass ich eine Schnittstelle brauchte, um die Daten des abgeleiteten Objekts zu kopieren.

So

  • Erstellt eine reine virtuelle Funktion in einer Basisklasse Clone ()
  • Implementierte diese virtuelle Funktion innerhalb der abgeleiteten Klasse

Code sieht so aus

Basiselementklasse

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

};

Abgeleitete Klasse

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