1 #include "ge211_engine.h" 2 #include "ge211_base.h" 3 #include "ge211_render.h" 4 #include "ge211_sprites.h" 7 #include "../3rdparty/utf8-cpp/utf8.h" 19 static const int software_fps = 60;
20 static const Duration software_frame_length = Duration(1) / software_fps;
21 static const Duration min_frame_length = software_frame_length / 2;
23 Engine::Engine(Abstract_game& game)
25 window_{game_.initial_window_title(), game_.initial_window_dimensions()},
33 game_.engine_ =
nullptr;
36 void Engine::prepare(
const sprites::Sprite& sprite)
const 38 sprite.prepare(renderer_);
46 bool has_vsync = renderer_.is_vsync();
51 while (!game_.quit_) {
53 game_.on_frame(game_.get_prev_frame_length().seconds());
54 if (game_.mixer_) game_.mixer_->poll_channels_();
57 renderer_.set_color(game_.background_color);
59 paint_sprites_(sprites);
62 Duration allowed_frame_length =
63 (is_focused_ && has_vsync)?
64 min_frame_length : software_frame_length;
66 auto frame_length = game_.frame_start_.elapsed_time();
67 if (frame_length < allowed_frame_length) {
68 auto duration = allowed_frame_length - frame_length;
71 debug() <<
"Software vsync slept for " 72 << duration.seconds() <<
" s";
79 }
catch (
const Exception_base& e) {
80 fatal() <<
"Uncaught exception:\n " << e.what();
85 void Engine::handle_events_(SDL_Event& e)
87 while (SDL_PollEvent(&e) != 0) {
94 const char* str = e.text.text;
95 const char* end = str + std::strlen(str);
98 uint32_t code = utf8::next(str, end);
99 if (code) game_.on_key(Key{code});
108 game_.on_key_down(key);
110 if (!key.is_textual()) {
117 game_.on_key_up(Key{e.key});
120 case SDL_MOUSEBUTTONDOWN: {
122 if (map_button(e.button.button, button))
123 game_.on_mouse_down(button, {e.button.x, e.button.y});
127 case SDL_MOUSEBUTTONUP: {
129 if (map_button(e.button.button, button))
130 game_.on_mouse_up(button, {e.button.x, e.button.y});
134 case SDL_MOUSEMOTION:
135 game_.on_mouse_move({e.motion.x, e.motion.y});
138 case SDL_WINDOWEVENT:
139 switch (e.window.event) {
140 case SDL_WINDOWEVENT_FOCUS_GAINED:
144 case SDL_WINDOWEVENT_FOCUS_LOST:
159 void Engine::paint_sprites_(Sprite_set& sprite_set)
161 auto& sprites = sprite_set.sprites_;
162 std::make_heap(sprites.begin(), sprites.end());
164 while (!sprites.empty()) {
165 std::pop_heap(sprites.begin(), sprites.end());
166 sprites.back().render(renderer_);
171 Window& Engine::get_window() noexcept
Mouse_button
A representation of a mouse button.
The game engine namespace.