From c4e71a602a970afe71efeef0ae0fa54a5c21665f Mon Sep 17 00:00:00 2001 From: MoNTE48 Date: Fri, 17 Jan 2020 22:59:51 +0100 Subject: [PATCH] TouchScreenGUI: update, add camera button --- src/game.cpp | 7 -- src/touchscreengui.cpp | 181 ++++++++++++++++---------------- src/touchscreengui.h | 6 +- textures/base/camera_btn.png | Bin 0 -> 337 bytes textures/base/chat_btn.png | Bin 293 -> 278 bytes textures/base/empty_btn.png | Bin 210 -> 221 bytes textures/base/escape_btn.png | Bin 242 -> 245 bytes textures/base/minimap_btn.png | Bin 427 -> 351 bytes textures/base/rangeview_btn.png | Bin 392 -> 377 bytes 9 files changed, 91 insertions(+), 103 deletions(-) create mode 100755 textures/base/camera_btn.png mode change 100644 => 100755 textures/base/chat_btn.png mode change 100644 => 100755 textures/base/empty_btn.png mode change 100644 => 100755 textures/base/escape_btn.png mode change 100644 => 100755 textures/base/minimap_btn.png mode change 100644 => 100755 textures/base/rangeview_btn.png diff --git a/src/game.cpp b/src/game.cpp index 3e9924d6..b8207554 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -2013,11 +2013,6 @@ bool Game::createClient(const std::string &playername, return false; } -//#ifdef __IOS__ -// mapper->setMinimapMode(MINIMAP_MODE_SURFACE); -//#else -// mapper->setMinimapMode(MINIMAP_MODE_OFF); -//#endif mapper = client->getMinimap(); if (mapper) mapper->setMinimapMode(MINIMAP_MODE_OFF); @@ -2083,10 +2078,8 @@ bool Game::initGui() guitext_profiler->setWordWrap(true); #ifdef HAVE_TOUCHSCREENGUI - if (g_touchscreengui) g_touchscreengui->init(texture_src); - #endif return true; diff --git a/src/touchscreengui.cpp b/src/touchscreengui.cpp index 1cbb0149..8ec967d5 100644 --- a/src/touchscreengui.cpp +++ b/src/touchscreengui.cpp @@ -46,10 +46,10 @@ const char *touchgui_button_imagenames[][2] = { {"escape_btn.png"}, {"minimap_btn.png"}, {"rangeview_btn.png"}, + {"camera_btn.png"}, {"chat_btn.png"} -/* {"noclip_btn.png"}, - {"fast_btn.png"}, - {"camera_btn.png"} */ +// {"noclip_btn.png"}, +// {"fast_btn.png"} }; static irr::EKEY_CODE id2keycode(touch_gui_button_id id) { @@ -102,17 +102,17 @@ static irr::EKEY_CODE id2keycode(touch_gui_button_id id) { case range_id: key = "rangeselect"; break; + case camera_id: + key = "camera_mode"; + break; case chat_id: key = "chat"; break; /* case noclip_id: - key = "noclip"; - break; - case fast_id: - key = "fast"; - break; - case camera_id: - key = "camera_mode"; + key = "noclip"; + break; + case fast_id: + key = "fast"; break; */ case after_last_element_id: break; @@ -196,7 +196,6 @@ void TouchScreenGUI::initButton(touch_gui_button_id id, rect button_rect, btn->immediate_release = immediate_release; btn->ids.clear(); - load_button_texture(btn, id, button_rect, m_texturesource, m_device->getVideoDriver()); } @@ -204,15 +203,13 @@ void TouchScreenGUI::initButton(touch_gui_button_id id, rect button_rect, void TouchScreenGUI::init(ISimpleTextureSource *tsrc) { assert(tsrc != nullptr); - double control_pad_size = - MYMIN(m_screensize.Y / 1.5, - porting::getDisplayDensity() * g_settings->getFloat("hud_scaling") * 260); - - s32 button_size = static_cast(control_pad_size / 3); - m_visible = true; - m_texturesource = tsrc; - m_control_pad_rect = rect(0, static_cast(m_screensize.Y - control_pad_size), - static_cast(control_pad_size), m_screensize.Y); + float density = porting::getDisplayDensity() * g_settings->getFloat("hud_scaling"); + s32 button_size = static_cast(density * 60); + s32 ctlpad_size = static_cast(density * 85); + m_visible = true; + m_texturesource = tsrc; + m_control_pad_rect = rect(0, (m_screensize.Y - ctlpad_size * 3), + (ctlpad_size * 3), m_screensize.Y); /* draw control pad @@ -225,10 +222,10 @@ void TouchScreenGUI::init(ISimpleTextureSource *tsrc) { for (int y = 0; y < 3; ++y) for (int x = 0; x < 3; ++x, ++number) { v2s32 tl; - tl.X = button_size * y; - tl.Y = m_screensize.Y - button_size * (3 - x); + tl.X = ctlpad_size * y; + tl.Y = m_screensize.Y - ctlpad_size * (3 - x); - rect button_rect(tl.X, tl.Y, tl.X + button_size, tl.Y + button_size); + rect button_rect(tl.X, tl.Y, tl.X + ctlpad_size, tl.Y + ctlpad_size); touch_gui_button_id id = after_last_element_id; std::wstring caption; switch (number) { @@ -270,77 +267,94 @@ void TouchScreenGUI::init(ISimpleTextureSource *tsrc) { default: break; } - if (id != after_last_element_id) { + if (id != after_last_element_id) initButton(id, button_rect, caption, false); - } } // init inventory button initButton(inventory_id, - rect(m_screensize.X - button_size, - m_screensize.Y - button_size, + rect(m_screensize.X - button_size * 1.5, + m_screensize.Y - button_size * 1.5, m_screensize.X, m_screensize.Y), L"inv", false, SLOW_BUTTON_REPEAT); - // init drop button - initButton(drop_id, - rect(m_screensize.X - button_size * 0.75, - m_screensize.Y / 2 - button_size * 1.5, - m_screensize.X, - m_screensize.Y / 2 - button_size * 0.75), - L"drop", false, SLOW_BUTTON_REPEAT); - // init crunch button initButton(crunch_id, - rect(m_screensize.X - button_size * 2, - m_screensize.Y - button_size / 2, - m_screensize.X - button_size, + rect(m_screensize.X - button_size * 3, + m_screensize.Y - button_size / 1.5, + m_screensize.X - button_size * 1.5, m_screensize.Y), L"H", false, SLOW_BUTTON_REPEAT); // init jump button initButton(jump_id, - rect(m_screensize.X - button_size * 2, - m_screensize.Y - button_size * 2, - m_screensize.X - button_size, - m_screensize.Y - button_size), + rect(m_screensize.X - button_size * 3, + m_screensize.Y - button_size * 3, + m_screensize.X - button_size * 1.5, + m_screensize.Y - button_size * 1.5), L"x", false, SLOW_BUTTON_REPEAT); -// iOS does not have a physical pause button and have memory leak with minimap + // init drop button + initButton(drop_id, + rect(m_screensize.X - button_size, + m_screensize.Y / 2 - button_size, + m_screensize.X, + m_screensize.Y / 2), + L"drop", false, SLOW_BUTTON_REPEAT); + + //dirty implementation of positions for iOS + double button_075 = 1; + double button_05 = 1; + double button_05b = 0; #ifdef __IOS__ - // init pause button + button_075 = 0.75; + button_05 = 2; + button_05b = button_size / 2; +#endif + + // init pause button [1] initButton(escape_id, - rect(m_screensize.X / 2 - button_size * 1.125, + rect(m_screensize.X / 2 - button_size * 2 * button_075, 0, - m_screensize.X / 2 - button_size * 0.375, - button_size * 0.75), + m_screensize.X / 2 - button_size / button_05, + button_size), L"Exit", false, SLOW_BUTTON_REPEAT); -#else - // init minimap button + // init minimap button [2] +#ifndef __IOS__ + // iOS have memory leak with enabled minimap initButton(minimap_id, - rect(m_screensize.X / 2 - button_size * 1.125, + rect(m_screensize.X / 2 - button_size, 0, - m_screensize.X / 2 - button_size * 0.375, - button_size * 0.75), + m_screensize.X / 2, + button_size), L"minimap", false, SLOW_BUTTON_REPEAT); #endif - // init rangeselect button + + // init rangeselect button [3] initButton(range_id, - rect(m_screensize.X / 2 - (button_size * 0.375), - 0, - m_screensize.X / 2 + (button_size * 0.375), - button_size * 0.75), + rect(m_screensize.X / 2 - button_05b, + 0, + m_screensize.X / 2 + button_size / button_05, + button_size), L"far", false, SLOW_BUTTON_REPEAT); + // init camera button [4] + initButton(camera_id, + rect(m_screensize.X / 2 + button_size / button_05, + 0, + m_screensize.X / 2 + button_size * 2 * button_075, + button_size), + L"cam", false, SLOW_BUTTON_REPEAT); + // init chat button initButton(chat_id, - rect(m_screensize.X / 2 + (button_size * 0.375), + rect(m_screensize.X - button_size * 1.25, 0, - m_screensize.X / 2 + (button_size * 1.125), - button_size * 0.75), - L"Chat", false, SLOW_BUTTON_REPEAT); + m_screensize.X, + button_size), + L"far", false, SLOW_BUTTON_REPEAT); // init noclip button /* initButton(noclip_id, @@ -355,15 +369,7 @@ void TouchScreenGUI::init(ISimpleTextureSource *tsrc) { m_screensize.Y - button_size * 4, m_screensize.X, m_screensize.Y - button_size * 3.25), - L"fast", false, SLOW_BUTTON_REPEAT); - - // init camera button - initButton(camera_id, - rect(0, - 0, - button_size * 0.75, - button_size * 0.75), - L"cam", false, SLOW_BUTTON_REPEAT); */ + L"fast", false, SLOW_BUTTON_REPEAT); */ } touch_gui_button_id TouchScreenGUI::getButtonID(s32 x, s32 y) { @@ -375,9 +381,8 @@ touch_gui_button_id TouchScreenGUI::getButtonID(s32 x, s32 y) { if (element) { for (unsigned int i = 0; i < after_last_element_id; i++) { - if (element == m_buttons[i].guibutton) { + if (element == m_buttons[i].guibutton) return (touch_gui_button_id) i; - } } } } @@ -451,8 +456,7 @@ void TouchScreenGUI::handleButtonEvent(touch_gui_button_id button, m_receiver->OnEvent(*translated); } // remove event - if ((!action) || (btn->immediate_release)) { - + if (!action || btn->immediate_release) { std::vector::iterator pos = std::find(btn->ids.begin(),btn->ids.end(), eventID); // has to be in touch list @@ -474,11 +478,11 @@ void TouchScreenGUI::handleReleaseEvent(size_t evt_id) { touch_gui_button_id button = getButtonID(evt_id); // handle button events - if (button != after_last_element_id) { + if (button != after_last_element_id) handleButtonEvent(button, evt_id, false); - } + // handle the point used for moving view - else if (evt_id == m_move_id) { + if (evt_id == m_move_id) { m_move_id = -1; // if this pointer issued a mouse event issue symmetric release here @@ -527,9 +531,9 @@ void TouchScreenGUI::handleReleaseEvent(size_t evt_id) { void TouchScreenGUI::handleReleaseAll() { m_known_ids.clear(); - if(m_move_id != -1) + if (m_move_id != -1) handleReleaseEvent(m_move_id); - for(int i = 0; i < after_last_element_id; i++) + for (int i = 0; i < after_last_element_id; i++) m_buttons[i].ids.clear(); } @@ -543,7 +547,6 @@ void TouchScreenGUI::translateEvent(const SEvent &event) { return; if (event.TouchInput.Event == ETIE_PRESSED_DOWN) { - /* add to own copy of eventlist ... * android would provide this information but irrlicht guys don't * wanna design a efficient interface */ @@ -561,9 +564,8 @@ void TouchScreenGUI::translateEvent(const SEvent &event) { // handle button events if (button != after_last_element_id) { handleButtonEvent(button, eventID, true); - } else if (m_control_pad_rect.isPointInside(v2s32(toadd.X, toadd.Y)) || (isHUDButton(event))) { - // ignore events inside the control pad not already handled - } else { + // ignore events inside the control pad and HUD if not already handled + } else if (!(m_control_pad_rect.isPointInside(v2s32(toadd.X, toadd.Y)) || isHUDButton(event))) { // handle non button events // if we don't already have a moving point make this the moving one if (m_move_id == -1) { @@ -614,7 +616,7 @@ void TouchScreenGUI::translateEvent(const SEvent &event) { (m_pointerpos[event.TouchInput.ID].Y - event.TouchInput.Y) * (m_pointerpos[event.TouchInput.ID].Y - event.TouchInput.Y)); - if ((distance > g_settings->getU16("touchscreen_threshold")) || + if (distance > g_settings->getU16("touchscreen_threshold") || (m_move_has_really_moved)) { m_move_has_really_moved = true; s32 X = event.TouchInput.X; @@ -653,15 +655,12 @@ void TouchScreenGUI::translateEvent(const SEvent &event) { void TouchScreenGUI::handleChangedButton(const SEvent &event) { for (unsigned int i = 0; i < after_last_element_id; i++) { - if (m_buttons[i].ids.empty()) continue; for (std::vector::iterator iter = m_buttons[i].ids.begin(); iter != m_buttons[i].ids.end(); ++iter) { - if (event.TouchInput.ID == *iter) { - int current_button_id = getButtonID(event.TouchInput.X, event.TouchInput.Y); @@ -676,7 +675,6 @@ void TouchScreenGUI::handleChangedButton(const SEvent &event) { handleButtonEvent((touch_gui_button_id) current_button_id, *iter, true); return; - } } } @@ -688,10 +686,9 @@ void TouchScreenGUI::handleChangedButton(const SEvent &event) { button_info *btn = &m_buttons[current_button_id]; if (std::find(btn->ids.begin(), btn->ids.end(), event.TouchInput.ID) - == btn->ids.end()) { + == btn->ids.end()) handleButtonEvent((touch_gui_button_id) current_button_id, event.TouchInput.ID, true); - } } // Punch or left click @@ -769,7 +766,6 @@ void TouchScreenGUI::step(float dtime) { if ((m_move_id != -1) && (!m_move_has_really_moved) && (!m_move_sent_as_mouse_event)) { - u64 delta = porting::getDeltaMs(m_move_downtime, porting::getTimeMs()); if (delta > (MIN_DIG_TIME * 1000.F)) { @@ -807,9 +803,8 @@ void TouchScreenGUI::Toggle(bool visible) { m_visible = visible; for (unsigned int i = 0; i < after_last_element_id; i++) { button_info *btn = &m_buttons[i]; - if (btn->guibutton != nullptr) { + if (btn->guibutton != nullptr) btn->guibutton->setVisible(visible); - } } // clear all active buttons diff --git a/src/touchscreengui.h b/src/touchscreengui.h index a7d18afe..bc6f0135 100644 --- a/src/touchscreengui.h +++ b/src/touchscreengui.h @@ -51,10 +51,10 @@ typedef enum { escape_id, minimap_id, range_id, + camera_id, chat_id, -/* noclip_id, - fast_id, - camera_id, */ +// noclip_id, +// fast_id, after_last_element_id } touch_gui_button_id; diff --git a/textures/base/camera_btn.png b/textures/base/camera_btn.png new file mode 100755 index 0000000000000000000000000000000000000000..208bbe83ff4aeffba8bf83fe7f108b03a96ed1bc GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e#Q>iWS6yQ*TU%Rsd3m6~^5x5c zWJ*d3P^6=ykm8{{Mg7?FsKD0fn!4x;TbZFuuKP zSju83(3}_?!R7r>qoYZKhc!@wYni~5%Iuvb@6P7PZvB5ftLOFUV}C0-k4fy_&m{Kl z{lTwX2X@)NcFL>RICWbQ&iHUVQK#}F1E{-7;x89y=WId9=ct!7cLFWP5f@uHc1f9~emm8BIeCYvwKh~#ctBWv6ANTspvnMm83#4oMy zwzJH2xS{Hp{=sTVHp|tOZw?11Y+;K3;gs@_O+Yh`W#R=50iN$NY^vq%_jt@2G@rb! zVbk?){KnGdbD_#$N#~a*zYIbq?Y`3Fkr6A;wzm1(!}AM@H58u*Je67XM|?@@55`$b V4oM0+Y2||avd$@?2>{qRYApZ& literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|el>na*S6f?KU1KeIdHMffuzdM) zpbQ*LowEWc;#k!1g=F1AabDq5EcDg+}T}hBk6h8^!sexZ?gX<1!ePfocJ@D!LVNaLRp_N zOUQ4bBX#NzkP47rNYO<~x{jSnE0dbjUGra7>(g*T;@yo%&+=Dsb8D W$^9W_&{ezvk1awkPQ<<~O0Mm>RzW@LLd`Uz>RCocL$N>gJ zK@5h$2f1J1gWN9=*!wM{tY};Q!VX}b!vOplA{c)Ih^m|sVNk1k7q||nJ_=+Q(Iasc zuzGBe5&f1bjP;3)Uq$qn6v1zB6|aG8Mc6yE1t<>>!l6!$xGW`{f(WNV!YP?>ZXlea h2RzW@LLaY;l$RCr$1(<>6d zFbD+D8t#W#!~HNZxnE4$VfqsxJJX5jI-Z1OTNeRz3W!Vquu>dIL14A_=Fkjc4oN_8 z%puS*!1@_S0`-D626=-H!TKHl2&fM<{1{g3gKwQ)j$fZQh#|I+H<^9|{V4vG%d!KL WAlTs3D*dYf0000aXV8z$z%q%<*Stp?fkzz2LQ7ja+x4g|E$PyvKM!*uYGJQ%L0prvj_DG+Tc} zleHA9!0&Z)^%xTM8FCC`85T{lm1o!(KIg&jBJ*t7&RYWU`;J920D-5gpUXO@geCwr CXgT!& delta 148 zcmV;F0BisC0rCNmW`B1{L_t(|UhT?34Zt7_Mqw;qp%!ML7O;SYS(pVZROPa~bSJV< zxa`1xc}e@Fl(HNj8vrguWEvp&s{&{Y@HbO$03f)RV(Og(wF2l2I05trV1o@d5C_d0 z29IdQokjtI``c>>AUcZySpbME{fz-ge*v(zy&Lb;g}kKmIt>y40000!+uu z0000000960|LTzxMF0Q*40KXXQ<#FT=EA||^XBue0IdM#bN~PV*hxe|RCr$P)KLus zAq>Z1EX=}Ls0A$iEzCkK)B+aH!da+=dfBb%v3p{az3xW{B!7G_goIKa!?sCK3iYhU zYAK+%EY=ht#n}@K1{9uB7BIvIqXB3OK;XSmLz4x-=t&bS070)wgIdi3@aG&Z(m*aE zK9$lSNR$NCMG#&BW+CFm)4=o$JpojyWTK=2l6z#YUj(?EhSWDNxI<2<-O z6#&hH;^Ia%B!4YXOjJc5A0I6!+uu<@c310000FbW%=Ju9$)V>gNB#|H0<-=JT#h#~y$H00ACJL_t(| z0qxWwXv8oS2H^89aAJC}n`hqpLD%ZS?oJBqh>-prznW-ulP5`T%|z6h_06jfDsi~=mh=^olWdHyF z0002M>COZI000JbQchEtg3PY20ET_ZP7{a`|WtJk}zTL0w? zl)#T3y7~qvkyoo8-GS^wP=f59F+1UNP$G8}FqpFY9Q68Ky59umb|3tDmoa#qg!xy0 w-2nYAJK!X8-ACYh1Ms}w`)}~R-W2?U53wkCldsI&g8%>k07*qoM6N<$g3}_QKL7v# delta 365 zcmV-z0h0dt0*C{UB!4GROjJc5A0Pk!|2;iDEi)<~A0MZur>Cc<0000zJw0S(WQd4} zsi~>||NroM{we?f00(qZPE!B?f|#zZ%$EkQcK`qZ2}wjjRCr$P&_Q(rF${#^P$-3^ zuoOZe6hvVt3p)1s?8#9E(T$kbAr5710D;pS4pNa3X%uV#<1n3FVhHXE?EzCm z_IY-9Tff|DU}j6fv#+b615(6hA4eynS3wHk=n