109 lines
3.0 KiB
C++
109 lines
3.0 KiB
C++
#include "Game.hpp"
|
|
|
|
#include <numeric>
|
|
|
|
#include <SFML/System.hpp>
|
|
#include <SFML/Window/ContextSettings.hpp>
|
|
#include <SFML/Window/Event.hpp>
|
|
|
|
#include "Engine/Utils/Perfs.hpp"
|
|
#include "Engine/Utils/Timers.hpp"
|
|
|
|
using std::make_shared;
|
|
using std::make_unique;
|
|
|
|
#define TARGET_FPS (1000/60)
|
|
|
|
|
|
std::unique_ptr<SysTimer> mPerfsTimer;
|
|
|
|
Game::Game(bool dbg) : gbDbgModeEnabled(dbg) {
|
|
InitWindows();
|
|
if (gbDbgModeEnabled) {
|
|
gDbgUI = make_unique<DebugUI>();
|
|
mPerfsTimer = make_unique<SysTimer>();
|
|
mPerfsTimer->Reset();
|
|
}
|
|
}
|
|
|
|
void Game::InitWindows() {
|
|
// Create default game window
|
|
sf::ContextSettings sWindowSettings;
|
|
sWindowSettings.depthBits = 0;
|
|
sWindowSettings.stencilBits = 0;
|
|
sWindowSettings.antialiasingLevel = 8;
|
|
sWindowSettings.sRgbCapable = true;
|
|
|
|
gMainWindow = make_shared<sf::RenderWindow>(
|
|
sf::VideoMode(1080, 720), "ProtoTank",
|
|
(sf::Style::Close | sf::Style::Titlebar),
|
|
sWindowSettings
|
|
);
|
|
gMainWindow->setVerticalSyncEnabled(false);
|
|
gMainWindow->setFramerateLimit(60);
|
|
gMainWindow->setKeyRepeatEnabled(false);
|
|
gMainWindow->setMouseCursorVisible(true);
|
|
}
|
|
|
|
GAME_STATUS Game::Tick(SysTimer& time) {
|
|
static std::vector<double> msTicksMonitoring;
|
|
static double mPrevdelta = 0;
|
|
static int mFrameCnt = 0;
|
|
double mDelta = time.GetDeltaTime();
|
|
|
|
if (gDbgUI != nullptr && mPerfsTimer != nullptr) {
|
|
msTicksMonitoring.push_back((mDelta - mPrevdelta) / TARGET_FPS);
|
|
if (mPerfsTimer->GetDeltaTime() >= 1000) { // Re-evaluate CPU usage every seconds (for FP'S')
|
|
double cpuUsage = std::accumulate(msTicksMonitoring.begin(), msTicksMonitoring.end(), 0) / msTicksMonitoring.size();
|
|
|
|
gDbgUI->UpdateDebugData(cpuUsage, (mDelta - mPrevdelta), mFrameCnt, (PerfsGetVirtMem() / 1000), (PerfsGetPhysMem() / 1000));
|
|
|
|
mFrameCnt = -1; // Minus one to compensate the direct next frame
|
|
msTicksMonitoring.clear();
|
|
mPerfsTimer->Reset();
|
|
}
|
|
}
|
|
|
|
sf::Event event;
|
|
while (gMainWindow->pollEvent(event)) { // Wait for next frame (fixed FPS)
|
|
if (event.type == sf::Event::Closed)
|
|
gMainWindow->close();
|
|
}
|
|
|
|
if (mDelta >= TARGET_FPS) { //TODO: Replace with global var and use dynamic window loader
|
|
Update();
|
|
Render();
|
|
|
|
mFrameCnt++;
|
|
time.Reset();
|
|
mPrevdelta = -mDelta;
|
|
} else {
|
|
mPrevdelta = mDelta;
|
|
}
|
|
|
|
sf::sleep(sf::milliseconds(TARGET_FPS - (mDelta - mPrevdelta)));
|
|
|
|
if (gMainWindow->isOpen())
|
|
return GAME_RUNNING;
|
|
else
|
|
return GAME_QUIT;
|
|
}
|
|
|
|
void Game::Update() {
|
|
|
|
}
|
|
|
|
void Game::Render() {
|
|
// Clear the draw buffer
|
|
gMainWindow->clear();
|
|
|
|
// Draw the arena view
|
|
//3DRenderer::draw()
|
|
// Draw the UI above
|
|
//UI::draw()
|
|
// Draw the debug informations if enabled
|
|
if (gDbgUI != nullptr) gDbgUI->DrawDebugData(gMainWindow);
|
|
|
|
// Present the draw buffer
|
|
gMainWindow->display();
|
|
} |