Scene-Abstraction #16

Closed
opened 2026-04-16 20:18:20 +00:00 by sebastian · 0 comments
Owner

Problem: Es gibt keine Möglichkeit, zusammengehörige Layer als Einheit zu verwalten. Beim Übergang vom Hauptmenü zum Spiel müssen alle alten Layer manuell deregistriert und neue manuell registriert werden. Die Application kennt keine Konzept von "aktuellem Zustand".
Lösung: Eine Scene kapselt eine Menge von Layern, die gemeinsam aktiv sind:

// engine/scene/Scene.h
class Scene {
public:
    virtual ~Scene() = default;
    virtual void onEnter()  {}  // Layer registrieren, Assets schedulen
    virtual void onExit()   {}  // Aufräumen, Layer deregistrieren
    virtual void onUpdate() {}  // delegiert an eigene Layer
    virtual void onRender() {}  // delegiert an eigene Layer

protected:
    std::vector<std::unique_ptr<Layer>> layers;

    template<typename T, typename... Args>
    T* pushLayer(Args&&... args) {
        auto layer = std::make_unique<T>(std::forward<Args>(args)...);
        T* ptr = layer.get();
        layers.push_back(std::move(layer));
        return ptr;
    }
};

Acceptance Criteria:

  • Scene.h in src/engine/scene/ existiert
  • Scene hat onEnter/onExit/onUpdate/onRender
  • Scene verwaltet seinen eigenen Layer-Stack
  • Kein Spielcode in der Basisklasse
Problem: Es gibt keine Möglichkeit, zusammengehörige Layer als Einheit zu verwalten. Beim Übergang vom Hauptmenü zum Spiel müssen alle alten Layer manuell deregistriert und neue manuell registriert werden. Die Application kennt keine Konzept von "aktuellem Zustand". Lösung: Eine Scene kapselt eine Menge von Layern, die gemeinsam aktiv sind: ``` // engine/scene/Scene.h class Scene { public: virtual ~Scene() = default; virtual void onEnter() {} // Layer registrieren, Assets schedulen virtual void onExit() {} // Aufräumen, Layer deregistrieren virtual void onUpdate() {} // delegiert an eigene Layer virtual void onRender() {} // delegiert an eigene Layer protected: std::vector<std::unique_ptr<Layer>> layers; template<typename T, typename... Args> T* pushLayer(Args&&... args) { auto layer = std::make_unique<T>(std::forward<Args>(args)...); T* ptr = layer.get(); layers.push_back(std::move(layer)); return ptr; } }; ``` Acceptance Criteria: - Scene.h in src/engine/scene/ existiert - Scene hat onEnter/onExit/onUpdate/onRender - Scene verwaltet seinen eigenen Layer-Stack - Kein Spielcode in der Basisklasse
sebastian added this to the Scene-Abstraction milestone 2026-04-16 20:18:20 +00:00
sebastian added the
enhancement
engine
labels 2026-04-16 20:18:20 +00:00
sebastian added this to the Dicewars project 2026-04-16 21:02:24 +00:00
Sign in to join this conversation.
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: sebastian/Dicewars-Siedler#16
No description provided.