mirror of
https://github.com/zhenyan121/Cubed.git
synced 2026-08-08 17:57:02 +08:00
fix(camera): reset camera on resize events and fix input handling on imgui toggle
- Add Camera::player() accessor. - Handle WindowResizeEvent and FrameBufferResizeEvent to reset camera. - Fix escape key handling to disable mouse before toggling imgui. - Fix left alt handling to toggle mouse state correctly. - Reset player key status when toggling imgui.
This commit is contained in:
@@ -49,6 +49,7 @@ public:
|
|||||||
void change_perspective();
|
void change_perspective();
|
||||||
bool is_first_person() const;
|
bool is_first_person() const;
|
||||||
bool handle_event(const Event& e);
|
bool handle_event(const Event& e);
|
||||||
|
ClientPlayer* player();
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Cubed
|
} // namespace Cubed
|
||||||
|
|||||||
@@ -645,9 +645,10 @@ void App::handle_sdl_event(SDL_Event& e) {
|
|||||||
break;
|
break;
|
||||||
case SDL_EVENT_KEY_DOWN:
|
case SDL_EVENT_KEY_DOWN:
|
||||||
if (imgui_enable && e.key.key == SDLK_ESCAPE) {
|
if (imgui_enable && e.key.key == SDLK_ESCAPE) {
|
||||||
|
m_window.disable_mouse();
|
||||||
m_window.set_imgui_enabled(false);
|
m_window.set_imgui_enabled(false);
|
||||||
|
}
|
||||||
} else {
|
if (!imgui_enable) {
|
||||||
handle_sdl_key(e);
|
handle_sdl_key(e);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -107,10 +107,9 @@ void Camera::change_perspective() {
|
|||||||
bool Camera::is_first_person() const {
|
bool Camera::is_first_person() const {
|
||||||
return m_perspective == Perspective::FIRST_PERSON;
|
return m_perspective == Perspective::FIRST_PERSON;
|
||||||
}
|
}
|
||||||
|
ClientPlayer* Camera::player() { return m_player; }
|
||||||
bool Camera::handle_event(const Event& e) {
|
bool Camera::handle_event(const Event& e) {
|
||||||
return std::visit(
|
return std::visit(Overloaded{[this](const MouseMoveEvent& e) {
|
||||||
Overloaded{[this](const MouseMoveEvent& e) {
|
|
||||||
if (handle_mouse_move_event(e)) {
|
if (handle_mouse_move_event(e)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -126,8 +125,14 @@ bool Camera::handle_event(const Event& e) {
|
|||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
[](const TextInputEvent&) { return false; },
|
[](const TextInputEvent&) { return false; },
|
||||||
[](const WindowResizeEvent&) { return false; },
|
[this](const WindowResizeEvent&) {
|
||||||
[](const FrameBufferResizeEvent&) { return false; }
|
reset_camera();
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
[this](const FrameBufferResizeEvent&) {
|
||||||
|
reset_camera();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Cubed
|
} // namespace Cubed
|
||||||
,
|
,
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "Cubed/window.hpp"
|
#include "Cubed/window.hpp"
|
||||||
|
|
||||||
#include "Cubed/camera.hpp"
|
#include "Cubed/camera.hpp"
|
||||||
|
#include "Cubed/gameplay/client_player.hpp"
|
||||||
#include "Cubed/tools/cubed_assert.hpp"
|
#include "Cubed/tools/cubed_assert.hpp"
|
||||||
#include "Cubed/tools/font.hpp"
|
#include "Cubed/tools/font.hpp"
|
||||||
#include "Cubed/tools/log.hpp"
|
#include "Cubed/tools/log.hpp"
|
||||||
@@ -76,8 +77,10 @@ bool Window::handle_key_event(const KeyEvent& e) {
|
|||||||
if (e.key == Key::LEFT_ALT && e.action == KeyAction::PRESS) {
|
if (e.key == Key::LEFT_ALT && e.action == KeyAction::PRESS) {
|
||||||
if (m_game_running) {
|
if (m_game_running) {
|
||||||
if (m_mouse_enable) {
|
if (m_mouse_enable) {
|
||||||
|
disable_mouse();
|
||||||
set_imgui_enabled(false);
|
set_imgui_enabled(false);
|
||||||
} else {
|
} else {
|
||||||
|
enable_mouse();
|
||||||
set_imgui_enabled(true);
|
set_imgui_enabled(true);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -225,10 +228,11 @@ bool Window::is_enable_imgui() const { return m_imgui_enable; }
|
|||||||
|
|
||||||
void Window::set_imgui_enabled(bool enable) {
|
void Window::set_imgui_enabled(bool enable) {
|
||||||
m_imgui_enable = enable;
|
m_imgui_enable = enable;
|
||||||
if (!enable) {
|
if (m_camera) {
|
||||||
disable_mouse();
|
auto player = m_camera->player();
|
||||||
} else {
|
if (player) {
|
||||||
enable_mouse();
|
player->reset_key_status();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user