Place nodes with single tap on Android (+ bugfix) (#13187)

Don't place nodes when closing button bars.
Update docs (also in-game).
Rename "Default controls" -> "Controls" in Android pause menu since players can't change them (normally), so calling them "default" doesn't make sense.
This commit is contained in:
Gregor Parzefall 2023-05-29 07:30:30 +02:00 committed by GitHub
parent 6832bf044e
commit fc3d6c1dd9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 23 additions and 56 deletions

@ -1,5 +1,3 @@
**This document is based on the Minetest 5.6.1 version for Android**
# Minetest Android build # Minetest Android build
All Minetest builds, including the Android variant, are based on the same code. All Minetest builds, including the Android variant, are based on the same code.
However, additional Java code is used for proper Android integration. However, additional Java code is used for proper Android integration.
@ -11,8 +9,8 @@ due to limited capabilities of common devices. What can be done is described bel
While you're playing the game normally (that is, no menu or inventory is While you're playing the game normally (that is, no menu or inventory is
shown), the following controls are available: shown), the following controls are available:
* Look around: touch screen and slide finger * Look around: touch screen and slide finger
* Double tap: Place a node * Tap: Place a node
* Long tap: Dig node or use the holding item * Long tap: Dig node or use the held item
* Press back: Pause menu * Press back: Pause menu
* Touch buttons: Press button * Touch buttons: Press button
* Buttons: * Buttons:
@ -33,9 +31,8 @@ When a menu or inventory is displayed:
--> places a single item from dragged stack into current (first touched) slot. If a stack is selected, the stack will be split as half and one of the splitted stack will be selected --> places a single item from dragged stack into current (first touched) slot. If a stack is selected, the stack will be split as half and one of the splitted stack will be selected
### Limitations ### Limitations
* Android player have to double tap to place node, this can be annoying in some game/mod
* Some old Android device only support 2 touch at a time, some game/mod contain button combination that need 3 touch (example: jump + Aux1 + hold) * Some old Android device only support 2 touch at a time, some game/mod contain button combination that need 3 touch (example: jump + Aux1 + hold)
* Complicated control like pick up an cart in MTG can be difficult or impossible on Android device * Complicated control can be difficult or impossible on Android device
## File Path ## File Path
There are some settings especially useful for Android users. The Minetest-wide There are some settings especially useful for Android users. The Minetest-wide

