Jelajahi Sumber

Some work on states

Vitaliy Polonski 9 jam lalu
induk
melakukan
2e7dabe98f

+ 2 - 0
CMakeLists.txt

@@ -40,6 +40,8 @@ add_executable(kariokaEngine
 	# States
 	src/states/StateManager.cpp
 	src/states/MainMenuState.cpp
+	src/states/GamePlayState.cpp
+	src/states/PauseState.cpp
 
     # Python
     src/scripting/PythonEngine.cpp

+ 35 - 0
src/states/GamePlayState.cpp

@@ -0,0 +1,35 @@
+#include "GamePlayState.h"
+#include "PauseState.h"
+#include "MainMenuState.h"
+#include "../Engine.h"
+
+void GamePlayState::Enter(Engine& engine)
+{
+}
+
+void GamePlayState::Exit(Engine& engine)
+{
+}
+
+void GamePlayState::HandleEvents(Engine& engine, SDL_Event& event)
+{
+    if (event.type == SDL_KEYDOWN)
+    {
+        if (event.key.keysym.sym == SDLK_ESCAPE)
+        {
+            engine.stateManager.PushState(std::make_unique<PauseState>(), engine);
+        }
+    }
+}
+
+void GamePlayState::Update(Engine& engine, float dt)
+{
+}
+
+void GamePlayState::Render(Engine& engine)
+{
+}
+
+void GamePlayState::RenderImGui(Engine& engine)
+{
+}

+ 23 - 0
src/states/GamePlayState.h

@@ -0,0 +1,23 @@
+#ifndef __STATES__GAMEPLAY_STATE_H__
+#define __STATES__GAMEPLAY_STATE_H__
+
+#include "BaseState.h"
+#include "../EngineConfig.h"
+#include <entt/entt.hpp>
+#include <SDL2/SDL.h>
+
+class GamePlayState : public BaseState
+{
+public:
+    void Enter(Engine& engine) override;
+    void Exit(Engine& engine) override;
+    void HandleEvents(Engine& engine, SDL_Event& event) override;
+    void Update(Engine& engine, float dt) override;
+    void Render(Engine& engine) override;
+    void RenderImGui(Engine& engine) override;
+
+private:
+
+};
+
+#endif

+ 83 - 0
src/states/PauseState.cpp

@@ -0,0 +1,83 @@
+#include "PauseState.h"
+#include "../Engine.h"
+#include "GamePlayState.h"
+#include "MainMenuState.h"
+#include <imgui.h>
+
+void PauseState::Enter(Engine& engine)
+{
+}
+
+void PauseState::Exit(Engine& engine)
+{
+}
+
+void PauseState::HandleEvents(Engine& engine, SDL_Event& event)
+{
+    if (event.type == SDL_KEYDOWN)
+    {
+        if (event.type.keysym.sym == SDLK_ESCAPE)
+        {
+            engine.RequestPopState();
+        }
+    }
+}
+
+void PauseState::Update(Engine& engine, float dt)
+{
+}
+
+void PauseState::Render(Engine& engine)
+{
+    SDL_Renderer* renderer = engine.GetRenderer();
+    SDL_SetRenderDrawColor(renderer, overlayColor.r, overlayColor.g, overlayColor.b, overlayColor.a);
+    SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND);
+    SDL_RenderFillRect(renderer, nullptr);
+}
+
+void PauseState::RenderImGui(Engine& engine)
+{
+    ImGuiIO& io = ImGui::GetIO();
+    ImGui::SetNextWindowPos(ImVec2(io.DisplaySize.x * 0.5f, io.DisplaySize.y * 0.5f),
+                            ImGuiCond_Always, ImVec2(0.5f, 0.5f));
+    ImGui::SetNextWindowSize(ImVec2(400, 300), ImGuiCond_FirstUseEver);
+    
+    ImGui::Begin("Pause Menu", nullptr, ImGuiWindowFlags_NoTitleBar |
+                                        ImGuiWindowFlags_NoResize |
+                                        ImGuiWindowFlags_NoMove |
+                                        ImGuiWindowFlags_NoCollapse);
+    ImGui::Dummy(ImVec2(0, 40));
+    ImGui::SetCursorPosX((ImGui::GetWindowSize().x - ImGui::CalcTextSize("PAUSED").x) * 0.5f);
+    ImGui::TextColored(ImVec4(1.0f, 0.8f, 0.0f, 1.0f), "PAUSED");
+
+    ImGui::Dummy(ImVec2(0.0f, 100.0f));
+    
+    float buttonWidth = 200.f;
+    float windowWidth = ImGui::GetWindowSize().x;
+
+    ImGui::SetCursorPosX((windowWidth - buttonWidth) * 0.5f);
+    if (ImGui::Button("Back to Game", ImVec2(buttonWidth, 30)))
+    {
+        SDL_Log("TODO: GamePlayState");
+    }
+
+    ImGui::SetCursorPosX((windowWidth - buttonWidth) * 0.5f);
+    if (ImGui::Button("Map Editor", ImVec2(buttonWidth, 30)))
+    {
+        SDL_Log("TODO: MapEditorState");
+    }
+
+    ImGui::SetCursorPosX((windowWidth - buttonWidth) * 0.5f);
+    if (ImGui::Button("Asset Editor", ImVec2(buttonWidth, 30)))
+    {
+        SDL_Log("TODO: AssetEditorState");
+    }
+
+    ImGui::SetCursorPosX((windowWidth - buttonWidth) * 0.5f);
+    if (ImGui::Button("Exit", ImVec2(buttonWidth, 30)))
+    {
+        engine.StopRunning();
+    }
+
+    ImGui::End();
+}

+ 21 - 0
src/states/PauseState.h

@@ -0,0 +1,21 @@
+#ifndef __STATES__PAUSE_STATE_H__
+#define __STATES__PAUSE_STATE_H__
+
+#include "BaseState.h"
+
+class PauseState : public BaseState
+{
+public:
+    void Enter(Engine& engine) override;
+    void Exit(Engine& engine) override;
+    void HandleEvents(Engine& engine, SDL_Event& event) override;
+    void Update(Engine& engine, float dt) override;
+    void Render(Engine& engine) override;
+    void RenderImGui(Engine& engine) override;
+
+private:
+    SDL_Color overlayColor = { 0, 0, 0, 180 };
+
+};
+
+#endif