summaryrefslogtreecommitdiff
path: root/src/blu_cat/int/core.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/blu_cat/int/core.cpp')
-rw-r--r--src/blu_cat/int/core.cpp78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/blu_cat/int/core.cpp b/src/blu_cat/int/core.cpp
index ffae1d2..6f67b98 100644
--- a/src/blu_cat/int/core.cpp
+++ b/src/blu_cat/int/core.cpp
@@ -718,4 +718,82 @@ const CommandChain Core::loader{
Core core;
+void
+run_game(std::unique_ptr<BluCat::INT::Mode> _mode)
+{
+ using namespace std::chrono;
+ using namespace std::this_thread;
+
+ std::unique_ptr<BluCat::INT::Mode> mode{std::move(_mode)};
+ std::unique_ptr<BluCat::INT::Controller> controller{
+ mode->default_controller()};
+
+ bool quit{false};
+ int x, y, xrel, yrel;
+ SDL_Event event;
+ auto frame_start = steady_clock::now();
+
+ while(!quit)
+ {
+ if(core.next_game_mode)
+ {
+ mode = std::move(core.next_game_mode);
+ controller = mode->default_controller();
+ }
+ else if(core.next_game_controller)
+ controller = std::move(core.next_game_controller);
+
+ while(SDL_PollEvent(&event))
+ {
+ switch(event.type)
+ {
+ case SDL_EVENT_KEY_DOWN:
+ if(event.key.repeat != 0) continue;
+ controller->key_down(event.key.key);
+ break;
+ case SDL_EVENT_KEY_UP:
+ if(event.key.repeat != 0) continue;
+ controller->key_up(event.key.key);
+ break;
+ case SDL_EVENT_MOUSE_BUTTON_DOWN:
+ controller->mouse_button_down(event.button);
+ break;
+ case SDL_EVENT_MOUSE_BUTTON_UP:
+ controller->mouse_button_up(event.button);
+ break;
+ case SDL_EVENT_MOUSE_MOTION:
+ x = event.motion.x;
+ y = event.motion.y;
+
+ xrel = event.motion.xrel;
+ yrel = event.motion.yrel;
+
+ controller->mouse_motion(x, y, xrel, yrel);
+ break;
+ case SDL_EVENT_QUIT:
+ quit = true;
+ }
+ }
+
+ controller->tick();
+ mode->render();
+ controller->render();
+ BluCat::INT::core.vk_renderer->draw();
+
+ { // Timer
+ auto frame_stop = steady_clock::now();
+ auto frame_duration = frame_stop - frame_start;
+
+ // If frame take less time than maximum allowed.
+ if(core.max_frame_duration > frame_duration)
+ sleep_for(core.max_frame_duration - frame_duration);
+
+ frame_start = frame_stop;
+ }
+ }
+
+ controller = nullptr;
+ mode = nullptr;
+}
+
}