diff --git a/src/main.c b/src/main.c index 65e20af..30c185a 100644 --- a/src/main.c +++ b/src/main.c @@ -25,8 +25,22 @@ Made by Sem van der Hoeven #define SCREEN_WIDTH 960 #define SIMPLE_ENEMY_MAX_AMOUNT 20 #define ENEMY_MAX_AMOUNT 40 -#define BULLET_MARGIN 5.0 // extra hitbox space to make sure bullets hit -#define MENU_SWITCH_DELAY 50 // delay in ms for when a menu screen is switched. +#define BULLET_MARGIN 5.0 // extra hitbox space to make sure bullets hit + +#define MENU_SWITCH_DELAY 50 // delay in ms for when a menu screen is switched. +#define MENU_LEFT_RIGHT_NONE 0 // not left or right pressed +#define MENU_LEFT_RIGHT_LEFT 1 // left pressed +#define MENU_LEFT_RIGHT_RIGHT 2 // right pressed + +/* +menu windows: +|--------| |------------| |-----| +|tutorial| |color select| |start| +|--------| |------------| |-----| +*/ +#define MENU_WINDOW_TUTORIAL 0 +#define MENU_WINDOW_COLOR_SELECT 1 +#define MENU_WINDOW_START 2 typedef enum { @@ -36,6 +50,13 @@ typedef enum GAMEOVER } game_state; +typedef enum +{ + NONE, + SHIP_SELECT, + HOW_TO_PLAY +} menu_window_state; + uint8_t running, drawing_circle; game_state current_state = START; @@ -70,10 +91,15 @@ int score; float player_x, player_y, radius; +// ----------menu----------- uint8_t ship_color_select_colors[3] = {255, 0, 255}; // colors to select ship uint8_t menu_background_color[3] = {0, 255, 255}; char menu_background_color_index; // 1 or -1, is used to cycle between the colors of the menu +menu_window_state menu_active_window; +uint8_t menu_selected_window; // 0 is how to play, 1 is ship color select, 2 is game +uint8_t menu_left_right_pressed; // 0 is none, 1 is left, 2 is right + /** * @brief should be called when an unhandlable exception or error occurs. Triggers coredump. * @@ -108,6 +134,9 @@ void init_variables() menu_background_color[0] = 0; menu_background_color[1] = 255; menu_background_color_index = 1; + menu_active_window = NONE; + menu_selected_window = 0; + menu_left_right_pressed = 0; } // ################################################################ @@ -400,6 +429,25 @@ void update_menu() player_x = SCREEN_WIDTH / 2; player_y = 500; } + + if (menu_switch_input_delay_timer.elapsed) + { + if (menu_left_right_pressed == MENU_LEFT_RIGHT_LEFT) // left + { + menu_selected_window -= 1; + if (menu_selected_window < MENU_WINDOW_TUTORIAL) + menu_selected_window = MENU_WINDOW_START; + menu_left_right_pressed = MENU_LEFT_RIGHT_NONE; + } + + if (menu_left_right_pressed == MENU_LEFT_RIGHT_RIGHT) // right + { + menu_selected_window += 1; + if (menu_selected_window > MENU_WINDOW_START) + menu_selected_window = MENU_WINDOW_TUTORIAL; + menu_left_right_pressed = MENU_LEFT_RIGHT_NONE; + } + } } void update_game() @@ -544,6 +592,11 @@ void update() if (pad.buttons & SCE_CTRL_CROSS) cross_pressed = 1; + if (pad.buttons & SCE_CTRL_LEFT) + menu_left_right_pressed = MENU_LEFT_RIGHT_LEFT; + if (pad.buttons & SCE_CTRL_RIGHT) + menu_left_right_pressed = MENU_LEFT_RIGHT_RIGHT; + ctrl_input_get_leftstick(&pad, &left_stick); // ctrl_input_get_rightstick(&pad, &right_stick); @@ -598,6 +651,7 @@ void draw_start() void draw_menu() { + // TODO add windows for tutorial and color select, and make "press x to start" window just a "start" window drawing_draw_window_filled(SCREEN_WIDTH / 2 - 212 / 2, 50, 212, 100, "Window Title", pgf, RGBA8(menu_background_color[0], menu_background_color[1], menu_background_color[2], 255)); vita2d_pgf_draw_text(pgf, SCREEN_WIDTH / 2 - 212 / 2 + 47, 50 + 70, COLOR_BLACK, 2.0, "Menu"); drawing_draw_window_filled(600, 400, 226, 80, "Message", pgf, SECONDARY_BORDER_COLOR); // width: 28 pixels for each character diff --git a/src/toolbox/drawing.c b/src/toolbox/drawing.c index fd0fd31..693c0b5 100644 --- a/src/toolbox/drawing.c +++ b/src/toolbox/drawing.c @@ -29,8 +29,18 @@ void drawing_draw_vline(float x0, float y0, float height, int thiccness, unsigne void drawing_draw_window_clear(float x, float y, float width, float heigth, const char *title_text, vita2d_pgf *pgf) { - drawing_draw_rectangle_open(x, y, width, heigth, 10, MAIN_BORDER_COLOR); - drawing_draw_hline(x, y + 10, width, 20, MAIN_BORDER_COLOR); + drawing_draw_window(x,y,width,heigth,title_text,pgf,MAIN_BORDER_COLOR); +} + +void drawing_draw_window_selected(float x, float y, float width, float heigth, const char *title_text, vita2d_pgf *pgf) +{ + drawing_draw_window(x,y,width,heigth,title_text,pgf,SELECTED_BORDER_COLOR); +} + +void drawing_draw_window(float x, float y, float width, float heigth, const char *title_text, vita2d_pgf *pgf, unsigned int border_color) +{ + drawing_draw_rectangle_open(x, y, width, heigth, 10, border_color); + drawing_draw_hline(x, y + 10, width, 20, border_color); for (int i = 0; i < 3; i++) { int box_x = width - 22 * i - 30 + x; @@ -63,6 +73,12 @@ void drawing_draw_window_filled(float x, float y, float width, float heigth, con vita2d_draw_rectangle(x + 10, y + 30, width - 20, heigth - 40, color); } +void drawing_draw_selected_window_filled(float x, float y, float width, float heigth, const char *title_text, vita2d_pgf *pgf, unsigned int color) +{ + drawing_draw_window_selected(x, y, width, heigth, title_text, pgf); + vita2d_draw_rectangle(x + 10, y + 30, width - 20, heigth - 40, color); +} + void drawing_draw_triangle(float x0, float y0, float x1, float y1, float x2, float y2, int thiccness, unsigned int color) { for (int i = 0; i < thiccness; i++) diff --git a/src/toolbox/drawing.h b/src/toolbox/drawing.h index 25df9d1..d220aaf 100644 --- a/src/toolbox/drawing.h +++ b/src/toolbox/drawing.h @@ -3,6 +3,7 @@ #include #define MAIN_BORDER_COLOR (RGBA8(98, 124, 158, 255)) +#define SELECTED_BORDER_COLOR (RGBA8(115, 115, 110,255)) #define SECONDARY_BORDER_COLOR (RGBA8(181, 181, 181,255)) #define COLOR_BLACK (RGBA8(0, 0, 0, 255)) #define COLOR_MAGENTA (RGBA8(251, 41, 255,255)) @@ -67,6 +68,18 @@ void drawing_draw_vline(float x0, float y0, float height, int thiccness, unsigne */ void drawing_draw_window_clear(float x, float y, float width, float heigth, const char *title_text, vita2d_pgf *pgf); +/** + * @brief draws a selected window frame with the specified features + * + * @param x the top left x position of the frame + * @param y the top left y position of the frame + * @param width the width of the frame + * @param heigth the heigth of the frame + * @param title_text the title text to be displayed at the top of the frame + * @param pgf pointer to the pgf font to be used + */ +void drawing_draw_window_selected(float x, float y, float width, float heigth, const char *title_text, vita2d_pgf *pgf); + /** * @brief draws a window frame with the specified features * @@ -80,6 +93,19 @@ void drawing_draw_window_clear(float x, float y, float width, float heigth, cons */ void drawing_draw_window_filled(float x, float y, float width, float heigth, const char *title_text, vita2d_pgf *pgf, unsigned int color); +/** + * @brief draws a selected window frame with the specified features + * + * @param x the top left x position of the frame + * @param y the top left y position of the frame + * @param width the width of the frame + * @param heigth the heigth of the frame + * @param title_text the title text to be displayed at the top of the frame + * @param pgf pointer to the pgf font to be used + * @param color the color of the background of the window + */ +void drawing_draw_selected_window_filled(float x, float y, float width, float heigth, const char *title_text, vita2d_pgf *pgf, unsigned int color); + /** * @brief draws an open triangle with the given parameters *