diff --git a/src/engine.cpp b/src/engine.cpp index 13090a77..0f6fdad1 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #define GLEW_STATIC #include "audio/Audio.h" @@ -33,7 +34,10 @@ #include "files/files.h" #include "files/engine_files.h" +using std::unique_ptr; using std::shared_ptr; +using std::string; +using std::filesystem::path; using glm::vec3; using gui::GUI; @@ -58,7 +62,7 @@ Engine::Engine(const EngineSettings& settings_) { gui = new GUI(); std::cout << "-- initializing finished" << std::endl; - setScreen(new MenuScreen(this)); + setScreen(shared_ptr(new MenuScreen(this))); } void Engine::updateTimers() { @@ -70,11 +74,10 @@ void Engine::updateTimers() { void Engine::updateHotkeys() { if (Events::jpressed(keycode::F2)) { - ImageData* image = Window::takeScreenshot(); + unique_ptr image(Window::takeScreenshot()); image->flipY(); - std::string filename = enginefs::get_screenshot_file("png"); - png::write_image(filename, image); - delete image; + path filename = enginefs::get_screenshot_file("png"); + png::write_image(filename, image.get()); std::cout << "saved screenshot as " << filename << std::endl; } } @@ -101,7 +104,7 @@ void Engine::mainloop() { } Engine::~Engine() { - delete screen; + screen = nullptr; delete gui; Audio::finalize(); @@ -124,9 +127,6 @@ Assets* Engine::getAssets() { return assets; } -void Engine::setScreen(Screen* screen) { - if (this->screen != nullptr) { - delete this->screen; - } +void Engine::setScreen(shared_ptr screen) { this->screen = screen; } \ No newline at end of file diff --git a/src/engine.h b/src/engine.h index 37314255..058a4c19 100644 --- a/src/engine.h +++ b/src/engine.h @@ -22,7 +22,7 @@ public: class Engine { Assets* assets; - Screen* screen = nullptr; + std::shared_ptr screen = nullptr; EngineSettings settings; uint64_t frame = 0; @@ -41,7 +41,7 @@ public: Assets* getAssets(); gui::GUI* getGUI(); EngineSettings& getSettings(); - void setScreen(Screen* screen); + void setScreen(std::shared_ptr screen); }; #endif // SRC_ENGINE_H_ \ No newline at end of file diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index de1ce563..9d013398 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -119,7 +119,7 @@ HudRenderer::HudRenderer(Engine* engine, Level* level) : level(level), assets(en Button* button = new Button(L"Save and Quit to Menu", vec4(12.0f, 10.0f, 12.0f, 12.0f)); button->listenAction([this, engine](GUI*){ this->pauseMenu->visible(false); - engine->setScreen(new MenuScreen(engine)); + engine->setScreen(shared_ptr(new MenuScreen(engine))); }); pauseMenu->add(shared_ptr(button)); } diff --git a/src/frontend/screens.cpp b/src/frontend/screens.cpp index 8abaeee9..66be91b9 100644 --- a/src/frontend/screens.cpp +++ b/src/frontend/screens.cpp @@ -46,7 +46,8 @@ MenuScreen::MenuScreen(Engine* engine_) : Screen(engine_) { vec3 playerPosition = vec3(0, 64, 0); Camera* camera = new Camera(playerPosition, radians(90.0f)); Player* player = new Player(playerPosition, 4.0f, camera); - engine->setScreen(new LevelScreen(engine, world->loadLevel(player, settings))); + auto screen = new LevelScreen(engine, world->loadLevel(player, settings)); + engine->setScreen(shared_ptr(screen)); }); panel->add(shared_ptr(button)); }