mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-13 01:26:50 -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------------------------------------------------------*
|
*--------------------------------------------------------TouchScreen------------------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
#ifdef CC_BUILD_TOUCH
|
#ifdef CC_BUILD_TOUCH
|
||||||
#define TOUCH_NUM_BTNS 3
|
#define TOUCH_MAX_BTNS 4
|
||||||
static struct TouchScreen {
|
struct TouchBindDesc {
|
||||||
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 {
|
|
||||||
const char* text;
|
const char* text;
|
||||||
cc_uint8 bind, width;
|
cc_uint8 bind, width;
|
||||||
cc_int16 x, y;
|
cc_int16 x, y;
|
||||||
MenuClick OnClick;
|
Widget_LeftClick OnClick;
|
||||||
} touchDescs[TOUCH_NUM_BTNS] = {
|
|
||||||
{ "Jump", KEYBIND_JUMP, 100, 50, 90 },
|
|
||||||
{ "", KEYBIND_COUNT, 100, 50, 50 },
|
|
||||||
{ "More", KEYBIND_COUNT, 100, 50, 10 },
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
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) {
|
static void TouchScreen_ContextLost(void* screen) {
|
||||||
struct TouchScreen* s = (struct TouchScreen*)screen;
|
struct TouchScreen* s = (struct TouchScreen*)screen;
|
||||||
Font_Free(&s->font);
|
Font_Free(&s->font);
|
||||||
@ -1920,15 +1966,10 @@ static void TouchScreen_ContextLost(void* screen) {
|
|||||||
|
|
||||||
static void TouchScreen_UpdateModeText(void* screen) {
|
static void TouchScreen_UpdateModeText(void* screen) {
|
||||||
struct TouchScreen* s = (struct TouchScreen*)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) {
|
static void TouchScreen_ContextRecreated(void* screen) {
|
||||||
struct TouchScreen* s = (struct TouchScreen*)screen;
|
struct TouchScreen* s = (struct TouchScreen*)screen;
|
||||||
const struct TouchBindDesc* desc;
|
const struct TouchBindDesc* desc;
|
||||||
@ -1936,8 +1977,8 @@ static void TouchScreen_ContextRecreated(void* screen) {
|
|||||||
Screen_CreateVb(screen);
|
Screen_CreateVb(screen);
|
||||||
Drawer2D_MakeFont(&s->font, 16, FONT_FLAGS_BOLD);
|
Drawer2D_MakeFont(&s->font, 16, FONT_FLAGS_BOLD);
|
||||||
|
|
||||||
for (i = 0; i < TOUCH_NUM_BTNS; i++) {
|
for (i = 0; i < s->numDescs; i++) {
|
||||||
desc = &touchDescs[i];
|
desc = &s->descs[i];
|
||||||
ButtonWidget_SetConst(&s->btns[i], desc->text, &s->font);
|
ButtonWidget_SetConst(&s->btns[i], desc->text, &s->font);
|
||||||
}
|
}
|
||||||
TouchScreen_UpdateModeText(s);
|
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;
|
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 (!Widget_Contains(&s->btns[i], x, y)) continue;
|
||||||
|
|
||||||
if (s->binds[i] < KEYBIND_COUNT) {
|
if (s->descs[i].bind < KEYBIND_COUNT) {
|
||||||
Input_SetPressed(KeyBinds[s->binds[i]], true);
|
Input_SetPressed(KeyBinds[s->descs[i].bind], true);
|
||||||
} else {
|
} else {
|
||||||
s->btns[i].MenuClick(screen, &s->btns[i]);
|
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);
|
//Chat_Add1("POINTER UP: %i", &id);
|
||||||
s->thumbstick.active &= ~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->btns[i].active & id)) continue;
|
||||||
|
|
||||||
if (s->binds[i] < KEYBIND_COUNT) {
|
if (s->descs[i].bind < KEYBIND_COUNT) {
|
||||||
Input_SetPressed(KeyBinds[s->binds[i]], false);
|
Input_SetPressed(KeyBinds[s->descs[i].bind], false);
|
||||||
}
|
}
|
||||||
s->btns[i].active &= ~id;
|
s->btns[i].active &= ~id;
|
||||||
return true;
|
return true;
|
||||||
@ -2001,33 +2042,28 @@ static void TouchScreen_GetMovement(float* xMoving, float* zMoving) {
|
|||||||
struct LocalPlayerInput touchInput;
|
struct LocalPlayerInput touchInput;
|
||||||
static void TouchScreen_Init(void* screen) {
|
static void TouchScreen_Init(void* screen) {
|
||||||
struct TouchScreen* s = (struct TouchScreen*)screen;
|
struct TouchScreen* s = (struct TouchScreen*)screen;
|
||||||
int i;
|
|
||||||
|
|
||||||
s->widgets = touch_widgets;
|
s->widgets = touch_widgets;
|
||||||
s->numWidgets = Array_Elems(touch_widgets);
|
|
||||||
s->maxVertices = TOUCH_MAX_VERTICES;
|
s->maxVertices = TOUCH_MAX_VERTICES;
|
||||||
|
Event_Register_(&UserEvents.HacksStateChanged, screen, TouchScreen_HacksChanged);
|
||||||
|
|
||||||
for (i = 0; i < TOUCH_NUM_BTNS; i++) {
|
TouchScreen_InitButtons(s);
|
||||||
ButtonWidget_Init(&s->btns[i], touchDescs[i].width, touchDescs[i].OnClick);
|
|
||||||
s->binds[i] = touchDescs[i].bind;
|
|
||||||
}
|
|
||||||
|
|
||||||
ThumbstickWidget_Init(&s->thumbstick);
|
ThumbstickWidget_Init(&s->thumbstick);
|
||||||
touchInput.GetMovement = TouchScreen_GetMovement;
|
touchInput.GetMovement = TouchScreen_GetMovement;
|
||||||
LocalPlayer_Instance.input.next = &touchInput;
|
LocalPlayer_Instance.input.next = &touchInput;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void TouchScreen_Layout(void* screen) {
|
static void TouchScreen_Layout(void* screen) {
|
||||||
struct TouchScreen* s;
|
struct TouchScreen* s = (struct TouchScreen*)screen;
|
||||||
|
const struct TouchBindDesc* desc;
|
||||||
int i, height;
|
int i, height;
|
||||||
|
|
||||||
s = (struct TouchScreen*)screen;
|
|
||||||
HUDScreen_Layout(Gui_HUD);
|
HUDScreen_Layout(Gui_HUD);
|
||||||
height = Gui_HUD->hotbar.height;
|
height = Gui_HUD->hotbar.height;
|
||||||
|
|
||||||
for (i = 0; i < TOUCH_NUM_BTNS; i++) {
|
for (i = 0; i < s->numDescs; i++) {
|
||||||
Widget_SetLocation(&s->btns[i], ANCHOR_MAX, ANCHOR_MAX,
|
desc = &s->descs[i];
|
||||||
touchDescs[i].x, touchDescs[i].y);
|
Widget_SetLocation(&s->btns[i], ANCHOR_MAX, ANCHOR_MAX, desc->x, desc->y);
|
||||||
s->btns[i].yOffset += height;
|
s->btns[i].yOffset += height;
|
||||||
Widget_Layout(&s->btns[i]);
|
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);
|
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 = {
|
static const struct ScreenVTABLE TouchScreen_VTABLE = {
|
||||||
TouchScreen_Init, Screen_NullUpdate, Screen_NullFunc,
|
TouchScreen_Init, Screen_NullUpdate, TouchScreen_Free,
|
||||||
TouchScreen_Render, Screen_BuildMesh,
|
TouchScreen_Render, Screen_BuildMesh,
|
||||||
Screen_FInput, Screen_FInput, Screen_FKeyPress, Screen_FText,
|
Screen_FInput, Screen_FInput, Screen_FKeyPress, Screen_FText,
|
||||||
TouchScreen_PointerDown, TouchScreen_PointerUp, Screen_FPointer, Screen_FMouseScroll,
|
TouchScreen_PointerDown, TouchScreen_PointerUp, Screen_FPointer, Screen_FMouseScroll,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user