#ifndef _H_SCENE_H #define _H_SCENE_H #include #include #include #include class Background; class Entity; class Camera; class Map; class ResourceManager; class Renderer; class EventManager; class Line; class PhysicsEngine; class Sprite; class Shader; struct SceneData; enum SceneType { SCENE_STORY, SCENE_SHOOTER }; class ISceneContext { public: virtual std::weak_ptr getEventManager() = 0; virtual std::weak_ptr getGlobalEventManager() = 0; virtual std::span> getAllEntities() const = 0; virtual unsigned int getPlayerID() const = 0; }; class Scene : public ISceneContext, public std::enable_shared_from_this { public: Scene(SceneType type, std::shared_ptr resources, std::weak_ptr globalEvents); void init(); void update(double deltaTime); void render(std::shared_ptr renderer); std::shared_ptr getPlayer() const; unsigned int getPlayerID() const override { return player->getEntityID(); } std::weak_ptr getEventManager() override { return eventManager; } std::weak_ptr getGlobalEventManager() override { return globalEventManager; } std::span> getAllEntities() const override; void unloadScene(); protected: void loadDebugShooterScene(); void loadDebugStoryScene() { /*not implemented yet*/ } private: void hookSceneEvents(); GameActor* getGameActorByID(const unsigned int ID); // Non-owning pointer DO NOT DELETE, resource manager will handle that! Background *background; SceneType type; std::shared_ptr map; //std::shared_ptr tileSet; std::shared_ptr player; std::unordered_map> entities; mutable std::vector> entityCache; std::shared_ptr camera; std::shared_ptr physicsEngine; std::shared_ptr debugLine; std::shared_ptr resourceManager; std::weak_ptr globalEventManager; std::shared_ptr eventManager; std::shared_ptr sceneData; }; #endif //_H_SCENE_H