summaryrefslogtreecommitdiffhomepage
path: root/Stars45/Game.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Stars45/Game.cpp')
-rw-r--r--Stars45/Game.cpp84
1 files changed, 23 insertions, 61 deletions
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);
}