From c5937694e93c18aea65c15fd374cb496e6ab1200 Mon Sep 17 00:00:00 2001 From: En Yi Date: Sun, 12 Feb 2023 14:51:47 +0800 Subject: [PATCH] Implement keyboard controls in UI Changelog: - Add one more button for testing - Add up and down actions - Seperate out mouse mode and keyboard mode - Enter mouse mode by moving mode - Enter keyboard mode by keyboard input - May need an action to detect mouse movement - Add logic to cycle menu options --- engine/menu_impl.c | 96 +++++++++++++++++++++++++++++++++++++++------- engine/menu_impl.h | 11 +++++- 2 files changed, 92 insertions(+), 15 deletions(-) diff --git a/engine/menu_impl.c b/engine/menu_impl.c index 3680676..3af9a0c 100644 --- a/engine/menu_impl.c +++ b/engine/menu_impl.c @@ -1,4 +1,6 @@ #include "menu_impl.h" +#include "raymath.h" +#include static void menu_scene_render_func(Scene_t *scene) @@ -6,35 +8,87 @@ static void menu_scene_render_func(Scene_t *scene) MenuSceneData_t *data = (MenuSceneData_t *)scene->scene_data; DrawText("This is a game", 25, 220, 12, BLACK); UI_button(data->buttons, "Start"); - UI_button(data->buttons + 1, "Exit"); + UI_button(data->buttons + 1, "Continue"); + UI_button(data->buttons + 2, "Exit"); } static void menu_do_action(Scene_t *scene, ActionType_t action, bool pressed) { + MenuSceneData_t *data = (MenuSceneData_t *)scene->scene_data; + int new_selection = data->selected_comp; + if (!pressed) + { + if (data->mode == MOUSE_MODE) + { + data->mode = KEYBOARD_MODE; + } + else + { + switch(action) + { + case ACTION_UP: + new_selection--; + break; + case ACTION_DOWN: + new_selection++; + break; + case ACTION_LEFT: + break; + case ACTION_RIGHT: + break; + default: + break; + } + } + data->buttons[data->selected_comp].state = STATE_NORMAL; + if (new_selection < 0) new_selection = data->max_comp - 1; + if (new_selection >= data->max_comp) new_selection = 0; + printf("new: %d, old %d\n", new_selection, data->selected_comp); + + data->buttons[new_selection].state = STATE_FOCUSED; + data->selected_comp = new_selection; + } } static void gui_loop(Scene_t* scene) { MenuSceneData_t *data = (MenuSceneData_t *)scene->scene_data; - for (size_t i=0;i<2;i++) + if (Vector2LengthSqr(GetMouseDelta()) > 1) { - if ((data->buttons[i].state != STATE_DISABLED)) + data->mode = MOUSE_MODE; + } + if (data->mode == KEYBOARD_MODE) + { + } + else + { + data->buttons[data->selected_comp].state = STATE_NORMAL; + for (size_t i=0;imax_comp;i++) { - Vector2 mousePoint = GetMousePosition(); - - // Check button state - if (CheckCollisionPointRec(mousePoint, data->buttons[i].bbox)) + if ((data->buttons[i].state != STATE_DISABLED)) { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) data->buttons[i].state = STATE_PRESSED; - else data->buttons[i].state = STATE_FOCUSED; + Vector2 mousePoint = GetMousePosition(); - if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) data->buttons[i].pressed = true; - } - else - { - data->buttons[i].state = STATE_NORMAL; + // Check button state + if (CheckCollisionPointRec(mousePoint, data->buttons[i].bbox)) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) + { + data->buttons[i].state = STATE_PRESSED; + } + else + { + data->buttons[i].state = STATE_FOCUSED; + } + if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) + { + data->buttons[i].pressed = true; + } + data->selected_comp = i; + } } } + } } @@ -58,6 +112,20 @@ void init_menu_scene(MenuScene_t *scene) .state = STATE_NORMAL, .alpha = 1.0 }; + scene->data.buttons[2] = (UIComp_t) + { + .bbox = {25,345,125,30}, + .state = STATE_NORMAL, + .alpha = 1.0 + }; + scene->data.max_comp = 3; + scene->data.selected_comp = 0; + scene->data.mode = KEYBOARD_MODE; + + sc_map_put_64(&scene->scene.action_map, KEY_UP, ACTION_UP); + sc_map_put_64(&scene->scene.action_map, KEY_DOWN, ACTION_DOWN); + sc_map_put_64(&scene->scene.action_map, KEY_LEFT, ACTION_LEFT); + sc_map_put_64(&scene->scene.action_map, KEY_RIGHT, ACTION_RIGHT); } void free_menu_scene(MenuScene_t *scene) diff --git a/engine/menu_impl.h b/engine/menu_impl.h index d327363..f6b7cb4 100644 --- a/engine/menu_impl.h +++ b/engine/menu_impl.h @@ -3,9 +3,18 @@ #include "scene.h" #include "gui.h" +typedef enum GuiMode +{ + KEYBOARD_MODE, + MOUSE_MODE +}GuiMode_t; + typedef struct MenuSceneData { - UIComp_t buttons[2]; + UIComp_t buttons[3]; + int selected_comp; + int max_comp; + GuiMode_t mode; }MenuSceneData_t; typedef struct MenuScene