From 68761609f3b98bfc99f2164eece12027d5575c0b Mon Sep 17 00:00:00 2001 From: Frederico Linhares Date: Tue, 2 Sep 2025 15:06:27 -0300 Subject: feat Add Mode and Controller to BluCat --- src/blu_cat/int/controller.hpp | 50 +++++++++++++++++++++++++++ src/blu_cat/int/core.cpp | 78 ++++++++++++++++++++++++++++++++++++++++++ src/blu_cat/int/core.hpp | 7 ++++ src/blu_cat/int/mode.hpp | 41 ++++++++++++++++++++++ 4 files changed, 176 insertions(+) create mode 100644 src/blu_cat/int/controller.hpp create mode 100644 src/blu_cat/int/mode.hpp (limited to 'src') diff --git a/src/blu_cat/int/controller.hpp b/src/blu_cat/int/controller.hpp new file mode 100644 index 0000000..deedde3 --- /dev/null +++ b/src/blu_cat/int/controller.hpp @@ -0,0 +1,50 @@ +/* + * Copyright 2022-2025 Frederico de Oliveira Linhares + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef BLU_CAT_INT_CONTROLLER_H +#define BLU_CAT_INT_CONTROLLER_H 1 + +#include + +namespace BluCat::INT +{ + +struct Controller +{ + virtual void + key_down(SDL_Keycode keycode){}; + virtual void + key_up(SDL_Keycode keycode){}; + + virtual void + mouse_button_down(SDL_MouseButtonEvent& e){}; + virtual void + mouse_button_up(SDL_MouseButtonEvent& e){}; + virtual void + mouse_motion(int x, int y, int xrel, int yrel){}; + + virtual void + tick(){}; + virtual void + render(){}; + + virtual + ~Controller(){}; +}; + +} + +#endif /* BLU_CAT_INT_CONTROLLER_H */ 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 _mode) +{ + using namespace std::chrono; + using namespace std::this_thread; + + std::unique_ptr mode{std::move(_mode)}; + std::unique_ptr 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; +} + } diff --git a/src/blu_cat/int/core.hpp b/src/blu_cat/int/core.hpp index 0e5f3a3..4737123 100644 --- a/src/blu_cat/int/core.hpp +++ b/src/blu_cat/int/core.hpp @@ -58,6 +58,7 @@ #include "../gra/renderer.hpp" #include "../gra/swapchain.hpp" #include "../gra/vulkan.hpp" +#include "mode.hpp" namespace BluCat::INT { @@ -131,10 +132,16 @@ struct Core vk_graphics_pipeline_2d_wired; BluCat::GRA::Renderer *vk_renderer; + + std::unique_ptr next_game_mode{nullptr}; + std::unique_ptr next_game_controller{nullptr}; }; extern Core core; +void +run_game(std::unique_ptr initial_mode); + } #endif /* BLU_CAT_INT_CORE_H */ diff --git a/src/blu_cat/int/mode.hpp b/src/blu_cat/int/mode.hpp new file mode 100644 index 0000000..8197f75 --- /dev/null +++ b/src/blu_cat/int/mode.hpp @@ -0,0 +1,41 @@ +/* + * Copyright 2022-2025 Frederico de Oliveira Linhares + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef BLU_CAT_INT_MODE_H +#define BLU_CAT_INT_MODE_H 1 + +#include + +#include "controller.hpp" + +namespace BluCat::INT +{ + +struct Mode +{ + virtual std::unique_ptr + default_controller() = 0; + + virtual void + render() = 0; + + virtual + ~Mode(){}; +}; + +} + +#endif /* BLU_CAT_INT_MODE_H */ -- cgit v1.2.3