summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrikboy@gmail.com>2024-05-13 17:41:48 +0200
committerAldrik Ramaekers <aldrikboy@gmail.com>2024-05-13 17:41:48 +0200
commit54f6cfa8e4664a9f12bff327231848f219674e60 (patch)
tree1df26161a86598e7652d06dfee1cc4245e455adc /src
parentf20dfd8240c5cab969b25a3c1e986b28c97f6898 (diff)
menu work
Diffstat (limited to 'src')
-rw-r--r--src/asset_defs.c2
-rw-r--r--src/menu.c133
2 files changed, 126 insertions, 9 deletions
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