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/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
|
||||
|
||||
@@ -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/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();
|
||||
|
||||
Reference in new issue
Block a user