feat(mouse): amaga el cursor automàticament després de 3s sense moviment
This commit is contained in:
1 parent
d5abc6343e
commit
4dd2b6d2a9
4 files changed
+57
No files matched your search
@@ -60,6 +60,7 @@ set(APP_SOURCES
|
|||||||
source/core/input/global_inputs.cpp
|
source/core/input/global_inputs.cpp
|
||||||
source/core/input/input_state.cpp
|
source/core/input/input_state.cpp
|
||||||
source/core/input/gamepad_manager.cpp
|
source/core/input/gamepad_manager.cpp
|
||||||
|
source/core/input/mouse.cpp
|
||||||
source/core/rendering/screen.cpp
|
source/core/rendering/screen.cpp
|
||||||
source/core/rendering/canvas.cpp
|
source/core/rendering/canvas.cpp
|
||||||
source/core/rendering/notifier.cpp
|
source/core/rendering/notifier.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
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SDL3/SDL.h>
|
||||||
|
|
||||||
|
// 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
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
#include "core/audio/audio.hpp"
|
#include "core/audio/audio.hpp"
|
||||||
#include "core/input/gamepad_manager.hpp"
|
#include "core/input/gamepad_manager.hpp"
|
||||||
#include "core/input/key_config.hpp"
|
#include "core/input/key_config.hpp"
|
||||||
|
#include "core/input/mouse.hpp"
|
||||||
#include "core/locale/locale.hpp"
|
#include "core/locale/locale.hpp"
|
||||||
#include "core/rendering/notifier.hpp"
|
#include "core/rendering/notifier.hpp"
|
||||||
#include "core/rendering/render_info.hpp"
|
#include "core/rendering/render_info.hpp"
|
||||||
@@ -296,6 +297,11 @@ void Director::switchSceneIfRequested() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto Director::iterate() -> SDL_AppResult {
|
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
|
// Ordre important: primer els events de gamepad (hot-plug + BACK que
|
||||||
// obre el menú quan està tancat), després el menú (pot consumir tecles
|
// 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
|
// 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;
|
last_ticks_ms_ = NOW_MS;
|
||||||
|
|
||||||
Audio::update();
|
Audio::update();
|
||||||
|
Mouse::updateCursorVisibility();
|
||||||
ServiceMenu::get().update(delta_ms);
|
ServiceMenu::get().update(delta_ms);
|
||||||
current_scene_->update(delta_ms);
|
current_scene_->update(delta_ms);
|
||||||
current_scene_->render();
|
current_scene_->render();
|
||||||
|
|||||||
Reference in new issue
Block a user