summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Stars45/Clock.cpp30
-rw-r--r--Stars45/Clock.h3
-rw-r--r--Stars45/Game.cpp84
-rw-r--r--Stars45/Game.h9
-rw-r--r--Stars45/StarServer.cpp19
-rw-r--r--Stars45/Starshatter.cpp25
6 files changed, 49 insertions, 121 deletions
diff --git a/Stars45/Clock.cpp b/Stars45/Clock.cpp
index 0bd3447..4973a5c 100644
--- a/Stars45/Clock.cpp
+++ b/Stars45/Clock.cpp
@@ -20,7 +20,6 @@ Clock::Clock() :
m_delta {STARTING_DELTA},
m_gui_delta {STARTING_DELTA}
{
- Set();
}
@@ -28,27 +27,17 @@ void
Clock::Set()
{
m_point = inner_clock::now();
- m_compression = NO_COMPRESSION;
m_delta = STARTING_DELTA;
m_gui_delta = STARTING_DELTA;
}
-void
-Clock::Reset()
-{
- m_game_elapsed = elapsed_duration::zero();
- m_real_elapsed = elapsed_duration::zero();
- Set();
-}
-
-
double
Clock::Step()
{
const auto next = inner_clock::now();
- const auto delta = std::chrono::duration_cast<std::chrono::milliseconds>(next - m_point);
- m_game_elapsed += std::chrono::duration_cast<std::chrono::milliseconds>(delta * m_compression);
+ const auto delta = std::chrono::duration_cast<elapsed_duration>(next - m_point);
+ m_game_elapsed += std::chrono::duration_cast<elapsed_duration>(delta * m_compression);
m_real_elapsed += delta;
const std::chrono::duration<double> seconds = delta;
m_delta = seconds.count() * m_compression;
@@ -58,6 +47,21 @@ Clock::Step()
}
+void
+Clock::ResetGameTime()
+{
+ m_game_elapsed = elapsed_duration::zero();
+}
+
+
+void
+Clock::SkipGameTime(double seconds)
+{
+ const std::chrono::duration<double> skip {seconds};
+ m_game_elapsed += std::chrono::duration_cast<elapsed_duration>(skip);
+}
+
+
double
Clock::Delta() const
{
diff --git a/Stars45/Clock.h b/Stars45/Clock.h
index e2ddcb0..d7b41a7 100644
--- a/Stars45/Clock.h
+++ b/Stars45/Clock.h
@@ -20,8 +20,9 @@ public:
Clock();
void Set();
- void Reset();
double Step();
+ void ResetGameTime();
+ void SkipGameTime(double seconds);
double Delta() const;
double GuiDelta() const;
diff --git a/Stars45/Game.cpp b/Stars45/Game.cpp
index 6d91489..92937e6 100644
--- a/Stars45/Game.cpp
+++ b/Stars45/Game.cpp
@@ -25,26 +25,21 @@
#include "VideoFactory.h"
#include "VideoSettings.h"
#include "ContentBundle.h"
+#include "Clock.h"
// +--------------------------------------------------------------------+
Game* game = 0;
-const int VIDEO_FPS = 30;
-const double MAX_FRAME_TIME_VIDEO = 1.0 / (double) VIDEO_FPS;
const double MAX_FRAME_TIME_NORMAL = 1.0 / 5.0;
-static LARGE_INTEGER perf_freq;
-static LARGE_INTEGER perf_cnt1;
-static LARGE_INTEGER perf_cnt2;
-
// +--------------------------------------------------------------------+
Game::Game()
: world(0), video_factory(0), video(0), video_settings(0), soundcard(0),
gamma(128), max_tex_size(2048), screen(0), totaltime(0),
hInst(0), hwnd(0), frame_rate(0), frame_count(0), frame_count0(0),
- frame_time(0), frame_time0(0), gui_seconds(0),
+ frame_time(0), frame_time0(0),
status(Game::OK), exit_code(0), window_style(0)
{
if (!game) {
@@ -54,9 +49,6 @@ Game::Game()
paused = false;
server = false;
show_mouse = false;
- real_time = 0;
- game_time = 0;
- time_comp = 1;
frame_number = 0;
max_frame_length = MAX_FRAME_TIME_NORMAL;
@@ -194,7 +186,7 @@ double
Game::FrameTime()
{
if (game)
- return game->seconds;
+ return game->GetClock()->Delta();
return 0;
}
@@ -203,7 +195,7 @@ double
Game::GUITime()
{
if (game)
- return game->gui_seconds;
+ return game->GetClock()->GuiDelta();
return 0;
}
@@ -317,10 +309,6 @@ Game::InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance;
- // initialize the game timer:
- QueryPerformanceFrequency(&perf_freq);
- QueryPerformanceCounter(&perf_cnt1);
-
// center window on display:
int screenx = GetSystemMetrics(SM_CXSCREEN);
int screeny = GetSystemMetrics(SM_CYSCREEN);
@@ -765,6 +753,7 @@ Game::Run()
Print("+====================================================================+\n");
// Polling messages from event queue until quit
+ clock.Set();
while (status < EXIT || Panic::Panicked()) {
if (PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE)) {
if (msg.message == WM_QUIT)
@@ -849,24 +838,9 @@ Game::GameLoop()
Pause(false);
}
- QueryPerformanceCounter(&perf_cnt2);
-
- double freq = (double) (perf_freq.QuadPart);
- double msec = (double) (perf_cnt2.QuadPart - perf_cnt1.QuadPart);
-
- msec /= freq;
- msec *= 1000.0;
-
- if (msec < 1)
- msec = 1;
-
- real_time += (DWORD) msec;
-
+ clock.Step();
frame_number++;
Mouse::w = 0;
-
- perf_cnt1 = perf_cnt2;
-
return wait_for_windows_events;
}
@@ -875,26 +849,8 @@ Game::GameLoop()
void
Game::UpdateWorld()
{
- long new_time = real_time;
- double delta = new_time - frame_time;
- gui_seconds = delta * 0.001;
- seconds = max_frame_length;
-
- if (time_comp == 1)
- {
- if (delta < max_frame_length * 1000)
- seconds = delta * 0.001;
- }
- else
- {
- seconds = time_comp * delta * 0.001;
- }
-
- frame_time = new_time;
- game_time += (DWORD) (seconds * 1000);
-
if (world)
- world->ExecFrame(seconds);
+ world->ExecFrame(clock.Delta());
}
// +--------------------------------------------------------------------+
@@ -972,7 +928,7 @@ Game::CollectStats()
{
frame_count++;
- if (!totaltime) totaltime = real_time;
+ if (!totaltime) totaltime = clock.RealTime();
if (frame_time - frame_time0 > 200) {
frame_rate = (frame_count - frame_count0) * 1000.0 / (frame_time - frame_time0);
@@ -1000,7 +956,7 @@ Game::ShowStats()
{
if (server) return;
- totaltime = real_time - totaltime;
+ totaltime = clock.RealTime() - totaltime;
Print("\n");
Print("Performance Data:\n");
@@ -1282,34 +1238,40 @@ GetKeyPlus(int& key, int& shift)
// +====================================================================+
+Clock*
+Game::GetClock()
+{
+ return &clock;
+}
+
+
DWORD GetRealTime()
{
Game* game = Game::GetInstance();
if (game)
return game->RealTime();
-
- return timeGetTime();
+ return 0;
}
DWORD Game::RealTime()
{
- return real_time;
+ return clock.RealTime();
}
DWORD Game::GameTime()
{
- return game_time;
+ return clock.GameTime();
}
DWORD Game::TimeCompression()
{
- return time_comp;
+ return clock.TimeCompression();
}
void Game::SetTimeCompression(DWORD comp)
{
if (comp > 0 && comp <= 100)
- time_comp = comp;
+ clock.SetTimeCompression(static_cast<double>(comp));
}
DWORD Game::Frame()
@@ -1319,11 +1281,11 @@ DWORD Game::Frame()
void Game::ResetGameTime()
{
- game_time = 0;
+ clock.ResetGameTime();
}
void Game::SkipGameTime(double seconds)
{
if (seconds > 0)
- game_time += (DWORD) (seconds * 1000);
+ clock.SkipGameTime(seconds);
}
diff --git a/Stars45/Game.h b/Stars45/Game.h
index 5ce1756..d9054e9 100644
--- a/Stars45/Game.h
+++ b/Stars45/Game.h
@@ -11,6 +11,7 @@
#define Game_h
#include "ApplicationDX9.h"
+#include "Clock.h"
#include "Types.h"
#include "Screen.h"
#include "Video.h"
@@ -75,6 +76,7 @@ public:
void SetGammaLevel(int g);
void SetMaxTexSize(int n);
+ Clock* GetClock();
DWORD RealTime();
DWORD GameTime();
DWORD TimeCompression();
@@ -163,9 +165,7 @@ protected:
RECT bounds_rect; // Saved window bounds for mode switches
RECT client_rect; // Saved client area size for mode switches
-
- double gui_seconds;
- double seconds;
+ Clock clock;
double frame_rate;
int frame_count;
int frame_count0;
@@ -180,9 +180,6 @@ protected:
bool paused;
bool server;
bool show_mouse;
- DWORD real_time;
- DWORD game_time;
- DWORD time_comp;
DWORD frame_number;
double max_frame_length;
diff --git a/Stars45/StarServer.cpp b/Stars45/StarServer.cpp
index c972a41..34eb77f 100644
--- a/Stars45/StarServer.cpp
+++ b/Stars45/StarServer.cpp
@@ -320,21 +320,6 @@ StarServer::GameLoop()
void
StarServer::UpdateWorld()
{
- long new_time = real_time;
- double delta = new_time - frame_time;
- seconds = max_frame_length;
- gui_seconds = delta * 0.001;
-
- if (frame_time == 0)
- gui_seconds = 0;
-
- time_comp = 1;
-
- if (delta < max_frame_length * 1000)
- seconds = delta * 0.001;
-
- frame_time = new_time;
-
Galaxy* galaxy = Galaxy::GetInstance();
if (galaxy) galaxy->ExecFrame();
@@ -347,12 +332,10 @@ StarServer::UpdateWorld()
}
else {
- game_time += (DWORD) (seconds * 1000);
-
Drive::StartFrame();
if (world)
- world->ExecFrame(seconds);
+ world->ExecFrame(clock.Delta());
}
static DWORD refresh_time = 0;
diff --git a/Stars45/Starshatter.cpp b/Stars45/Starshatter.cpp
index 7326128..eb971e8 100644
--- a/Stars45/Starshatter.cpp
+++ b/Stars45/Starshatter.cpp
@@ -855,23 +855,6 @@ Starshatter::GameLoop()
void
Starshatter::UpdateWorld()
{
- long new_time = real_time;
- double delta = new_time - frame_time; // in milliseconds
- seconds = max_frame_length; // in seconds
- gui_seconds = delta * 0.001;
-
- if (frame_time == 0)
- gui_seconds = 0;
-
- if (delta < time_comp * max_frame_length * 1000) {
- seconds = time_comp * delta * 0.001;
- }
- else {
- seconds = time_comp * max_frame_length;
- }
-
- frame_time = new_time;
-
Galaxy* galaxy = Galaxy::GetInstance();
if (galaxy) galaxy->ExecFrame();
@@ -890,12 +873,10 @@ Starshatter::UpdateWorld()
}
else {
- game_time += (DWORD) (seconds * 1000);
-
Drive::StartFrame();
if (world)
- world->ExecFrame(seconds);
+ world->ExecFrame(clock.Delta());
}
if (game_mode == PLAY_MODE || InCutscene()) {
@@ -906,7 +887,7 @@ Starshatter::UpdateWorld()
cam_dir->VirtualHeadOffset(head_tracker->GetX(), head_tracker->GetY(), head_tracker->GetZ());
}
- cam_dir->ExecFrame(gui_seconds);
+ cam_dir->ExecFrame(clock.GuiDelta());
}
Sim* sim = Sim::GetSim();
@@ -916,7 +897,7 @@ Starshatter::UpdateWorld()
ListIter<Ship> iter = rgn->Ships();
while (++iter) {
Ship* s = iter.value();
- s->SelectDetail(seconds);
+ s->SelectDetail(clock.Delta());
}
}
}