diff --git a/CMakeLists.txt b/CMakeLists.txt index 6cedd4e..8085f2d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -60,6 +60,7 @@ set(APP_SOURCES source/core/input/global_inputs.cpp source/core/input/input_state.cpp source/core/input/gamepad_manager.cpp + source/core/input/mouse.cpp source/core/rendering/screen.cpp source/core/rendering/canvas.cpp source/core/rendering/notifier.cpp diff --git a/source/core/input/mouse.cpp b/source/core/input/mouse.cpp new file mode 100644 index 0000000..0b252ba --- /dev/null +++ b/source/core/input/mouse.cpp @@ -0,0 +1,32 @@ +#include "core/input/mouse.hpp" + +namespace Mouse { + + namespace { + + // Temps (ms) sense moviment de ratolí abans d'amagar el cursor. + constexpr Uint32 HIDE_DELAY_MS = 3000; + + Uint32 last_move_time = 0; + bool cursor_visible = true; + + } // namespace + + void handleEvent(const SDL_Event& ev) { + if (ev.type == SDL_EVENT_MOUSE_MOTION) { + last_move_time = SDL_GetTicks(); + if (!cursor_visible) { + SDL_ShowCursor(); + cursor_visible = true; + } + } + } + + void updateCursorVisibility() { + if (cursor_visible && (SDL_GetTicks() - last_move_time > HIDE_DELAY_MS)) { + SDL_HideCursor(); + cursor_visible = false; + } + } + +} // namespace Mouse diff --git a/source/core/input/mouse.hpp b/source/core/input/mouse.hpp new file mode 100644 index 0000000..57ed0f7 --- /dev/null +++ b/source/core/input/mouse.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include + +// Auto-ocultació del cursor del ratolí. El joc no usa el ratolí com a +// entrada, així que el cursor del sistema només molesta sobre el canvas. +// El patró és senzill: si l'usuari mou el ratolí, es mostra; si passa +// més de `HIDE_DELAY_MS` sense moviment, s'amaga. +// +// El Director crida `handleEvent()` per cada event i `updateCursorVisibility()` +// una vegada per frame. +namespace Mouse { + + void handleEvent(const SDL_Event& ev); + void updateCursorVisibility(); + +} // namespace Mouse diff --git a/source/core/system/director.cpp b/source/core/system/director.cpp index 3f37515..2f50007 100644 --- a/source/core/system/director.cpp +++ b/source/core/system/director.cpp @@ -14,6 +14,7 @@ #include "core/audio/audio.hpp" #include "core/input/gamepad_manager.hpp" #include "core/input/key_config.hpp" +#include "core/input/mouse.hpp" #include "core/locale/locale.hpp" #include "core/rendering/notifier.hpp" #include "core/rendering/render_info.hpp" @@ -296,6 +297,11 @@ void Director::switchSceneIfRequested() { } auto Director::iterate() -> SDL_AppResult { + // Ocultació automàtica del cursor: observem els events abans que els + // altres steps els consumeixin; Mouse no els modifica, només reacciona + // a SDL_EVENT_MOUSE_MOTION per reaparèixer el cursor. + for (const auto& ev : EventBuffer::events) { Mouse::handleEvent(ev); } + // Ordre important: primer els events de gamepad (hot-plug + BACK que // obre el menú quan està tancat), després el menú (pot consumir tecles // i INJECTAR un SDL_EVENT_QUIT des de l'acció "Eixir del joc"), i @@ -316,6 +322,7 @@ auto Director::iterate() -> SDL_AppResult { last_ticks_ms_ = NOW_MS; Audio::update(); + Mouse::updateCursorVisibility(); ServiceMenu::get().update(delta_ms); current_scene_->update(delta_ms); current_scene_->render();