1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Android: Replace movement buttons with joystick (#7126)

* Android: Replace movement buttons with joystick

Replace movement control buttons (arrows at bottom left screen) with virtual joystick.
Joystick has 8 directions (same as keyboard). Basically, just map it to keyboard input.
Joystick applies only on left 1/3 of screen.
Joystick's position can be fixed by enabling fixed_virtual_joystick setting.
Three new images:
(1) placeholder joystick,
(2) joystick container (background), and
(3) joystick cursor.
Remove unused images: movement control buttons (*_arrow.png).
New data type: touch_gui_joystick_move_id

Joystick's fixed position is spaced one button size from bottom and from left of screen.
Remove unused variable: m_joystick_downlocation
This commit is contained in:
Muhammad Rifqi Priyo Susanto 2018-04-11 03:55:17 +07:00 committed by SmallJoker
parent 22ebbe136a
commit 326eeca306
12 changed files with 339 additions and 121 deletions

View file

@ -34,11 +34,7 @@ using namespace irr::core;
using namespace irr::gui;
typedef enum {
forward_id = 0,
backward_id,
left_id,
right_id,
jump_id,
jump_id = 0,
crunch_id,
after_last_element_id,
settings_starter_id,
@ -51,9 +47,18 @@ typedef enum {
range_id,
chat_id,
inventory_id,
drop_id
drop_id,
forward_id,
backward_id,
left_id,
right_id,
joystick_off_id,
joystick_bg_id,
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 {
AHBB_Dir_Top_Bottom,
AHBB_Dir_Bottom_Top,
@ -69,6 +74,7 @@ typedef enum {
#define RARE_CONTROLS_BAR_Y_OFFSET 4
extern const char **touchgui_button_imagenames;
extern const char **touchgui_joystick_imagenames;
struct button_info
{
@ -91,26 +97,26 @@ public:
~AutoHideButtonBar();
/* add button to be shown */
// add button to be shown
void addButton(touch_gui_button_id id, const wchar_t *caption,
const char *btn_image);
/* detect settings bar button events */
// detect settings bar button events
bool isButton(const SEvent &event);
/* handle released hud buttons */
// handle released hud buttons
bool isReleaseButton(int eventID);
/* step handler */
// step handler
void step(float dtime);
/* deactivate button bar */
// deactivate button bar
void deactivate();
/* hide the whole buttonbar */
// hide the whole buttonbar
void hide();
/* unhide the buttonbar */
// unhide the buttonbar
void show();
private:
@ -124,12 +130,12 @@ private:
v2s32 m_upper_left;
v2s32 m_lower_right;
/* show settings bar */
// show settings bar
bool m_active = false;
bool m_visible = true;
/* settings bar timeout */
// settings bar timeout
float m_timeout = 0.0f;
float m_timeout_value = 3.0f;
bool m_initialized = false;
@ -179,14 +185,20 @@ private:
IEventReceiver *m_receiver;
ISimpleTextureSource *m_texturesource;
v2u32 m_screensize;
double m_touchscreen_threshold;
std::map<int, rect<s32>> m_hud_rects;
std::map<int, irr::EKEY_CODE> m_hud_ids;
bool m_visible; // is the gui visible
/* value in degree */
// value in degree
double m_camera_yaw_change = 0.0;
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};
/*!
* A line starting at the camera and pointing towards the
* selected object.
@ -201,22 +213,33 @@ private:
bool m_move_sent_as_mouse_event = false;
v2s32 m_move_downlocation = v2s32(-10000, -10000);
int m_joystick_id = -1;
bool m_joystick_has_really_moved = false;
bool m_fixed_joystick = false;
button_info *m_joystick_btn_off = nullptr;
button_info *m_joystick_btn_bg = nullptr;
button_info *m_joystick_btn_center = nullptr;
button_info m_buttons[after_last_element_id];
/* gui button detection */
// gui button detection
touch_gui_button_id getButtonID(s32 x, s32 y);
/* gui button by eventID */
// gui button by eventID
touch_gui_button_id getButtonID(int eventID);
/* check if a button has changed */
// check if a button has changed
void handleChangedButton(const SEvent &event);
/* initialize a button */
// initialize a button
void initButton(touch_gui_button_id id, rect<s32> button_rect,
std::wstring caption, bool immediate_release,
float repeat_delay = BUTTON_REPEAT_DELAY);
// initialize a joystick button
button_info *initJoystickButton(touch_gui_button_id id, rect<s32> button_rect,
int texture_id, bool visible = true);
struct id_status
{
int id;
@ -224,28 +247,31 @@ private:
int Y;
};
/* vector to store known ids and their initial touch positions*/
// vector to store known ids and their initial touch positions
std::vector<id_status> m_known_ids;
/* handle a button event */
// handle a button event
void handleButtonEvent(touch_gui_button_id bID, int eventID, bool action);
/* handle pressed hud buttons */
// handle pressed hud buttons
bool isHUDButton(const SEvent &event);
/* handle released hud buttons */
// handle released hud buttons
bool isReleaseHUDButton(int eventID);
/* handle double taps */
// handle double taps
bool doubleTapDetection();
/* handle release event */
// handle release event
void handleReleaseEvent(int evt_id);
/* get size of regular gui control button */
// apply joystick status
void applyJoystickStatus();
// get size of regular gui control button
int getGuiButtonSize();
/* doubleclick detection variables */
// doubleclick detection variables
struct key_event
{
unsigned int down_time;
@ -253,16 +279,16 @@ private:
s32 y;
};
/* array for saving last known position of a pointer */
// array for saving last known position of a pointer
v2s32 m_pointerpos[MAX_TOUCH_COUNT];
/* array for doubletap detection */
// array for doubletap detection
key_event m_key_events[2];
/* settings bar */
// settings bar
AutoHideButtonBar m_settingsbar;
/* rare controls bar */
// rare controls bar
AutoHideButtonBar m_rarecontrolsbar;
};
extern TouchScreenGUI *g_touchscreengui;