diff --git a/include/Cubed/scene/credits_scene.hpp b/include/Cubed/scene/credits_scene.hpp new file mode 100644 index 0000000..084d8f5 --- /dev/null +++ b/include/Cubed/scene/credits_scene.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include "Cubed/scene/scene.hpp" +#include "Cubed/ui/credits_ui.hpp" +namespace Cubed { +class SceneManager; +class CreditsScene : public Scene { +public: + CreditsScene(SceneManager& scene_manager); + void update(float dt) override; + void render(Renderer& renderer) override; + bool handle_event(const Event& e) override; + void on_enter() override; + SceneManager& scene_manager(); + +private: + SceneManager& m_scene_manager; + CreditsUI m_ui; +}; +} // namespace Cubed \ No newline at end of file diff --git a/include/Cubed/scene/scene.hpp b/include/Cubed/scene/scene.hpp index 624b2a6..9f0b79c 100644 --- a/include/Cubed/scene/scene.hpp +++ b/include/Cubed/scene/scene.hpp @@ -3,7 +3,7 @@ namespace Cubed { class Renderer; -enum class SceneType { MAIN_MENU, WORLD }; +enum class SceneType { MAIN_MENU, WORLD, CREDITS }; class Scene { public: diff --git a/include/Cubed/ui/column_layout.hpp b/include/Cubed/ui/column_layout.hpp index 923a816..9a426bd 100644 --- a/include/Cubed/ui/column_layout.hpp +++ b/include/Cubed/ui/column_layout.hpp @@ -15,7 +15,7 @@ public: float width() const override; float height() const override; - void set_spacing(int spacing); + ColumnLayout& set_spacing(int spacing); // No need for parent node pointer; do not modify children's anchors and // scale. diff --git a/include/Cubed/ui/credits_ui.hpp b/include/Cubed/ui/credits_ui.hpp new file mode 100644 index 0000000..46d9e20 --- /dev/null +++ b/include/Cubed/ui/credits_ui.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include "Cubed/ui/ui_manager.hpp" +namespace Cubed { + +class CreditsScene; + +class CreditsUI : public UIManager { +public: + CreditsUI(CreditsScene& m_scene); + void init() override; + +private: + CreditsScene& m_scene; +}; +} // namespace Cubed \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a78121b..ba18be4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -71,4 +71,6 @@ target_sources(${PROJECT_NAME} ui/rect.cpp ui/ui_manager.cpp ui/pause_menu_ui_manager.cpp + scene/credits_scene.cpp + ui/credits_ui.cpp ) \ No newline at end of file diff --git a/src/scene/credits_scene.cpp b/src/scene/credits_scene.cpp new file mode 100644 index 0000000..e791125 --- /dev/null +++ b/src/scene/credits_scene.cpp @@ -0,0 +1,18 @@ +#include "Cubed/scene/credits_scene.hpp" + +namespace Cubed { +CreditsScene::CreditsScene(SceneManager& scene_manager) + : m_scene_manager(scene_manager), m_ui(*this) {} + +void CreditsScene::update(float dt) { m_ui.update(dt); } +void CreditsScene::render(Renderer& renderer) { m_ui.render(renderer); } +bool CreditsScene::handle_event(const Event& e) { + if (m_ui.handle_event(e)) { + return true; + } + return false; +} +void CreditsScene::on_enter() { m_ui.init(); } +SceneManager& CreditsScene::scene_manager() { return m_scene_manager; } + +} // namespace Cubed \ No newline at end of file diff --git a/src/scene/scene_manager.cpp b/src/scene/scene_manager.cpp index 2894988..9ce86f1 100644 --- a/src/scene/scene_manager.cpp +++ b/src/scene/scene_manager.cpp @@ -1,5 +1,6 @@ #include "Cubed/scene/scene_manager.hpp" +#include "Cubed/scene/credits_scene.hpp" #include "Cubed/scene/main_menu_scene.hpp" #include "Cubed/scene/world_scene.hpp" @@ -88,6 +89,8 @@ std::unique_ptr SceneManager::create_scene(SceneType type) { return std::make_unique(*this); case SceneType::MAIN_MENU: return std::make_unique(*this); + case SceneType::CREDITS: + return std::make_unique(*this); } std::string err = std::format("Unknown Scene"); diff --git a/src/ui/column_layout.cpp b/src/ui/column_layout.cpp index 0609a67..3c0381b 100644 --- a/src/ui/column_layout.cpp +++ b/src/ui/column_layout.cpp @@ -22,7 +22,10 @@ float ColumnLayout::height() const { return m_window_height; } -void ColumnLayout::set_spacing(int spacing) { m_spacing = spacing; } +ColumnLayout& ColumnLayout::set_spacing(int spacing) { + m_spacing = spacing; + return *this; +} void ColumnLayout::layout() { auto& children = Widget::children(); diff --git a/src/ui/credits_ui.cpp b/src/ui/credits_ui.cpp new file mode 100644 index 0000000..8bd2703 --- /dev/null +++ b/src/ui/credits_ui.cpp @@ -0,0 +1,77 @@ +#include "Cubed/ui/credits_ui.hpp" + +#include "Cubed/app.hpp" +#include "Cubed/scene/credits_scene.hpp" +#include "Cubed/scene/scene_manager.hpp" +#include "Cubed/ui/button.hpp" +#include "Cubed/ui/column_layout.hpp" +#include "Cubed/ui/image.hpp" +#include "Cubed/ui/rect.hpp" + +namespace Cubed { +CreditsUI::CreditsUI(CreditsScene& scene) : m_scene(scene) {} + +void CreditsUI::init() { + auto& renderer = m_scene.scene_manager().app().renderer(); + + auto image = std::make_unique(nullptr); + image->set_fill(true) + .set_image("texture/ui/background.png", + m_scene.scene_manager().app().texture_manager()) + .set_anchor(Anchor::TOP_LEFT) + .set_window_size(renderer.window_width(), renderer.window_height()); + + auto& rect = image->add_child(); + rect.set_fill(true).set_color(Color::BLACK).set_alpha(0.7f); + + { + auto& button = rect.add_child