@ -4335,14 +4335,14 @@ void Game::showDeathFormspec()
void Game::showPauseMenu() void Game::showPauseMenu()
{ {
#ifdef HAVE_TOUCHSCREENGUI #ifdef HAVE_TOUCHSCREENGUI
static const std::string control_text = strgettext("Default Controls:\n" static const std::string control_text = strgettext("Controls:\n"
"No menu visible:\n" "No menu open:\n"
"- single tap: button activate\n"
"- double tap: place/use\n"
"- slide finger: look around\n" "- slide finger: look around\n"
"Menu/Inventory visible:\n" "- tap: place/use\n"
"- long tap: dig/punch/use\n"
"Menu/inventory open:\n"
"- double tap (outside):\n" "- double tap (outside):\n"
" -->close\n" " --> close\n"
"- touch stack, touch slot:\n" "- touch stack, touch slot:\n"
" --> move stack\n" " --> move stack\n"
"- touch&drag, tap 2nd finger\n" "- touch&drag, tap 2nd finger\n"

@ -692,9 +692,8 @@ void TouchScreenGUI::handleReleaseEvent(size_t evt_id)
} }
m_receiver->OnEvent(*translated); m_receiver->OnEvent(*translated);
delete translated; delete translated;
} else { } else if (!m_move_has_really_moved) {
// do double tap detection doRightClick();
doubleTapDetection();
} }
} }
@ -773,8 +772,11 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
// already handled in isSettingsBarButton() // already handled in isSettingsBarButton()
} else { } else {
// handle non button events // handle non button events
m_settingsbar.deactivate(); if (m_settingsbar.active() || m_rarecontrolsbar.active()) {
m_rarecontrolsbar.deactivate(); m_settingsbar.deactivate();
m_rarecontrolsbar.deactivate();
return;
}
s32 dxj = event.TouchInput.X - button_size * 5.0f / 2.0f; s32 dxj = event.TouchInput.X - button_size * 5.0f / 2.0f;
s32 dyj = event.TouchInput.Y - (s32)m_screensize.Y + button_size * 5.0f / 2.0f; s32 dyj = event.TouchInput.Y - (s32)m_screensize.Y + button_size * 5.0f / 2.0f;
@ -999,29 +1001,9 @@ void TouchScreenGUI::handleChangedButton(const SEvent &event)
event.TouchInput.ID, true); event.TouchInput.ID, true);
} }
bool TouchScreenGUI::doubleTapDetection() bool TouchScreenGUI::doRightClick()
{ {
m_key_events[0].down_time = m_key_events[1].down_time; v2s32 mPos = v2s32(m_move_downlocation.X, m_move_downlocation.Y);
m_key_events[0].x = m_key_events[1].x;
m_key_events[0].y = m_key_events[1].y;
m_key_events[1].down_time = m_move_downtime;
m_key_events[1].x = m_move_downlocation.X;
m_key_events[1].y = m_move_downlocation.Y;
u64 delta = porting::getDeltaMs(m_key_events[0].down_time, porting::getTimeMs());
if (delta > 400)
return false;
double distance = sqrt(
(m_key_events[0].x - m_key_events[1].x) *
(m_key_events[0].x - m_key_events[1].x) +
(m_key_events[0].y - m_key_events[1].y) *
(m_key_events[0].y - m_key_events[1].y));
if (distance > (20 + m_touchscreen_threshold))
return false;
v2s32 mPos = v2s32(m_key_events[0].x, m_key_events[0].y);
if (m_draw_crosshair) { if (m_draw_crosshair) {
mPos.X = m_screensize.X / 2; mPos.X = m_screensize.X / 2;
mPos.Y = m_screensize.Y / 2; mPos.Y = m_screensize.Y / 2;
@ -1111,10 +1093,6 @@ void TouchScreenGUI::step(float dtime)
if (!button.ids.empty()) { if (!button.ids.empty()) {
button.repeatcounter += dtime; button.repeatcounter += dtime;
// in case we're moving around digging does not happen
if (m_has_move_id)
m_move_has_really_moved = true;
if (button.repeatcounter < button.repeatdelay) if (button.repeatcounter < button.repeatdelay)
continue; continue;

@ -130,6 +130,9 @@ public:
// step handler // step handler
void step(float dtime); void step(float dtime);
// return whether the button bar is active
bool active() { return m_active; }
// deactivate button bar // deactivate button bar
void deactivate(); void deactivate();
@ -284,8 +287,8 @@ private:
// handle pressed hud buttons // handle pressed hud buttons
bool isHUDButton(const SEvent &event); bool isHUDButton(const SEvent &event);
// handle double taps // do a right-click
bool doubleTapDetection(); bool doRightClick();
// handle release event // handle release event
void handleReleaseEvent(size_t evt_id); void handleReleaseEvent(size_t evt_id);
@ -293,20 +296,9 @@ private:
// apply joystick status // apply joystick status
void applyJoystickStatus(); void applyJoystickStatus();
// double-click detection variables
struct key_event
{
u64 down_time;
s32 x;
s32 y;
};
// array for saving last known position of a pointer // array for saving last known position of a pointer
std::map<size_t, v2s32> m_pointerpos; std::map<size_t, v2s32> m_pointerpos;
// array for double tap detection
key_event m_key_events[2];
// settings bar // settings bar
AutoHideButtonBar m_settingsbar; AutoHideButtonBar m_settingsbar;