2 Commits

Author SHA1 Message Date
0d84cc7470 add pause shortcut 2026-01-04 13:26:23 +01:00
d9baf7c5ef add basic timer 2026-01-01 22:33:58 +01:00
6 changed files with 55 additions and 2 deletions

View File

@@ -12,6 +12,7 @@ class GameState : public ClientState {
game::WorldPtr m_World; game::WorldPtr m_World;
sim::ClientSimulation m_Simulation; sim::ClientSimulation m_Simulation;
float m_CurrentLerp; float m_CurrentLerp;
float m_ElapsedTime;
public: public:
GameState(Client& a_Client, const game::WorldPtr& a_World, std::uint64_t a_StepTime, const std::vector<protocol::LockStep> a_FirstSteps); GameState(Client& a_Client, const game::WorldPtr& a_World, std::uint64_t a_StepTime, const std::vector<protocol::LockStep> a_FirstSteps);
@@ -23,6 +24,10 @@ class GameState : public ClientState {
return m_CurrentLerp; return m_CurrentLerp;
} }
float GetElapsedTime() const {
return m_ElapsedTime;
}
game::WorldPtr GetWorld() const { game::WorldPtr GetWorld() const {
return m_World; return m_World;
} }

View File

@@ -21,6 +21,8 @@ class DebugWorldState : public DisplayState {
std::vector<std::unique_ptr<client::Client>> m_FakeClients; std::vector<std::unique_ptr<client::Client>> m_FakeClients;
std::shared_ptr<server::FakeSocket> m_ServerSocket; std::shared_ptr<server::FakeSocket> m_ServerSocket;
unsigned int m_PlaySpeed = 1;
public: public:
DebugWorldState(Display& a_Display); DebugWorldState(Display& a_Display);
~DebugWorldState(); ~DebugWorldState();

View File

@@ -0,0 +1,21 @@
#pragma once
#include "client/state/GameState.h"
#include <td/render/Renderer.h>
#include <client/PlayerManager.h>
namespace td {
namespace render {
class TimerRenderer : public BasicRenderer {
private:
const client::GameState& m_State;
public:
virtual void Render(float a_Lerp) override;
TimerRenderer(const client::GameState& a_State);
~TimerRenderer() {}
};
} // namespace render
} // namespace td

View File

@@ -20,6 +20,7 @@ void GameState::Handle(const protocol::packets::LockStepResponsePacket& a_LockSt
void GameState::Update(float a_Delta) { void GameState::Update(float a_Delta) {
m_CurrentLerp = m_Simulation.Update(a_Delta); m_CurrentLerp = m_Simulation.Update(a_Delta);
m_ElapsedTime += a_Delta;
} }
} // namespace client } // namespace client

View File

@@ -7,6 +7,7 @@
#include <td/protocol/packet/Packets.h> #include <td/protocol/packet/Packets.h>
#include <td/render/renderer/EntityRenderer.h> #include <td/render/renderer/EntityRenderer.h>
#include <td/render/renderer/PlayerListRenderer.h> #include <td/render/renderer/PlayerListRenderer.h>
#include <td/render/renderer/TimerRenderer.h>
#include <td/render/renderer/TowerRenderer.h> #include <td/render/renderer/TowerRenderer.h>
#include <td/render/renderer/WorldRenderer.h> #include <td/render/renderer/WorldRenderer.h>
@@ -41,6 +42,7 @@ DebugWorldState::DebugWorldState(Display& a_Display) : DisplayState(a_Display) {
m_Renderer.AddRenderer<render::WorldRenderer>(m_Camera, clientWorld); m_Renderer.AddRenderer<render::WorldRenderer>(m_Camera, clientWorld);
m_Renderer.AddRenderer<render::EntityRenderer>(m_Camera, clientWorld); m_Renderer.AddRenderer<render::EntityRenderer>(m_Camera, clientWorld);
m_Renderer.AddRenderer<render::TowerRenderer>(m_Camera, clientWorld); m_Renderer.AddRenderer<render::TowerRenderer>(m_Camera, clientWorld);
m_Renderer.AddRenderer<render::TimerRenderer>(*gameState);
auto& list = m_Renderer.AddRenderer<render::PlayerListRenderer>(m_Client->GetPlayers()); auto& list = m_Renderer.AddRenderer<render::PlayerListRenderer>(m_Client->GetPlayers());
@@ -73,8 +75,8 @@ DebugWorldState::DebugWorldState(Display& a_Display) : DisplayState(a_Display) {
} }
void DebugWorldState::Update(float a_Delta) { void DebugWorldState::Update(float a_Delta) {
m_Server->Update(a_Delta); m_Server->Update(a_Delta * m_PlaySpeed);
m_Client->Update(a_Delta); m_Client->Update(a_Delta * m_PlaySpeed);
if (m_ClientState) if (m_ClientState)
m_Renderer.Render(m_ClientState->GetCurrentLerp()); m_Renderer.Render(m_ClientState->GetCurrentLerp());
} }
@@ -100,6 +102,10 @@ void DebugWorldState::OnKeyDown(SDL_Keycode a_Key) {
m_Client->Update(SECONDS); m_Client->Update(SECONDS);
break; break;
case SDLK_P:
m_PlaySpeed = 1 - m_PlaySpeed;
break;
default: default:
break; break;
} }

View File

@@ -0,0 +1,18 @@
#include <client/state/GameState.h>
#include <td/render/renderer/TimerRenderer.h>
#include <imgui.h>
namespace td {
namespace render {
void TimerRenderer::Render(float a_Lerp) {
ImGui::Begin("Timer");
ImGui::Text("Time : %02d:%02d", static_cast<int>(m_State.GetElapsedTime()) / 60, static_cast<int>(m_State.GetElapsedTime()) % 60);
ImGui::End();
}
TimerRenderer::TimerRenderer(const client::GameState& a_State) : m_State(a_State) {}
} // namespace render
} // namespace td