From 06bcac9bf72db67f1037476177da475a6751648e Mon Sep 17 00:00:00 2001 From: ShadesAndGrays Date: Thu, 9 Jul 2026 00:27:26 +0100 Subject: [PATCH] inital commit --- .gitignore | 5 ++ .vscode/imgui.ini | 8 ++ .vscode/launch.json | 34 ++++++++ data.dat | Bin 0 -> 25252 bytes imgui.ini | 21 +++++ makefile | 103 ++++++++++++++++++++++ src/asset.cpp | 132 +++++++++++++++++++++++++++++ src/imgui.ini | 8 ++ src/include/asset/asset.hpp | 54 ++++++++++++ src/include/asset/raylib_asset.hpp | 31 +++++++ src/include/components.hpp | 18 ++++ src/include/movement.hpp | 4 + src/include/player.hpp | 6 ++ src/include/render.hpp | 5 ++ src/include/scene.hpp | 86 +++++++++++++++++++ src/main.cpp | 84 ++++++++++++++++++ src/movement.cpp | 14 +++ src/player.cpp | 34 ++++++++ src/render.cpp | 18 ++++ src/scenes/game_play_scene.cpp | 33 ++++++++ src/scenes/menu_scene.cpp | 56 ++++++++++++ src/scenes/scene.cpp | 39 +++++++++ 22 files changed, 793 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/imgui.ini create mode 100644 .vscode/launch.json create mode 100644 data.dat create mode 100644 imgui.ini create mode 100644 makefile create mode 100644 src/asset.cpp create mode 100644 src/imgui.ini create mode 100644 src/include/asset/asset.hpp create mode 100644 src/include/asset/raylib_asset.hpp create mode 100644 src/include/components.hpp create mode 100644 src/include/movement.hpp create mode 100644 src/include/player.hpp create mode 100644 src/include/render.hpp create mode 100644 src/include/scene.hpp create mode 100644 src/main.cpp create mode 100644 src/movement.cpp create mode 100644 src/player.cpp create mode 100644 src/render.cpp create mode 100644 src/scenes/game_play_scene.cpp create mode 100644 src/scenes/menu_scene.cpp create mode 100644 src/scenes/scene.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a25d4ad --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +assets/ +bin/ +debug/ +external/ +compile_commands.json diff --git a/.vscode/imgui.ini b/.vscode/imgui.ini new file mode 100644 index 0000000..8f5ce5d --- /dev/null +++ b/.vscode/imgui.ini @@ -0,0 +1,8 @@ +[Window][Debug##Default] +Pos=60,60 +Size=400,400 + +[Window][VBoxContainer] +Pos=540,275 +Size=200,250 + diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..7631b4c --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,34 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "(gdb) Launch", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/debug/d.exe", + "args": [], + "stopAtEntry": false, + "cwd": "${fileDirname}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "miDebuggerPath": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + }, + { + "description": "Set Disassembly Flavor to Intel", + "text": "-gdb-set disassembly-flavor intel", + "ignoreFailures": true + } + ] + } + + ] +} \ No newline at end of file diff --git a/data.dat b/data.dat new file mode 100644 index 0000000000000000000000000000000000000000..38c52b6d1b4617321f68fb4e5ffabd5326cab7c4 GIT binary patch literal 25252 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�{?2Q!k!F$GMG}j@pY5zed03 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 ZsUDS(d!|a`DGhFb?rj6Dat*tn{{g=BiL(Fz literal 0 HcmV?d00001 diff --git a/imgui.ini b/imgui.ini new file mode 100644 index 0000000..b49fefd --- /dev/null +++ b/imgui.ini @@ -0,0 +1,21 @@ +[Window][Debug##Default] +Pos=143,124 +Size=400,400 + +[Window][CenterWindow] +Pos=0,0 +Size=1280,800 +Collapsed=1 + +[Window][VBoxContainer] +Pos=540,275 +Size=200,250 + +[Window][Box] +Pos=156,64 +Size=180,105 + +[Window][Debug] +Pos=882,174 +Size=320,170 + diff --git a/makefile b/makefile new file mode 100644 index 0000000..0f7cf36 --- /dev/null +++ b/makefile @@ -0,0 +1,103 @@ +.PHONY: all build-gui build-game run + +CXX = g++ + +LDFLAGS = -L./external/raylib/lib \ + -L./external/box2d/build/src \ + -L./external/asset_packer/bin \ + +LIBS = -lraylib -lwinmm -lgdi32 -lbox2d -lassetpacker + +CXXFLAGS = -std=c++20 -O2 \ + -MMD -MP + +DEBUGFLAGS = -std=c++20 -g -Og + +INCLUDES = -I./external/raylib/include \ + -I./external/entt/single_include \ + -I./src/include \ + -I./external/imgui \ + -I./external/rlImGui \ + -I./external/box2d/include \ + -I./external/nhlohmann_json_3.12.0/ \ + -I./external/asset_packer/bin/include \ + +IMGUI_SRCS = ./external/imgui/imgui.cpp \ + ./external/imgui/imgui_demo.cpp \ + ./external/imgui/imgui_draw.cpp \ + ./external/imgui/imgui_tables.cpp \ + ./external/imgui/imgui_widgets.cpp \ + +IMGUI_BACKEND = ./external/rlImGui/rlImGui.cpp + + + +SRC_FILES = ./src/main.cpp \ + ./src/asset.cpp \ + ./src/movement.cpp \ + ./src/player.cpp \ + ./src/render.cpp \ + ./src/scenes/scene.cpp \ + ./src/scenes/game_play_scene.cpp \ + ./src/scenes/menu_scene.cpp + +IMGUI_OBJS = $(patsubst ./external/imgui/%.cpp,./bin/%.o,$(IMGUI_SRCS)) +IMGUI_BACKEND_OBJS = $(patsubst ./external/rlImGui/%.cpp,./bin/%.o,$(IMGUI_BACKEND)) +OBJS_FILES = $(patsubst ./src/%.cpp,./bin/%.o,$(SRC_FILES)) + +DEP_FILES = $(patsubst ./bin/%.o,./bin/%.d,$(OBJS_FILES)) + + +all: build-game run + +./bin/%.o: ./external/imgui/%.cpp + @mkdir -p bin + $(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@ + +./bin/%.o: ./external/rlImGui/%.cpp + @mkdir -p bin + $(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@ + +./bin/%.o: ./src/%.cpp + @mkdir -p bin + @mkdir -p $(dir $@) + $(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@ + +compile_commands.json: clean + @echo "Generating compile_commands.json..." + bear -- $(MAKE) + +-include $(DEP_FILES) + +build-gui: $(IMGUI_OBJS) + +build-gui-backend: $(IMGUI_BACKEND_OBJS) + +build-core: $(OBJS_FILES) + +build-game: $(OBJS_FILES) $(IMGUI_OBJS) $(IMGUI_BACKEND_OBJS) + @mkdir -p bin + $(CXX) $(CXXFLAGS) $(OBJS_FILES) $(IMGUI_OBJS) $(IMGUI_BACKEND_OBJS) $(LDFLAGS) $(LIBS) -o ./bin/main.exe + cp ./assets ./bin -rf + +build-debug: + @mkdir -p debug + $(CXX) $(DEBUGFLAGS) $(INCLUDES) $(SRC_FILES) $(IMGUI_SRCS) $(IMGUI_BACKEND) $(LDFLAGS) $(LIBS) -o ./debug/d.exe + cp ./assets ./debug -rf + + + +clean: + @rm -r -f ./bin + @rm -f compile_commands.json + +clean-debug: + @rm -r -f ./debug + +clean-all: clean clean-debug + +run: + ./bin/main.exe + +run-debug: + ./debug/d.exe diff --git a/src/asset.cpp b/src/asset.cpp new file mode 100644 index 0000000..47e5f85 --- /dev/null +++ b/src/asset.cpp @@ -0,0 +1,132 @@ + +#include + +#include +#include + +#include + +#include +#include +#include +#include + +namespace fs = std::filesystem; + +AssetLoader::AssetLoader(std::string asset_data) : asset_reader(asset_data){ + if (!asset_reader.load_index()){ + std::cerr << "Failed to load assets!!!" << std::endl; + } +} + +AssetReader AssetLoader::get_reader(){ + return asset_reader; +} + +RaylibAssetLoader::RaylibAssetLoader(std::string asset_data) : AssetLoader(asset_data) { + +} + +RaylibAssetLoader::~RaylibAssetLoader(){ + unload_all_assets(); +} + + +void RaylibAssetLoader::load_asset(std::string path){ + fs::path file_path(path); + Asset new_asset; + new_asset.name = file_path.filename().string() ; + + std::cout << file_path.extension() << std::endl; + + if (file_path.extension() == ".png"){ + auto texture_data = get_reader().extract_asset(path); + Image img = LoadImageFromMemory(".png", texture_data.data(), texture_data.size()); + auto texture = LoadTextureFromImage(img); + UnloadImage(img); + new_asset.data = ImageData { new Texture(texture)}; + + + }else if(file_path.extension() == ".ogg"){ + + }else if(file_path.extension() == ".wav"){ + + }else if(file_path.extension() == ".json"){ + + } + + + assets[path] = new_asset; + +} + +void RaylibAssetLoader::unload_asset(std::string path){ + Asset asset = assets[path]; + + std::visit([](auto&& arg) { + using T = std::decay_t; + + if constexpr (std::is_same_v) { + + UnloadTexture(*((Texture*) arg.texture)); + delete (Texture*) arg.texture; + } + else if constexpr (std::is_same_v) { + UnloadSound(*((Sound*) arg.sound)); + delete (Sound*) arg.sound; + } + else if constexpr (std::is_same_v) { + UnloadMusicStream(*((Music*) arg.music)); + delete (Music*) arg.music; + } + // JsonData requires no manual step because std::string cleans itself up! + }, asset.data); + +} + + +void RaylibAssetLoader::unload_all_assets(){ + for (auto [path,_] : assets){ + unload_asset(path); + } +} + +Asset RaylibAssetLoader::get_asset(std::string path){ + if (assets.contains(path)){ + return assets[path]; + }else{ + return {}; + } +} + + +Texture* RaylibAssetLoader::get_texture(std::string path){ + Asset asset = get_asset(path); + if (auto* ptr = std::get_if(&asset.data)) { + return (Texture*)ptr->texture; + } + return nullptr; +} + +Sound* RaylibAssetLoader::get_sound(std::string path){ + Asset asset = get_asset(path); + if (auto* ptr = std::get_if(&asset.data)) { + return (Sound*)ptr->sound; + } + return nullptr; +} +Music* RaylibAssetLoader::get_music(std::string path){ + Asset asset = get_asset(path); + if (auto* ptr = std::get_if(&asset.data)) { + return (Music*)ptr->music; + } + return nullptr; +} + +std::string RaylibAssetLoader::get_json(std::string path){ + Asset asset = get_asset(path); + if (auto* ptr = std::get_if(&asset.data)) { + return ptr->json; + } + return "{}"; +} diff --git a/src/imgui.ini b/src/imgui.ini new file mode 100644 index 0000000..8f5ce5d --- /dev/null +++ b/src/imgui.ini @@ -0,0 +1,8 @@ +[Window][Debug##Default] +Pos=60,60 +Size=400,400 + +[Window][VBoxContainer] +Pos=540,275 +Size=200,250 + diff --git a/src/include/asset/asset.hpp b/src/include/asset/asset.hpp new file mode 100644 index 0000000..a58e544 --- /dev/null +++ b/src/include/asset/asset.hpp @@ -0,0 +1,54 @@ +#pragma once +#include + +#include +#include +#include + + + + + + +struct ImageData { + void* texture; +}; + +struct SoundData { + void* sound; +}; + +struct MusicData { + void* music; +}; + +struct JsonData { + std::string json; +}; + +struct Asset { + std::string name; + std::variant data; +}; + + +class AssetLoader{ + + private: + AssetReader asset_reader; + + protected: + std::unordered_map assets; + virtual void load_all_assets(std::string data_path) = 0; + virtual void unload_all_assets() = 0; + AssetReader get_reader(); + + public: + AssetLoader(std::string asset_data); + ~AssetLoader() = default; + virtual void load_asset(std::string path) = 0; + virtual void unload_asset(std::string path) = 0; + virtual Asset get_asset(std::string path) = 0;; + +}; + diff --git a/src/include/asset/raylib_asset.hpp b/src/include/asset/raylib_asset.hpp new file mode 100644 index 0000000..1b80d59 --- /dev/null +++ b/src/include/asset/raylib_asset.hpp @@ -0,0 +1,31 @@ +#pragma once +#include "asset_packer/asset.hpp" +#include +#include + +class RaylibAssetLoader : AssetLoader{ + protected: + void load_all_assets(std::string asset_list) override {}; + void unload_all_assets() override; + + public: + RaylibAssetLoader(std::string asset_data = "data.dat"); + ~RaylibAssetLoader(); + + + void load_asset(std::string path) override; + void unload_asset(std::string path) override; + Asset get_asset(std::string path) override; + + Texture* get_texture(std::string path); + Sound* get_sound(std::string path); + Music* get_music(std::string path); + std::string get_json(std::string path); + +}; + + +extern RaylibAssetLoader asset_loader; + + + diff --git a/src/include/components.hpp b/src/include/components.hpp new file mode 100644 index 0000000..678bfb8 --- /dev/null +++ b/src/include/components.hpp @@ -0,0 +1,18 @@ +#pragma once +#include + +struct Position{ + float x; + float y; +}; + +struct Velocity{ + float dx; + float dy; +}; + +struct Player{}; + +struct Sprite{ + Texture *texture; +}; diff --git a/src/include/movement.hpp b/src/include/movement.hpp new file mode 100644 index 0000000..a927b95 --- /dev/null +++ b/src/include/movement.hpp @@ -0,0 +1,4 @@ +#pragma once +#include + +void update_movement_system(entt::registry& registry, float dt); diff --git a/src/include/player.hpp b/src/include/player.hpp new file mode 100644 index 0000000..91a41a0 --- /dev/null +++ b/src/include/player.hpp @@ -0,0 +1,6 @@ +#pragma once +#include +#include + +void create_player(entt::registry& registry,Texture* texture); +void update_player_system(entt::registry& registry,float dt); diff --git a/src/include/render.hpp b/src/include/render.hpp new file mode 100644 index 0000000..585b961 --- /dev/null +++ b/src/include/render.hpp @@ -0,0 +1,5 @@ +#pragma once +#include + +void update_render_system(entt::registry ®istry); + diff --git a/src/include/scene.hpp b/src/include/scene.hpp new file mode 100644 index 0000000..6c50d02 --- /dev/null +++ b/src/include/scene.hpp @@ -0,0 +1,86 @@ +#pragma once + +#include + +#include + +enum class SceneType{ + MENU, + GAMEPLAY +}; + + +// Simple global data structure to hold the switch request +struct EngineState { + bool pendingSwitch = false; + SceneType nextScene; + + bool shouldQuit = false; + + void request_switch(SceneType type) { + nextScene = type; + pendingSwitch = true; + } + + void quit(){ + shouldQuit = true; + } +}; + +// Expose the global state to any file that includes scene.hpp +extern EngineState g_Engine; + + +class Scene{ + + public: + Scene() = default; + virtual ~Scene() = default; + + virtual void update(float dt) = 0; + virtual void render() = 0; + virtual void ui() = 0; +}; + +class GamePlayScene : public Scene{ + + private: + entt::registry registry; + + public: + GamePlayScene(); + ~GamePlayScene(); + + void update(float dt) override; + void render() override; + void ui() override; + +}; + +class MenuScene : public Scene{ + + public: + MenuScene(); + ~MenuScene() = default; + + void update(float dt) override; + void render() override; + void ui() override; + +}; + +class SceneManager{ + private: + Scene* current_scene = nullptr; + SceneType next_scene_type; + bool should_switch = false; + + public: + SceneManager(); + ~SceneManager(); + + void update(float dt); + void render(); + void ui(); + void process_scene_switch(); +}; diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..2651858 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,84 @@ +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + + +// Globals +EngineState g_Engine; +RaylibAssetLoader asset_loader; + +int main(){ + +// + int screen_width = 1280; + int screen_height = 800; + + + + // initialized scene manager + SceneManager scene_manager; + + entt::registry registry; + + rlImGuiSetup(true); + + ImGuiStyle& style = ImGui::GetStyle(); + + // Rounded corners + style.WindowRounding = 6.0f; + style.ChildRounding = 4.0f; + style.FrameRounding = 4.0f; + style.PopupRounding = 4.0f; + style.ScrollbarRounding = 9.0f; + style.GrabRounding = 4.0f; + style.TabRounding = 4.0f; + + // Sizes and Spacing + style.WindowPadding = ImVec2(15.0f, 15.0f); + style.FramePadding = ImVec2(6.0f, 6.0f); + style.ItemSpacing = ImVec2(10.0f, 8.0f); + style.ScrollbarSize = 15.0f; + + SetTargetFPS(60); + SetTraceLogLevel(TraceLogLevel::LOG_NONE); + + InitWindow(screen_width, screen_height, "Bullet bird"); + SetWindowState(FLAG_WINDOW_RESIZABLE); + + + while (!WindowShouldClose() && !g_Engine.shouldQuit){ + + float dt = GetFrameTime(); + if (dt > 0.1f) dt = 0.1f; // cap dt just for now + + scene_manager.update(dt); + + BeginDrawing(); + ClearBackground(RAYWHITE); + + scene_manager.render(); + + rlImGuiBegin(); + scene_manager.ui(); + rlImGuiEnd(); + + EndDrawing(); + + scene_manager.process_scene_switch(); // !!! After scene_manager is done with the current loop + } + + CloseWindow(); + rlImGuiShutdown(); + return 0; +} + diff --git a/src/movement.cpp b/src/movement.cpp new file mode 100644 index 0000000..812eb80 --- /dev/null +++ b/src/movement.cpp @@ -0,0 +1,14 @@ +// src\movement.cpp +#include +#include + +void update_movement_system(entt::registry& registry, float dt) { + // We get Position and Velocity, but EXCLUDE entities that have the Player tag + auto view = registry.view(); + + view.each([dt](Position &position, Velocity &velocity) { + // This will only run for pipes, enemies, or particles! + position.x += velocity.dx * dt; + position.y += velocity.dy * dt; + }); +} diff --git a/src/player.cpp b/src/player.cpp new file mode 100644 index 0000000..437ae78 --- /dev/null +++ b/src/player.cpp @@ -0,0 +1,34 @@ +// src\player.cpp +#include +#include + +#include + +entt::entity player; + + + +void create_player(entt::registry& registry,Texture* texture){ + const auto entity = registry.create(); + registry.emplace(entity,100.0f,0.0f); + registry.emplace(entity,0.0f,0.0f); + registry.emplace(entity); + registry.emplace(entity,texture); +} + +void update_player_system(entt::registry& registry,float dt){ + + auto view = registry.view(); + + // Constants for fine-tuning game feel + const float GRAVITY = 900.0f; // Constant downward pull (pixels/sec^2) + const float JUMP_FORCE = -350.0f; // Negative force to burst UPWARD + + view.each([dt,GRAVITY,JUMP_FORCE](const auto &player, auto &velocity){ + if (IsKeyPressed(KEY_SPACE)){ + velocity.dy = JUMP_FORCE; + } + velocity.dy += GRAVITY * dt; + }); + +} diff --git a/src/render.cpp b/src/render.cpp new file mode 100644 index 0000000..60fe6c5 --- /dev/null +++ b/src/render.cpp @@ -0,0 +1,18 @@ + +#include +#include + +#include +#include + +void update_render_system(entt::registry ®istry){ + auto view = registry.view(); + + view.each([] (const auto &sprite, const auto &position){ + if (sprite.texture){ + DrawTexture(*(sprite.texture),position.x,position.y,WHITE); + }else{ + DrawRectangle(position.x,position.y,50, 70,BLACK); + } + }); +} diff --git a/src/scenes/game_play_scene.cpp b/src/scenes/game_play_scene.cpp new file mode 100644 index 0000000..15f4b6c --- /dev/null +++ b/src/scenes/game_play_scene.cpp @@ -0,0 +1,33 @@ +#include +#include +#include +#include +#include + + +GamePlayScene::GamePlayScene() { + registry = entt::registry(); + + asset_loader.load_asset("assets/bird.png"); + create_player(registry,asset_loader.get_texture("assets/bird.png")); + +} + +void GamePlayScene::update(float dt) { + update_movement_system(registry, dt); + update_player_system(registry, dt); +} + + + +void GamePlayScene::render() { + update_render_system(registry); +} + +void GamePlayScene::ui() { +} + +GamePlayScene::~GamePlayScene(){ + asset_loader.unload_asset("assets/bird.png"); + +} diff --git a/src/scenes/menu_scene.cpp b/src/scenes/menu_scene.cpp new file mode 100644 index 0000000..f0893d1 --- /dev/null +++ b/src/scenes/menu_scene.cpp @@ -0,0 +1,56 @@ +#include +#include +#include + +#include + +// #include + + +MenuScene::MenuScene() { +} + +void MenuScene::update(float dt) { +} + +void MenuScene::render() {} + +void MenuScene::ui() { + + // Get the current screen/viewport size + ImVec2 screen_size = ImGui::GetIO().DisplaySize; + + // size of button container + ImVec2 vbox_size = ImVec2(200.0f, 250.0f); + + // set next container to be center of the screen + ImVec2 screen_center = ImVec2(screen_size.x * 0.5f, screen_size.y * 0.5f); + ImGui::SetNextWindowPos(screen_center, ImGuiCond_Always,ImVec2(0.5f, 0.5f)); + ImGui::SetNextWindowSize(vbox_size); + + // remove sub window decoration + ImGuiWindowFlags flags = ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoBackground; + + ImGui::Begin("VBoxContainer", nullptr, flags); + + // set button width to be size fill container + ImVec2 button_size = ImVec2(ImGui::GetContentRegionAvail().x, 50.0f); + + // ImGui::SetCursorPos(centeredPos); + if (ImGui::Button("Play",button_size)){ + g_Engine.request_switch(SceneType::GAMEPLAY); + } + + ImGui::Dummy(ImVec2(0, 10)); // Gap + + if (ImGui::Button("Quit",button_size)){ + g_Engine.quit(); + } + + ImGui::End(); + + // ImGui::Begin("Debug"); + // ImGui::Button("Hello",button_size); + // ImGui::TextUnformatted(std::format("window size: {} {} ", screen_size.x,screen_size.y).c_str()); + // ImGui::End(); +} diff --git a/src/scenes/scene.cpp b/src/scenes/scene.cpp new file mode 100644 index 0000000..6b3cdb2 --- /dev/null +++ b/src/scenes/scene.cpp @@ -0,0 +1,39 @@ +#include + +SceneManager::SceneManager(){ + current_scene = new MenuScene(); +} + +SceneManager::~SceneManager(){ + delete current_scene; +} + +void SceneManager::process_scene_switch(){ + if (!g_Engine.pendingSwitch) return; + + delete current_scene; + + switch(g_Engine.nextScene){ + case SceneType::MENU: + current_scene = new MenuScene(); + break; + case SceneType::GAMEPLAY: + current_scene = new GamePlayScene(); + break; + } + g_Engine.pendingSwitch = false; +} + +void SceneManager::update(float dt){ + if (current_scene){ + current_scene->update(dt); + } +} + +void SceneManager::render(){ + current_scene->render(); +} + +void SceneManager::ui(){ + current_scene->ui(); +}