From 7ebc229b0d2d59e367b8ba64a41535d79fdd4204 Mon Sep 17 00:00:00 2001 From: Muhammad Rifqi Priyo Susanto Date: Wed, 11 Jul 2018 05:33:40 +0700 Subject: [PATCH] Android: Add 'aux' button (#7477) Add 'aux' button. Use joystick to trigger 'aux' button when forward and out of main circle, by enabling 'virtual_joystick_triggers_aux' setting. --- builtin/settingtypes.txt | 4 ++++ src/defaultsettings.cpp | 1 + src/gui/touchscreengui.cpp | 30 ++++++++++++++++++++++++------ src/gui/touchscreengui.h | 16 ++++++++++++---- textures/base/pack/aux_btn.png | Bin 0 -> 1874 bytes 5 files changed, 41 insertions(+), 10 deletions(-) create mode 100755 textures/base/pack/aux_btn.png diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 0b0ec4a4c..125a962c0 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -126,6 +126,10 @@ touchscreen_threshold (Touch screen threshold) int 20 0 100 # If disabled, virtual joystick will center to first-touch's position. fixed_virtual_joystick (Fixed virtual joystick) bool false +# (Android) Use virtual joystick to trigger "aux" button. +# If enabled, virtual joystick will also tap "aux" button when out of main circle. +virtual_joystick_triggers_aux (Virtual joystick triggers aux button) bool false + # Enable joysticks enable_joysticks (Enable joysticks) bool false diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 8bcded9cd..277f56d2d 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -409,6 +409,7 @@ void set_default_settings(Settings *settings) settings->setDefault("TMPFolder","/sdcard/" PROJECT_NAME_C "/tmp/"); settings->setDefault("touchscreen_threshold","20"); settings->setDefault("fixed_virtual_joystick", "false"); + settings->setDefault("virtual_joystick_triggers_aux", "false"); settings->setDefault("smooth_lighting", "false"); settings->setDefault("max_simultaneous_block_sends_per_client", "3"); settings->setDefault("emergequeue_limit_diskonly", "8"); diff --git a/src/gui/touchscreengui.cpp b/src/gui/touchscreengui.cpp index 13a6a0799..6d07a4742 100644 --- a/src/gui/touchscreengui.cpp +++ b/src/gui/touchscreengui.cpp @@ -42,7 +42,8 @@ using namespace irr::core; const char **touchgui_button_imagenames = (const char *[]) { "jump_btn.png", "down.png", - "zoom.png" + "zoom.png", + "aux_btn.png" }; const char **touchgui_joystick_imagenames = (const char *[]) { @@ -82,6 +83,9 @@ static irr::EKEY_CODE id2keycode(touch_gui_button_id id) case zoom_id: key = "zoom"; break; + case special1_id: + key = "special1"; + break; case fly_id: key = "freemove"; break; @@ -454,6 +458,7 @@ TouchScreenGUI::TouchScreenGUI(IrrlichtDevice *device, IEventReceiver *receiver) m_touchscreen_threshold = g_settings->getU16("touchscreen_threshold"); m_fixed_joystick = g_settings->getBool("fixed_virtual_joystick"); + m_joystick_triggers_special1 = g_settings->getBool("virtual_joystick_triggers_aux"); m_screensize = m_device->getVideoDriver()->getScreenSize(); } @@ -555,11 +560,20 @@ void TouchScreenGUI::init(ISimpleTextureSource *tsrc) // init zoom button initButton(zoom_id, rect(m_screensize.X - (1.25 * button_size), - m_screensize.Y - (3 * button_size), + m_screensize.Y - (4 * button_size), m_screensize.X - (0.25 * button_size), - m_screensize.Y - (2 * button_size)), + m_screensize.Y - (3 * button_size)), L"z", false); + // init special1 button + if (!m_joystick_triggers_special1) + initButton(special1_id, + rect(m_screensize.X - (1.25 * button_size), + m_screensize.Y - (2.5 * button_size), + m_screensize.X - (0.25 * button_size), + m_screensize.Y - (1.5 * button_size)), + L"spc1", false); + m_settingsbar.init(m_texturesource, "gear_icon.png", settings_starter_id, v2s32(m_screensize.X - (button_size / 2), m_screensize.Y - ((SETTINGS_BAR_Y_OFFSET + 1) * button_size) @@ -973,7 +987,7 @@ void TouchScreenGUI::translateEvent(const SEvent &event) angle = fmod(angle + 180 + 22.5, 360); // reset state before applying - for (unsigned int i = 0; i < 4; i ++) + for (unsigned int i = 0; i < 5; i ++) m_joystick_status[i] = false; if (distance <= m_touchscreen_threshold) { @@ -1000,8 +1014,9 @@ void TouchScreenGUI::translateEvent(const SEvent &event) m_joystick_status[j_left] = true; } - // move joystick "button" if (distance > button_size) { + m_joystick_status[j_special1] = true; + // move joystick "button" s32 ndx = (s32) button_size * dx / distance - (s32) button_size / 2; s32 ndy = (s32) button_size * dy / distance - (s32) button_size / 2; if (m_fixed_joystick) { @@ -1125,7 +1140,10 @@ bool TouchScreenGUI::doubleTapDetection() void TouchScreenGUI::applyJoystickStatus() { - for (unsigned int i = 0; i < 4; i ++) { + for (unsigned int i = 0; i < 5; i ++) { + if (i == 4 && !m_joystick_triggers_special1) + continue; + SEvent translated{}; translated.EventType = irr::EET_KEY_INPUT_EVENT; translated.KeyInput.Key = id2keycode(m_joystick_names[i]); diff --git a/src/gui/touchscreengui.h b/src/gui/touchscreengui.h index d3ce84929..5102f188b 100644 --- a/src/gui/touchscreengui.h +++ b/src/gui/touchscreengui.h @@ -37,6 +37,7 @@ typedef enum { jump_id = 0, crunch_id, zoom_id, + special1_id, after_last_element_id, settings_starter_id, rare_controls_starter_id, @@ -60,7 +61,13 @@ typedef enum { joystick_center_id } touch_gui_button_id; -typedef enum { j_forward = 0, j_backward, j_left, j_right } touch_gui_joystick_move_id; +typedef enum { + j_forward = 0, + j_backward, + j_left, + j_right, + j_special1 +} touch_gui_joystick_move_id; typedef enum { AHBB_Dir_Top_Bottom, @@ -206,9 +213,9 @@ private: double m_camera_pitch = 0.0; // forward, backward, left, right - touch_gui_button_id m_joystick_names[4] = { - forward_id, backward_id, left_id, right_id}; - bool m_joystick_status[4] = {false, false, false, false}; + touch_gui_button_id m_joystick_names[5] = { + forward_id, backward_id, left_id, right_id, special1_id}; + bool m_joystick_status[5] = {false, false, false, false, false}; /*! * A line starting at the camera and pointing towards the @@ -227,6 +234,7 @@ private: int m_joystick_id = -1; bool m_joystick_has_really_moved = false; bool m_fixed_joystick = false; + bool m_joystick_triggers_special1 = false; button_info *m_joystick_btn_off = nullptr; button_info *m_joystick_btn_bg = nullptr; button_info *m_joystick_btn_center = nullptr; diff --git a/textures/base/pack/aux_btn.png b/textures/base/pack/aux_btn.png new file mode 100755 index 0000000000000000000000000000000000000000..0377e7a63043162bff972476c2ae2a45342fec77 GIT binary patch literal 1874 zcmb7F`9Is)8a}ZFDIfb*w5Tqq+N(O25~DX+0DzS9 zRU}rRZ{EcI1+JJed7T@$R7~~N=j7(COp9z?Fe5G zQqp0$fm`!x?$S z^XBaOoc}ciFBSMd4ze=muy-6^-@I+CcTqG)*5OpJtAc#5UC!q(3yKpexyneKVWtPh z%wx-u@)fBSZWNw#AzRLP=BzeqLJk*0Gx)281qG%MAx8hP8dV0njQ!UX^p)So8)IKu zB5l4bWi?`v{~r{hK>vz7nDNN_LTeen(G4t6%;TY&4IkBVjI+~bW8zO)&9^)yf)01x zYpj+Mt_4HxKZ5yfU!VE=blcW}!2XKqa(jr!XYPSMDCbxSV5N z=WR=DZF>{MEjen8iQjpFZIDTCM?0Ur2j&pgR z$xGvkvr<&j846a z$$UYl)1`oPvTbYh{wGUOyQHKf9WsMrF@w>HGL(ld363&^T;~N{@LY`EZGAKN)5f3Y zz?`QI9DKKJcI!D$S~oSF8=LL9)Dy9m-ubz08dr#QiAw7;3v@dr_kybc2r=o_M>PhU zPav3$xpQL`TXG^NSL)XSLr9lxV_*|(_9eA}D~iEhl}HVcS7R6*{Gow&LArkv~_moZAouH)b+m218@s{ zI$uXy6@U&z*|V`TKIMvc2&wAA18I;u{1FSC16zLMH?J}RCEYXTNLm#U&;`_DZ%Np4 zlRn-<0x;Mf<1fE7Wa)*DnGR|k;3+wu=@a7aOmi?hI|~UPR@X&|y zDA_YS;{;a?@Qn6iDth>o;l%zP(n{Ks3pKA+nmmEO3FN#@N-9~kZL%viK!_QSMgC!Bnu^I8hrbN*SK-!k6wgbErK#g^LV!Z zRtgD3@Z$G7+}>E-|5b1SuCDHxw@pSeoG*lq$$jYQry`enR`;3kvw-USglNw_{OMv0 zEmyhFr|6AAfP1Prf!$$^d$2LHl59MuFEXs-U<0bxQQM1_&>VpM)3e*l;c!+XNl(%8 zLhp;4KB`-%Y>@yw9sL+*eZ|E8YkxV(#x|m^mOq}3;5Uu7aCZHT>f<;aDY0c1L*M!2 zX>h4+(MLG( zHQ$gxZCYR6&;y#H$vDa$Keb0XT&R3-$WSm$#OD(Fbqc!A56I~2n(f4U)$o@nQI?vE zl(qmdSkv!Q0Sy0Q;gEOlOIgHLZeP9{508Cis6^jJPsK`@JaolT#Da86iv_QcINWB9 zunRoEac-6&H^GG%MP#w#w$*qYIIUvK1ZtDTl8+bhQGoe>gQbpBA{c8MAvG@J$BXgN|Qi9Q%96-|s}u76aEcV17f-f7YU0eB$4T>dWKSe0b=X z34L2ZFw62s7R3e9KAoRyjDnpaK@JaOMajALsuZJaf0u(Eg4-z4AKte~J0S61N8=M) z!s)TUSUvVJ2-G}jdj5XR-6y3PCLx?}8cg5!IA~O_bxpFu>G{HQH~tirb8rJP+NWeO z)SGm8LUGTApbhC(bl(_XSiO;06~&kw)>>)y&f|O4(c*U`%32>oS32xdvZYgQ*;G`B z1fM4d3{!1|gQI6uyG-~pEp