From 54f6cfa8e4664a9f12bff327231848f219674e60 Mon Sep 17 00:00:00 2001 From: Aldrik Ramaekers Date: Mon, 13 May 2024 17:41:48 +0200 Subject: menu work --- data/imgs/ui/splash3.png | Bin 0 -> 4952033 bytes data/sounds/woosh.wav | Bin 0 -> 7836 bytes include/asset_defs.h | 2 + include/menu.h | 5 -- main.c | 2 +- src/asset_defs.c | 2 + src/menu.c | 133 +++++++++++++++++++++++++++++++++++++++++++---- 7 files changed, 129 insertions(+), 15 deletions(-) create mode 100644 data/imgs/ui/splash3.png create mode 100644 data/sounds/woosh.wav diff --git a/data/imgs/ui/splash3.png b/data/imgs/ui/splash3.png new file mode 100644 index 0000000..36d0764 Binary files /dev/null and b/data/imgs/ui/splash3.png differ diff --git a/data/sounds/woosh.wav b/data/sounds/woosh.wav new file mode 100644 index 0000000..9ef5fe4 Binary files /dev/null and b/data/sounds/woosh.wav differ diff --git a/include/asset_defs.h b/include/asset_defs.h index b187cda..455aad7 100644 --- a/include/asset_defs.h +++ b/include/asset_defs.h @@ -6,10 +6,12 @@ /////// Loaded at game start. image* img_splash_art1; image* img_splash_art2; +image* img_splash_art3; image* img_menu_screen; Mix_Music* music_menu; +Mix_Chunk* wav_woosh; Mix_Chunk* wav_menu_hover; font* fnt_52; diff --git a/include/menu.h b/include/menu.h index 294f87b..5d31256 100644 --- a/include/menu.h +++ b/include/menu.h @@ -3,11 +3,6 @@ #include -typedef struct t_menu_state -{ - -} menu_state; - void update_menu(platform_window* window); #endif \ No newline at end of file diff --git a/main.c b/main.c index 710abe6..f004750 100644 --- a/main.c +++ b/main.c @@ -113,7 +113,7 @@ int main(int argc, char **argv) if (Mix_OpenAudio(48000, AUDIO_F32SYS, 2, 2048) == 0) { if (Mix_AllocateChannels(NUMBER_OF_AUDIO_CHANNELS) == NUM_AUDIO_CHANNELS) { log_info("Audio system initialized."); - Mix_MasterVolume(MIX_MAX_VOLUME/4); + Mix_MasterVolume(MIX_MAX_VOLUME); } else { log_info("Channel allocation failed."); diff --git a/src/asset_defs.c b/src/asset_defs.c index cc7ac6b..5d4b2cd 100644 --- a/src/asset_defs.c +++ b/src/asset_defs.c @@ -6,7 +6,9 @@ void load_menu_assets() { // Assets loaded at game start img_menu_screen = assets_load_image_from_file("data/imgs/ui/menu_screen.png"); img_splash_art2 = assets_load_image_from_file("data/imgs/ui/splash2.png"); + img_splash_art3 = assets_load_image_from_file("data/imgs/ui/splash3.png"); + wav_woosh = Mix_LoadWAV("data/sounds/woosh.wav"); wav_menu_hover = Mix_LoadWAV("data/sounds/menu_hover.wav"); music_menu = Mix_LoadMUS("data/sounds/menu_ambient.mp3"); diff --git a/src/menu.c b/src/menu.c index 1173c42..92ed996 100644 --- a/src/menu.c +++ b/src/menu.c @@ -1,14 +1,23 @@ #include "../include/menu.h" -void draw_background(platform_window* window) +typedef enum t_menu_state { + MENU_STATE_MAIN, + MENU_STATE_LEVEL_SELECT, +} menu_state; + +menu_state current_menu_state = MENU_STATE_MAIN; +float menu_state_change_duration = 0.2f; +float sec_since_state_change = 999.0f; +float sec_since_load_complete = 0.0f; +void draw_black_overlay(platform_window* window) { - image* img = img_splash_art2; - int imgw = img->width * (window->height/(float)img->height); - int imgh = window->height; + if (img_splash_art2->loaded && fnt_4->loaded) { + sec_since_load_complete += update_delta; + } - int imgx = (window->width - imgw) / 2 + _global_camera.x; - int imgy = 0 + _global_camera.y; - renderer->render_image(img, imgx, imgy, imgw, imgh); + int fade = 255 - (sec_since_load_complete*255); + if (fade < 0) fade = 0; + renderer->render_rectangle(0, 0, window->width, window->height, rgba(0,0,0,fade)); } float select_animation_duration = 0.0f; @@ -68,6 +77,11 @@ void draw_screen(platform_window* window) { play_sound(-1, wav_menu_hover); } selected_menu_option = 0; + if (is_left_clicked()) { + play_sound(-1, wav_woosh); + current_menu_state = MENU_STATE_LEVEL_SELECT; + sec_since_state_change = 0.0f; + } } if (draw_menu_option(window, text_offset_x, text_offset_y + item_h*1, screen_w, item_h, "Host Game", selected_menu_option == 1)) { @@ -113,8 +127,109 @@ void draw_screen(platform_window* window) { renderer->render_image(img, imgx, imgy, imgw, imgh); } +vec4 draw_screen_change_animation(platform_window* window, float percentage) +{ + image* img = img_menu_screen; + int imgw = img->width * (window->height/(float)img->height); + int imgh = window->height; + + int src_imgx = (window->width - imgw) / 2 + _global_camera.x; + int src_imgy = 0 + _global_camera.y; + + int dest_imgw = imgw*2; + int dest_imgh = imgh*2; + int dest_imgx = src_imgx - dest_imgw/4; + int dest_imgy = src_imgy - dest_imgh/15; + + int p_imgw = imgw + ((dest_imgw - imgw)*percentage); + int p_imgh = imgh + ((dest_imgh - imgh)*percentage); + int p_imgx = src_imgx + ((dest_imgx - src_imgx)*percentage); + int p_imgy = src_imgy + ((dest_imgy - src_imgy)*percentage); + + renderer->render_image(img, p_imgx, p_imgy, p_imgw, p_imgh); + + int text_offset_x = p_imgx + 1540*2 * (imgw/(float)img->width); + int text_offset_y = p_imgy + 475*2 * (imgh/(float)img->height); + + int screen_w = 900*2 * (imgw/(float)img->width); + int screen_h = 560*2 * (imgh/(float)img->height); + + return (vec4){text_offset_x, text_offset_y, screen_w, screen_h}; +} + +vec4 renderable_rec; +image* level_img_bg = 0; +int selected_level_index = 0; +void draw_level_select(platform_window* window) +{ + color txt = rgb(102, 255, 102); + color txt_bg = rgb(90, 176, 90); + + if (level_img_bg == 0) level_img_bg = img_splash_art2; + + renderer->render_image(level_img_bg, renderable_rec.x, renderable_rec.y, renderable_rec.w, renderable_rec.h); + renderer->render_rectangle(renderable_rec.x, renderable_rec.y, renderable_rec.w, renderable_rec.h, rgba(40,40,40, 200)); + + char* level_select_text = "Select Map"; + font* fnt = get_font(window, 1.5f); + int text_w = renderer->calculate_text_width(fnt, level_select_text); + int text_y = renderable_rec.y + 30; + + renderer->render_text(fnt, renderable_rec.x + (renderable_rec.w/2)-(text_w/2), text_y, level_select_text, txt); + text_y += 30; + + select_animation_duration += update_delta; + + int item_h = renderable_rec.h / 6; + if (draw_menu_option(window, renderable_rec.x, text_y, renderable_rec.w, item_h, "Amalthea Mark II", selected_level_index == 0)) { + if (selected_level_index != 0) { + select_animation_duration = 0.0f; + play_sound(-1, wav_menu_hover); + } + selected_level_index = 0; + level_img_bg = img_splash_art3; + if (is_left_clicked()) { + global_scene_state = SCENE_GAME; + // start game/go to lobby. + } + } + else { + selected_level_index = -1; + level_img_bg = img_splash_art2; + } + + renderable_rec = draw_screen_change_animation(window, 1.0f); +} + void update_menu(platform_window* window) { - //draw_background(window); - draw_screen(window); + sec_since_state_change += update_delta; + if (current_menu_state != MENU_STATE_MAIN) { + if (sec_since_state_change <= menu_state_change_duration) { + renderable_rec = draw_screen_change_animation(window, sec_since_state_change / menu_state_change_duration); + } + else if (current_menu_state == MENU_STATE_LEVEL_SELECT) { + draw_level_select(window); + } + + if (keyboard_is_key_down(KEY_ESCAPE)) + { + play_sound(-1, wav_woosh); + current_menu_state = MENU_STATE_MAIN; + if (sec_since_state_change >= menu_state_change_duration) + sec_since_state_change = 0.0f; + else + sec_since_state_change = menu_state_change_duration - sec_since_state_change; + } + } + else { + if (sec_since_state_change <= menu_state_change_duration) { + draw_screen_change_animation(window, 1.0f - (sec_since_state_change / menu_state_change_duration)); + } + else { + draw_screen(window); + } + } + + draw_black_overlay(window); } \ No newline at end of file -- cgit v1.2.3-70-g09d2