1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
#include "game.h"
#include "systems/controlling.h"
#include "systems/pondering.h"
#include "systems/animating.h"
#include "systems/mapping.h"
#include "systems/orienting.h"
#include "systems/playing.h"
#include "systems/scheduling.h"
#include "systems/realizing.h"
#include "systems/scripting.h"
#include "consts.h"
void key_callback(GLFWwindow* window, int key, int, int action, int)
{
Game& game = *static_cast<Game*>(glfwGetWindowUserPointer(window));
if ((action == GLFW_PRESS) && (key == GLFW_KEY_ESCAPE))
{
game.shouldQuit_ = true;
return;
}
game.systemManager_.input(key, action);
}
Game::Game(std::mt19937& rng) : rng_(rng)
{
systemManager_.emplaceSystem<PlayingSystem>(*this);
systemManager_.emplaceSystem<SchedulingSystem>(*this);
systemManager_.emplaceSystem<ControllingSystem>(*this);
systemManager_.emplaceSystem<ScriptingSystem>(*this);
systemManager_.emplaceSystem<OrientingSystem>(*this);
systemManager_.emplaceSystem<PonderingSystem>(*this);
systemManager_.emplaceSystem<MappingSystem>(*this);
systemManager_.emplaceSystem<AnimatingSystem>(*this);
systemManager_.emplaceSystem<RealizingSystem>(*this,
"res/maps.xml",
"res/entities.xml");
systemManager_.getSystem<PlayingSystem>().initPlayer();
glfwSwapInterval(1);
glfwSetWindowUserPointer(renderer_.getWindow().getHandle(), this);
glfwSetKeyCallback(renderer_.getWindow().getHandle(), key_callback);
}
void Game::execute()
{
double lastTime = glfwGetTime();
const double dt = 0.01;
double accumulator = 0.0;
Texture texture(GAME_WIDTH, GAME_HEIGHT);
while (!(shouldQuit_ ||
glfwWindowShouldClose(renderer_.getWindow().getHandle())))
{
double currentTime = glfwGetTime();
double frameTime = currentTime - lastTime;
lastTime = currentTime;
glfwPollEvents();
accumulator += frameTime;
while (accumulator >= dt)
{
systemManager_.tick(dt);
accumulator -= dt;
}
// Render
renderer_.fill(texture, texture.entirety(), 0, 0, 0);
systemManager_.render(texture);
renderer_.renderScreen(texture);
}
}
|