From a3418ee037b5a10ce3b7a01e1b2db40f89b7cc7a Mon Sep 17 00:00:00 2001 From: GustaLOLE Date: Tue, 23 Jun 2026 12:00:40 -0300 Subject: [PATCH 1/2] Only create RaceGUIMultitouch buttons when isn't watching a ghost replay - Now, the screen is clearer in this situation, allowing the mobile player to watch a replay with less annoying things on-screen. - The player can open ihe pause menu using ESC or pressing the Android back button. --- src/states_screens/race_gui_multitouch.cpp | 77 +++++++++++++--------- src/states_screens/race_gui_multitouch.hpp | 2 + 2 files changed, 47 insertions(+), 32 deletions(-) diff --git a/src/states_screens/race_gui_multitouch.cpp b/src/states_screens/race_gui_multitouch.cpp index b7c759c9e64..3f8518afb14 100644 --- a/src/states_screens/race_gui_multitouch.cpp +++ b/src/states_screens/race_gui_multitouch.cpp @@ -34,6 +34,7 @@ using namespace irr; #include "karts/abstract_kart.hpp" #include "karts/controller/kart_control.hpp" #include "network/protocols/client_lobby.hpp" +#include "race/race_manager.hpp" #include "states_screens/race_gui_base.hpp" #include @@ -46,6 +47,7 @@ RaceGUIMultitouch::RaceGUIMultitouch(RaceGUIBase* race_gui) m_race_gui = race_gui; m_gui_action = false; m_is_spectator_mode = false; + m_is_watching_replay = false; m_height = 0; m_steering_wheel_tex = NULL; m_steering_wheel_tex_mask_up = NULL; @@ -164,12 +166,18 @@ void RaceGUIMultitouch::init() "android/steering_wheel_mask_down.png"); auto cl = LobbyProtocol::get(); - + auto rm = RaceManager::get()->isWatchingReplay(); + if (cl && cl->isSpectator()) { createSpectatorGUI(); m_is_spectator_mode = true; } + else if (rm) + { + m_is_watching_replay = true; + createRaceGUI(); + } else { createRaceGUI(); @@ -236,39 +244,44 @@ void RaceGUIMultitouch::createRaceGUI() } m_height = (unsigned int)(2 * col_size + margin / 2); - - if (UserConfigParams::m_multitouch_controls == MULTITOUCH_CONTROLS_ACCELEROMETER || - UserConfigParams::m_multitouch_controls == MULTITOUCH_CONTROLS_GYROSCOPE) + if (!m_is_watching_replay) { - m_device->addButton(BUTTON_UP_DOWN, - int(steering_accel_x), int(steering_accel_y), - int(btn2_size / 2), int(btn2_size)); - } - else - { - m_device->addButton(BUTTON_STEERING, - int(steering_wheel_x), int(steering_wheel_y), - int(btn2_size), int(btn2_size)); - } + if (UserConfigParams::m_multitouch_controls == MULTITOUCH_CONTROLS_ACCELEROMETER || + UserConfigParams::m_multitouch_controls == MULTITOUCH_CONTROLS_GYROSCOPE) + { + m_device->addButton(BUTTON_UP_DOWN, + int(steering_accel_x), int(steering_accel_y), + int(btn2_size / 2), int(btn2_size)); + } + else + { + m_device->addButton(BUTTON_STEERING, + int(steering_wheel_x), int(steering_wheel_y), + int(btn2_size), int(btn2_size)); + } - m_device->addButton(BUTTON_ESCAPE, - int(margin_top), int(margin_small), - int(btn_small_size), int(btn_small_size)); - m_device->addButton(BUTTON_RESCUE, - int(margin_top + col_small_size), int(margin_small), - int(btn_small_size), int(btn_small_size)); - m_device->addButton(BUTTON_NITRO, - int(second_column_x), int(h - 2 * col_size), - int(btn_size), int(btn_size)); - m_device->addButton(BUTTON_SKIDDING, - int(second_column_x), int(h - 1 * col_size), - int(btn_size), int(btn_size)); - m_device->addButton(BUTTON_FIRE, - int(first_column_x), int(h - 2 * col_size), - int(btn_size), int(btn_size)); - m_device->addButton(BUTTON_LOOK_BACKWARDS, - int(first_column_x), int(h - 1 * col_size), - int(btn_size), int(btn_size)); + m_device->addButton(BUTTON_ESCAPE, + int(margin_top), int(margin_small), + int(btn_small_size), int(btn_small_size)); + m_device->addButton(BUTTON_RESCUE, + int(margin_top + col_small_size), int(margin_small), + int(btn_small_size), int(btn_small_size)); + m_device->addButton(BUTTON_NITRO, + int(second_column_x), int(h - 2 * col_size), + int(btn_size), int(btn_size)); + m_device->addButton(BUTTON_SKIDDING, + int(second_column_x), int(h - 1 * col_size), + int(btn_size), int(btn_size)); + m_device->addButton(BUTTON_FIRE, + int(first_column_x), int(h - 2 * col_size), + int(btn_size), int(btn_size)); + m_device->addButton(BUTTON_LOOK_BACKWARDS, + int(first_column_x), int(h - 1 * col_size), + int(btn_size), int(btn_size)); + m_device->addButton(BUTTON_ESCAPE, + int(margin_top), int(margin_small), + int(btn_small_size), int(btn_small_size)); + } } // createRaceGUI //----------------------------------------------------------------------------- diff --git a/src/states_screens/race_gui_multitouch.hpp b/src/states_screens/race_gui_multitouch.hpp index 2b4c7f704d5..851b3c62e73 100644 --- a/src/states_screens/race_gui_multitouch.hpp +++ b/src/states_screens/race_gui_multitouch.hpp @@ -33,6 +33,7 @@ using namespace irr; class AbstractKart; class MultitouchDevice; +class RaceManager; class RaceGUIBase; class RaceGUIMultitouch @@ -43,6 +44,7 @@ class RaceGUIMultitouch bool m_gui_action; bool m_is_spectator_mode; + bool m_is_watching_replay; unsigned int m_height; video::ITexture* m_steering_wheel_tex; From 7d5bbe747412625e13f94ca1be50b68caf7a7c70 Mon Sep 17 00:00:00 2001 From: GustaLOLE Date: Thu, 25 Jun 2026 12:50:07 -0300 Subject: [PATCH 2/2] Improve the code - Now, the modifications are in a separeted function and with the pause button. - The desktop speedometer also is shown here --- src/states_screens/race_gui_base.cpp | 2 +- src/states_screens/race_gui_base.hpp | 9 +- src/states_screens/race_gui_multitouch.cpp | 102 +++++++++++++-------- src/states_screens/race_gui_multitouch.hpp | 3 +- 4 files changed, 73 insertions(+), 43 deletions(-) diff --git a/src/states_screens/race_gui_base.cpp b/src/states_screens/race_gui_base.cpp index cdc14fe04b0..f7ca3d02331 100644 --- a/src/states_screens/race_gui_base.cpp +++ b/src/states_screens/race_gui_base.cpp @@ -584,7 +584,7 @@ void RaceGUIBase::renderPlayerView(const Camera *camera, float dt) if (m_multitouch_gui != NULL && !GUIEngine::ModalDialog::isADialogActive()) { - m_multitouch_gui->draw(kart, viewport, scaling); + m_multitouch_gui->draw(kart, viewport, scaling, dt); } } // renderPlayerView diff --git a/src/states_screens/race_gui_base.hpp b/src/states_screens/race_gui_base.hpp index 353e94d3d3e..cc8121d5855 100644 --- a/src/states_screens/race_gui_base.hpp +++ b/src/states_screens/race_gui_base.hpp @@ -263,9 +263,12 @@ class RaceGUIBase void drawPlayerIcon(AbstractKart *kart, int x, int y, int w, bool is_local); - virtual void drawEnergyMeter(int x, int y, const AbstractKart *kart, - const core::recti &viewport, - const core::vector2df &scaling) {}; + virtual void drawEnergyMeter (int x, int y, const AbstractKart *kart, + const core::recti &viewport, + const core::vector2df &scaling) {}; + virtual void drawSpeedEnergyRank(const AbstractKart* kart, + const core::recti &viewport, + const core::vector2df &scaling, float dt) {}; void cleanupMessages(const float dt); void removeReferee(); diff --git a/src/states_screens/race_gui_multitouch.cpp b/src/states_screens/race_gui_multitouch.cpp index 3f8518afb14..ea8ddfc990a 100644 --- a/src/states_screens/race_gui_multitouch.cpp +++ b/src/states_screens/race_gui_multitouch.cpp @@ -175,8 +175,8 @@ void RaceGUIMultitouch::init() } else if (rm) { + createWatchingGUI(); m_is_watching_replay = true; - createRaceGUI(); } else { @@ -244,46 +244,67 @@ void RaceGUIMultitouch::createRaceGUI() } m_height = (unsigned int)(2 * col_size + margin / 2); - if (!m_is_watching_replay) + + if (UserConfigParams::m_multitouch_controls == MULTITOUCH_CONTROLS_ACCELEROMETER || + UserConfigParams::m_multitouch_controls == MULTITOUCH_CONTROLS_GYROSCOPE) { - if (UserConfigParams::m_multitouch_controls == MULTITOUCH_CONTROLS_ACCELEROMETER || - UserConfigParams::m_multitouch_controls == MULTITOUCH_CONTROLS_GYROSCOPE) - { - m_device->addButton(BUTTON_UP_DOWN, - int(steering_accel_x), int(steering_accel_y), - int(btn2_size / 2), int(btn2_size)); - } - else - { - m_device->addButton(BUTTON_STEERING, - int(steering_wheel_x), int(steering_wheel_y), - int(btn2_size), int(btn2_size)); - } - - m_device->addButton(BUTTON_ESCAPE, - int(margin_top), int(margin_small), - int(btn_small_size), int(btn_small_size)); - m_device->addButton(BUTTON_RESCUE, - int(margin_top + col_small_size), int(margin_small), - int(btn_small_size), int(btn_small_size)); - m_device->addButton(BUTTON_NITRO, - int(second_column_x), int(h - 2 * col_size), - int(btn_size), int(btn_size)); - m_device->addButton(BUTTON_SKIDDING, - int(second_column_x), int(h - 1 * col_size), - int(btn_size), int(btn_size)); - m_device->addButton(BUTTON_FIRE, - int(first_column_x), int(h - 2 * col_size), - int(btn_size), int(btn_size)); - m_device->addButton(BUTTON_LOOK_BACKWARDS, - int(first_column_x), int(h - 1 * col_size), - int(btn_size), int(btn_size)); - m_device->addButton(BUTTON_ESCAPE, - int(margin_top), int(margin_small), - int(btn_small_size), int(btn_small_size)); + m_device->addButton(BUTTON_UP_DOWN, + int(steering_accel_x), int(steering_accel_y), + int(btn2_size / 2), int(btn2_size)); + } + else + { + m_device->addButton(BUTTON_STEERING, + int(steering_wheel_x), int(steering_wheel_y), + int(btn2_size), int(btn2_size)); } + + m_device->addButton(BUTTON_ESCAPE, + int(margin_top), int(margin_small), + int(btn_small_size), int(btn_small_size)); + m_device->addButton(BUTTON_RESCUE, + int(margin_top + col_small_size), int(margin_small), + int(btn_small_size), int(btn_small_size)); + m_device->addButton(BUTTON_NITRO, + int(second_column_x), int(h - 2 * col_size), + int(btn_size), int(btn_size)); + m_device->addButton(BUTTON_SKIDDING, + int(second_column_x), int(h - 1 * col_size), + int(btn_size), int(btn_size)); + m_device->addButton(BUTTON_FIRE, + int(first_column_x), int(h - 2 * col_size), + int(btn_size), int(btn_size)); + m_device->addButton(BUTTON_LOOK_BACKWARDS, + int(first_column_x), int(h - 1 * col_size), + int(btn_size), int(btn_size)); } // createRaceGUI +//----------------------------------------------------------------------------- +/** Determines the look of multitouch watching GUI interface (for replay watching) + */ +void RaceGUIMultitouch::createWatchingGUI() +{ + if (m_device == NULL) + return; + + const float scale = UserConfigParams::m_multitouch_scale; + + const int h = irr_driver->getActualScreenSize().Height; + const float btn_size = 0.125f * h * scale; + const float margin = 0.075f * h * scale; + const float margin_top = 0.3f * h; + + const float small_ratio = 0.75f; + const float btn_small_size = small_ratio * btn_size; + const float margin_small = small_ratio * margin; + + m_height = (unsigned int)(btn_size + 2 * margin); + + m_device->addButton(BUTTON_ESCAPE, + int(margin_top), int(margin_small), + int(btn_small_size), int(btn_small_size)); +} // createWatchingGUI + //----------------------------------------------------------------------------- /** Determines the look of spectator GUI interface */ @@ -369,7 +390,8 @@ void RaceGUIMultitouch::onCustomButtonPress(unsigned int button_id, */ void RaceGUIMultitouch::draw(const AbstractKart* kart, const core::recti &viewport, - const core::vector2df &scaling) + const core::vector2df &scaling, + float dt) { #ifndef SERVER_ONLY if (m_device == NULL) @@ -563,6 +585,10 @@ void RaceGUIMultitouch::draw(const AbstractKart* kart, font->setScale(1.0f); font->setBlackBorder(false); } + if (m_is_watching_replay) + { + m_race_gui->drawSpeedEnergyRank(kart, viewport, scaling, dt); + } } } #endif diff --git a/src/states_screens/race_gui_multitouch.hpp b/src/states_screens/race_gui_multitouch.hpp index 851b3c62e73..0841fdc80f1 100644 --- a/src/states_screens/race_gui_multitouch.hpp +++ b/src/states_screens/race_gui_multitouch.hpp @@ -67,6 +67,7 @@ class RaceGUIMultitouch void init(); void createRaceGUI(); + void createWatchingGUI(); void createSpectatorGUI(); void close(); static void onCustomButtonPress(unsigned int button_id, bool pressed); @@ -76,7 +77,7 @@ class RaceGUIMultitouch ~RaceGUIMultitouch(); void draw(const AbstractKart* kart, const core::recti &viewport, - const core::vector2df &scaling); + const core::vector2df &scaling, float dt); unsigned int getHeight() {return m_height;} bool isSpectatorMode() {return m_is_spectator_mode;}