mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-12 17:17:09 -04:00
Mobile: When flying/noclip is enabled, change the 'jump' button to two separate 'up' and 'down' buttons
This commit is contained in:
parent
58a9b57e79
commit
e777be1e90
138
src/Screens.c
138
src/Screens.c
@ -1886,32 +1886,78 @@ void DisconnectScreen_Show(const cc_string* title, const cc_string* message) {
|
||||
*--------------------------------------------------------TouchScreen------------------------------------------------------*
|
||||
*#########################################################################################################################*/
|
||||
#ifdef CC_BUILD_TOUCH
|
||||
#define TOUCH_NUM_BTNS 3
|
||||
static struct TouchScreen {
|
||||
Screen_Body
|
||||
cc_uint8 binds[TOUCH_NUM_BTNS];
|
||||
struct FontDesc font;
|
||||
struct ThumbstickWidget thumbstick;
|
||||
struct ButtonWidget btns[TOUCH_NUM_BTNS];
|
||||
} TouchScreen;
|
||||
|
||||
static struct Widget* touch_widgets[4] = {
|
||||
(struct Widget*)&TouchScreen.thumbstick, (struct Widget*)&TouchScreen.btns[0],
|
||||
(struct Widget*)&TouchScreen.btns[1], (struct Widget*)&TouchScreen.btns[2]
|
||||
};
|
||||
#define TOUCH_MAX_VERTICES (THUMBSTICKWIDGET_MAX + TOUCH_NUM_BTNS * BUTTONWIDGET_MAX)
|
||||
|
||||
static const struct TouchBindDesc {
|
||||
#define TOUCH_MAX_BTNS 4
|
||||
struct TouchBindDesc {
|
||||
const char* text;
|
||||
cc_uint8 bind, width;
|
||||
cc_int16 x, y;
|
||||
MenuClick OnClick;
|
||||
} touchDescs[TOUCH_NUM_BTNS] = {
|
||||
{ "Jump", KEYBIND_JUMP, 100, 50, 90 },
|
||||
{ "", KEYBIND_COUNT, 100, 50, 50 },
|
||||
{ "More", KEYBIND_COUNT, 100, 50, 10 },
|
||||
Widget_LeftClick OnClick;
|
||||
};
|
||||
|
||||
static struct TouchScreen {
|
||||
Screen_Body
|
||||
const struct TouchBindDesc* descs;
|
||||
int numDescs;
|
||||
struct FontDesc font;
|
||||
struct ThumbstickWidget thumbstick;
|
||||
struct ButtonWidget btns[TOUCH_MAX_BTNS];
|
||||
} TouchScreen;
|
||||
|
||||
static struct Widget* touch_widgets[1 + TOUCH_MAX_BTNS] = {
|
||||
(struct Widget*)&TouchScreen.thumbstick, (struct Widget*)&TouchScreen.btns[0],
|
||||
(struct Widget*)&TouchScreen.btns[1], (struct Widget*)&TouchScreen.btns[2],
|
||||
(struct Widget*)&TouchScreen.btns[3]
|
||||
};
|
||||
#define TOUCH_MAX_VERTICES (THUMBSTICKWIDGET_MAX + TOUCH_MAX_BTNS * BUTTONWIDGET_MAX)
|
||||
|
||||
static void TouchScreen_UpdateModeText(void* screen);
|
||||
static void TouchScreen_ModeClick(void* s, void* w) {
|
||||
Input_Placing = !Input_Placing;
|
||||
TouchScreen_UpdateModeText(s);
|
||||
}
|
||||
static void TouchScreen_MoreClick(void* s, void* w) { TouchMoreScreen_Show(); }
|
||||
|
||||
static const struct TouchBindDesc normDescs[3] = {
|
||||
{ "Jump", KEYBIND_JUMP, 100, 50, 90, NULL },
|
||||
{ "", KEYBIND_COUNT, 100, 50, 50, TouchScreen_ModeClick },
|
||||
{ "More", KEYBIND_COUNT, 100, 50, 10, TouchScreen_MoreClick },
|
||||
};
|
||||
static const struct TouchBindDesc hackDescs[4] = {
|
||||
{ "Up", KEYBIND_FLY_UP, 100, 50, 130, NULL },
|
||||
{ "Down", KEYBIND_FLY_DOWN, 100, 50, 90, NULL },
|
||||
{ "", KEYBIND_COUNT, 100, 50, 50, TouchScreen_ModeClick },
|
||||
{ "More", KEYBIND_COUNT, 100, 50, 10, TouchScreen_MoreClick },
|
||||
};
|
||||
|
||||
static void TouchScreen_InitButtons(struct TouchScreen* s) {
|
||||
struct HacksComp* hacks = &LocalPlayer_Instance.Hacks;
|
||||
const struct TouchBindDesc* desc;
|
||||
int i;
|
||||
|
||||
if (hacks->Flying || hacks->Noclip) {
|
||||
s->descs = hackDescs;
|
||||
s->numDescs = Array_Elems(hackDescs);
|
||||
} else {
|
||||
s->descs = normDescs;
|
||||
s->numDescs = Array_Elems(normDescs);
|
||||
}
|
||||
s->numWidgets = 1 + s->numDescs;
|
||||
|
||||
for (i = 0; i < s->numDescs; i++) {
|
||||
desc = &s->descs[i];
|
||||
ButtonWidget_Init(&s->btns[i], desc->width, desc->OnClick);
|
||||
}
|
||||
}
|
||||
|
||||
static void TouchScreen_HacksChanged(void* screen) {
|
||||
struct TouchScreen* s = (struct TouchScreen*)screen;
|
||||
/* InitButtons changes number of widgets, hence */
|
||||
/* must destroy graphics resources BEFORE that */
|
||||
Screen_ContextLost(s);
|
||||
TouchScreen_InitButtons(s);
|
||||
Gui_Refresh(s);
|
||||
}
|
||||
|
||||
static void TouchScreen_ContextLost(void* screen) {
|
||||
struct TouchScreen* s = (struct TouchScreen*)screen;
|
||||
Font_Free(&s->font);
|
||||
@ -1920,15 +1966,10 @@ static void TouchScreen_ContextLost(void* screen) {
|
||||
|
||||
static void TouchScreen_UpdateModeText(void* screen) {
|
||||
struct TouchScreen* s = (struct TouchScreen*)screen;
|
||||
ButtonWidget_SetConst(&s->btns[1], Input_Placing ? "Place" : "Delete", &s->font);
|
||||
ButtonWidget_SetConst(&s->btns[s->numDescs - 2],
|
||||
Input_Placing ? "Place" : "Delete", &s->font);
|
||||
}
|
||||
|
||||
static void TouchScreen_ModeClick(void* s, void* w) {
|
||||
Input_Placing = !Input_Placing;
|
||||
TouchScreen_UpdateModeText(s);
|
||||
}
|
||||
static void TouchScreen_MoreClick(void* s, void* w) { TouchMoreScreen_Show(); }
|
||||
|
||||
static void TouchScreen_ContextRecreated(void* screen) {
|
||||
struct TouchScreen* s = (struct TouchScreen*)screen;
|
||||
const struct TouchBindDesc* desc;
|
||||
@ -1936,8 +1977,8 @@ static void TouchScreen_ContextRecreated(void* screen) {
|
||||
Screen_CreateVb(screen);
|
||||
Drawer2D_MakeFont(&s->font, 16, FONT_FLAGS_BOLD);
|
||||
|
||||
for (i = 0; i < TOUCH_NUM_BTNS; i++) {
|
||||
desc = &touchDescs[i];
|
||||
for (i = 0; i < s->numDescs; i++) {
|
||||
desc = &s->descs[i];
|
||||
ButtonWidget_SetConst(&s->btns[i], desc->text, &s->font);
|
||||
}
|
||||
TouchScreen_UpdateModeText(s);
|
||||
@ -1962,11 +2003,11 @@ static int TouchScreen_PointerDown(void* screen, int id, int x, int y) {
|
||||
s->thumbstick.active |= id; return true;
|
||||
}
|
||||
|
||||
for (i = 0; i < TOUCH_NUM_BTNS; i++) {
|
||||
for (i = 0; i < s->numDescs; i++) {
|
||||
if (!Widget_Contains(&s->btns[i], x, y)) continue;
|
||||
|
||||
if (s->binds[i] < KEYBIND_COUNT) {
|
||||
Input_SetPressed(KeyBinds[s->binds[i]], true);
|
||||
if (s->descs[i].bind < KEYBIND_COUNT) {
|
||||
Input_SetPressed(KeyBinds[s->descs[i].bind], true);
|
||||
} else {
|
||||
s->btns[i].MenuClick(screen, &s->btns[i]);
|
||||
}
|
||||
@ -1982,11 +2023,11 @@ static int TouchScreen_PointerUp(void* screen, int id, int x, int y) {
|
||||
//Chat_Add1("POINTER UP: %i", &id);
|
||||
s->thumbstick.active &= ~id;
|
||||
|
||||
for (i = 0; i < TOUCH_NUM_BTNS; i++) {
|
||||
for (i = 0; i < s->numDescs; i++) {
|
||||
if (!(s->btns[i].active & id)) continue;
|
||||
|
||||
if (s->binds[i] < KEYBIND_COUNT) {
|
||||
Input_SetPressed(KeyBinds[s->binds[i]], false);
|
||||
if (s->descs[i].bind < KEYBIND_COUNT) {
|
||||
Input_SetPressed(KeyBinds[s->descs[i].bind], false);
|
||||
}
|
||||
s->btns[i].active &= ~id;
|
||||
return true;
|
||||
@ -2001,33 +2042,28 @@ static void TouchScreen_GetMovement(float* xMoving, float* zMoving) {
|
||||
struct LocalPlayerInput touchInput;
|
||||
static void TouchScreen_Init(void* screen) {
|
||||
struct TouchScreen* s = (struct TouchScreen*)screen;
|
||||
int i;
|
||||
|
||||
s->widgets = touch_widgets;
|
||||
s->numWidgets = Array_Elems(touch_widgets);
|
||||
s->maxVertices = TOUCH_MAX_VERTICES;
|
||||
Event_Register_(&UserEvents.HacksStateChanged, screen, TouchScreen_HacksChanged);
|
||||
|
||||
for (i = 0; i < TOUCH_NUM_BTNS; i++) {
|
||||
ButtonWidget_Init(&s->btns[i], touchDescs[i].width, touchDescs[i].OnClick);
|
||||
s->binds[i] = touchDescs[i].bind;
|
||||
}
|
||||
|
||||
TouchScreen_InitButtons(s);
|
||||
ThumbstickWidget_Init(&s->thumbstick);
|
||||
touchInput.GetMovement = TouchScreen_GetMovement;
|
||||
LocalPlayer_Instance.input.next = &touchInput;
|
||||
}
|
||||
|
||||
static void TouchScreen_Layout(void* screen) {
|
||||
struct TouchScreen* s;
|
||||
struct TouchScreen* s = (struct TouchScreen*)screen;
|
||||
const struct TouchBindDesc* desc;
|
||||
int i, height;
|
||||
|
||||
s = (struct TouchScreen*)screen;
|
||||
HUDScreen_Layout(Gui_HUD);
|
||||
height = Gui_HUD->hotbar.height;
|
||||
|
||||
for (i = 0; i < TOUCH_NUM_BTNS; i++) {
|
||||
Widget_SetLocation(&s->btns[i], ANCHOR_MAX, ANCHOR_MAX,
|
||||
touchDescs[i].x, touchDescs[i].y);
|
||||
for (i = 0; i < s->numDescs; i++) {
|
||||
desc = &s->descs[i];
|
||||
Widget_SetLocation(&s->btns[i], ANCHOR_MAX, ANCHOR_MAX, desc->x, desc->y);
|
||||
s->btns[i].yOffset += height;
|
||||
Widget_Layout(&s->btns[i]);
|
||||
}
|
||||
@ -2035,8 +2071,12 @@ static void TouchScreen_Layout(void* screen) {
|
||||
Widget_SetLocation(&s->thumbstick, ANCHOR_MIN, ANCHOR_MAX, 30, 70);
|
||||
}
|
||||
|
||||
static void TouchScreen_Free(void* s) {
|
||||
Event_Unregister_(&UserEvents.HacksStateChanged, s, TouchScreen_HacksChanged);
|
||||
}
|
||||
|
||||
static const struct ScreenVTABLE TouchScreen_VTABLE = {
|
||||
TouchScreen_Init, Screen_NullUpdate, Screen_NullFunc,
|
||||
TouchScreen_Init, Screen_NullUpdate, TouchScreen_Free,
|
||||
TouchScreen_Render, Screen_BuildMesh,
|
||||
Screen_FInput, Screen_FInput, Screen_FKeyPress, Screen_FText,
|
||||
TouchScreen_PointerDown, TouchScreen_PointerUp, Screen_FPointer, Screen_FMouseScroll,
|
||||
|
Loading…
x
Reference in New Issue
Block a user