mirror of
https://github.com/zhenyan121/Cubed.git
synced 2026-08-08 17:57:02 +08:00
feat(scene): add credits scene and UI
This commit is contained in:
20
include/Cubed/scene/credits_scene.hpp
Normal file
20
include/Cubed/scene/credits_scene.hpp
Normal file
@@ -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
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
namespace Cubed {
|
namespace Cubed {
|
||||||
class Renderer;
|
class Renderer;
|
||||||
|
|
||||||
enum class SceneType { MAIN_MENU, WORLD };
|
enum class SceneType { MAIN_MENU, WORLD, CREDITS };
|
||||||
|
|
||||||
class Scene {
|
class Scene {
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ public:
|
|||||||
float width() const override;
|
float width() const override;
|
||||||
float height() 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
|
// No need for parent node pointer; do not modify children's anchors and
|
||||||
// scale.
|
// scale.
|
||||||
|
|
||||||
|
|||||||
16
include/Cubed/ui/credits_ui.hpp
Normal file
16
include/Cubed/ui/credits_ui.hpp
Normal file
@@ -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
|
||||||
@@ -71,4 +71,6 @@ target_sources(${PROJECT_NAME}
|
|||||||
ui/rect.cpp
|
ui/rect.cpp
|
||||||
ui/ui_manager.cpp
|
ui/ui_manager.cpp
|
||||||
ui/pause_menu_ui_manager.cpp
|
ui/pause_menu_ui_manager.cpp
|
||||||
|
scene/credits_scene.cpp
|
||||||
|
ui/credits_ui.cpp
|
||||||
)
|
)
|
||||||
18
src/scene/credits_scene.cpp
Normal file
18
src/scene/credits_scene.cpp
Normal file
@@ -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
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
#include "Cubed/scene/scene_manager.hpp"
|
#include "Cubed/scene/scene_manager.hpp"
|
||||||
|
|
||||||
|
#include "Cubed/scene/credits_scene.hpp"
|
||||||
#include "Cubed/scene/main_menu_scene.hpp"
|
#include "Cubed/scene/main_menu_scene.hpp"
|
||||||
#include "Cubed/scene/world_scene.hpp"
|
#include "Cubed/scene/world_scene.hpp"
|
||||||
|
|
||||||
@@ -88,6 +89,8 @@ std::unique_ptr<Scene> SceneManager::create_scene(SceneType type) {
|
|||||||
return std::make_unique<WorldScene>(*this);
|
return std::make_unique<WorldScene>(*this);
|
||||||
case SceneType::MAIN_MENU:
|
case SceneType::MAIN_MENU:
|
||||||
return std::make_unique<MainMenuScene>(*this);
|
return std::make_unique<MainMenuScene>(*this);
|
||||||
|
case SceneType::CREDITS:
|
||||||
|
return std::make_unique<CreditsScene>(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string err = std::format("Unknown Scene");
|
std::string err = std::format("Unknown Scene");
|
||||||
|
|||||||
@@ -22,7 +22,10 @@ float ColumnLayout::height() const {
|
|||||||
return m_window_height;
|
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() {
|
void ColumnLayout::layout() {
|
||||||
auto& children = Widget::children();
|
auto& children = Widget::children();
|
||||||
|
|||||||
77
src/ui/credits_ui.cpp
Normal file
77
src/ui/credits_ui.cpp
Normal file
@@ -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<Image>(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>();
|
||||||
|
rect.set_fill(true).set_color(Color::BLACK).set_alpha(0.7f);
|
||||||
|
|
||||||
|
{
|
||||||
|
auto& button = rect.add_child<Button>();
|
||||||
|
auto& back = button.set_background<Image>();
|
||||||
|
back.set_image("texture/ui/button001.png",
|
||||||
|
m_scene.scene_manager().app().texture_manager());
|
||||||
|
auto& fore = button.set_foreground<Label>();
|
||||||
|
fore.set_scale(0.5f).set_text("Return");
|
||||||
|
button.set_scale(4.0f)
|
||||||
|
.set_anchor(Anchor::BOTTOM_CENTER)
|
||||||
|
.set_offset({0, -20});
|
||||||
|
button.set_clicked([this]() { m_scene.scene_manager().request_pop(); });
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto& layout = rect.add_child<ColumnLayout>();
|
||||||
|
layout.set_spacing(20)
|
||||||
|
.set_anchor(Anchor::TOP_CENTER)
|
||||||
|
.set_offset({0, 20});
|
||||||
|
layout.add_child<Label>().set_text("Cubed");
|
||||||
|
auto add_text = [&](std::string_view view, float scale = 0.5f) {
|
||||||
|
layout.add_child<Label>().set_text(view).set_scale(scale);
|
||||||
|
};
|
||||||
|
add_text("A cube game like Minecraft, using C++ and OpenGL.");
|
||||||
|
add_text("Author: zhenyan121");
|
||||||
|
add_text("Libraries Used", 0.8f);
|
||||||
|
add_text("glad");
|
||||||
|
add_text("GLFW");
|
||||||
|
add_text("SOIL2");
|
||||||
|
add_text("GLM");
|
||||||
|
add_text("FreeType");
|
||||||
|
add_text("toml++");
|
||||||
|
add_text("Dear ImGui");
|
||||||
|
add_text("Tbb");
|
||||||
|
add_text("Asio");
|
||||||
|
add_text("protobuf");
|
||||||
|
add_text("zstd");
|
||||||
|
add_text("OpenAl Soft");
|
||||||
|
add_text("dr_libs");
|
||||||
|
add_text("Music", 0.8f);
|
||||||
|
add_text("'Find a Peaceful Place' by ROZKOL (Free Music Archive), CC "
|
||||||
|
"BY 4.0.");
|
||||||
|
add_text("Special Thanks", 0.8f);
|
||||||
|
add_text("TANGERIME");
|
||||||
|
add_text("SkyOnPole");
|
||||||
|
add_text("free_w_cloud");
|
||||||
|
add_text("Last but not least, thanks to you");
|
||||||
|
}
|
||||||
|
|
||||||
|
m_root_widget = std::move(image);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Cubed
|
||||||
@@ -6,6 +6,8 @@
|
|||||||
#include "Cubed/scene/scene_manager.hpp"
|
#include "Cubed/scene/scene_manager.hpp"
|
||||||
#include "Cubed/ui/button.hpp"
|
#include "Cubed/ui/button.hpp"
|
||||||
#include "Cubed/ui/column_layout.hpp"
|
#include "Cubed/ui/column_layout.hpp"
|
||||||
|
#include "version.hpp"
|
||||||
|
|
||||||
namespace Cubed {
|
namespace Cubed {
|
||||||
|
|
||||||
MainMenuUIManager::MainMenuUIManager(MainMenuScene& scene) : m_scene(scene) {}
|
MainMenuUIManager::MainMenuUIManager(MainMenuScene& scene) : m_scene(scene) {}
|
||||||
@@ -40,10 +42,22 @@ void MainMenuUIManager::init() {
|
|||||||
});
|
});
|
||||||
start_game_button.set_scale(4.0f);
|
start_game_button.set_scale(4.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto& exit_game = layout.add_child<Button>();
|
|
||||||
|
|
||||||
{
|
{
|
||||||
|
auto& button = layout.add_child<Button>();
|
||||||
|
|
||||||
|
auto& back = button.set_background<Image>();
|
||||||
|
back.set_image("texture/ui/button001.png",
|
||||||
|
m_scene.scene_manager().app().texture_manager());
|
||||||
|
auto& fore = button.set_foreground<Label>();
|
||||||
|
fore.set_text("Credits");
|
||||||
|
fore.set_scale(0.6f);
|
||||||
|
button.set_clicked([this]() {
|
||||||
|
m_scene.scene_manager().request_push(SceneType::CREDITS);
|
||||||
|
});
|
||||||
|
button.set_scale(4.0f);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto& exit_game = layout.add_child<Button>();
|
||||||
auto& back = exit_game.set_background<Image>();
|
auto& back = exit_game.set_background<Image>();
|
||||||
back.set_image("texture/ui/button001.png",
|
back.set_image("texture/ui/button001.png",
|
||||||
m_scene.scene_manager().app().texture_manager());
|
m_scene.scene_manager().app().texture_manager());
|
||||||
@@ -56,6 +70,21 @@ void MainMenuUIManager::init() {
|
|||||||
}
|
}
|
||||||
m_widgets.try_emplace("background", image.get());
|
m_widgets.try_emplace("background", image.get());
|
||||||
m_widgets.try_emplace("main menu layout", &layout);
|
m_widgets.try_emplace("main menu layout", &layout);
|
||||||
|
{
|
||||||
|
auto& info_layout = image->add_child<ColumnLayout>();
|
||||||
|
info_layout.set_anchor(Anchor::BOTTOM_LEFT);
|
||||||
|
info_layout.set_spacing(10);
|
||||||
|
auto& version = info_layout.add_child<Label>();
|
||||||
|
version.set_scale(0.5f);
|
||||||
|
std::string version_str = "Cubed: " CUBED_VERSION;
|
||||||
|
#ifdef DEBUG_MODE
|
||||||
|
version_str.append("-debug");
|
||||||
|
#else
|
||||||
|
version_str.append("-release");
|
||||||
|
#endif
|
||||||
|
version.set_text(version_str);
|
||||||
|
}
|
||||||
|
|
||||||
m_root_widget = std::move(image);
|
m_root_widget = std::move(image);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user