dungeon/src/Main.cpp

135 lines
3 KiB
C++

//#define _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH
//#define _ITERATOR_DEBUG_LEVEL 0
#include <SDL.h>
#include <stdio.h>
#include <math.h>
#include <string>
#include <time.h>
#include "Renderer.h"
#include "Input.h"
#include "Config.h"
#include "Game.h"
#include "imgui.h"
Uint64 perfFreq;
double currTime();
#undef main
int main(int argc, char* argv[]) {
Renderer* renderer;
Input* input;
Config cfg = Config("dungeon.cfg");
cfg.load();
int windowWidth = cfg.getInt("ResolutionX", 1280);
int windowHeight = cfg.getInt("ResolutionY", 720);
bool vsync = cfg.getBool("VSync", false);
bool wireframe = cfg.getBool("Wireframes", false);
cfg.save();
int err = 0;
err = SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO);
if (err != 0) {
const char* error = SDL_GetError();
SDL_LogCritical(SDL_LOG_CATEGORY_SYSTEM, "Error: %s", error);
SDL_Quit();
return 1;
}
renderer = new Renderer();
if (!renderer->Init("Dungeon", windowWidth, windowHeight)) {
const char* error = SDL_GetError();
SDL_LogCritical(SDL_LOG_CATEGORY_SYSTEM, "Error: %s", error);
SDL_ShowSimpleMessageBox(0, "Error", error, nullptr);
SDL_Quit();
return 1;
}
renderer->SetVSyncEnabled(vsync);
renderer->SetWireframesEnabled(wireframe);
input = new Input();
srand(time(nullptr));
load(renderer, input);
perfFreq = SDL_GetPerformanceFrequency();
double dt = 1.0/30;
double currentTime = currTime();
double accumulator = dt;
int currentframe = 0;
bool running = true;
while (running) {
double newTime = currTime();
double frametime = newTime - currentTime;
if (frametime > 1.0/30) {
frametime = 1.0/30;
}
currentTime = newTime;
accumulator += frametime;
//dt = (SDL_GetTicks() - currentframe) * 0.001f;
currentframe = SDL_GetTicks();
SDL_Event ev;
ImGuiIO &io = ImGui::GetIO();
renderer->ImguiNewFrame();
while (SDL_PollEvent(&ev)) {
renderer->ImguiProcessEvents(&ev);
switch (ev.type) {
case SDL_WINDOWEVENT:
switch (ev.window.event) {
case SDL_WINDOWEVENT_CLOSE:
running = false;
break;
default:
break;
}
break;
case SDL_KEYDOWN:
if (!io.WantCaptureKeyboard)
input->setkey(ev.key.keysym.sym, (SDL_Keymod)ev.key.keysym.mod, true);
break;
case SDL_KEYUP:
if (!io.WantCaptureKeyboard)
input->setkey(ev.key.keysym.sym, (SDL_Keymod)ev.key.keysym.mod, false);
break;
case SDL_QUIT:
running = false;
break;
default:
break;
}
}
while (running && accumulator >= dt) {
update(dt);
input->newframe();
accumulator -= dt;
}
renderer->Clear();
draw(accumulator / dt);
renderer->Present();
SDL_Delay(1);
}
delete renderer;
SDL_Quit();
return 0;
}
double currTime() {
return SDL_GetPerformanceCounter() / (double)perfFreq;
}