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:
parent
22ebbe136a
commit
326eeca306
12 changed files with 339 additions and 121 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue