From 6f7374c2fa58c8692b51018864b802e6b876d305 Mon Sep 17 00:00:00 2001 From: Aldrik Ramaekers Date: Sat, 23 Nov 2024 21:52:24 +0100 Subject: A new start --- src/scenes/settings_scene.c | 152 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 src/scenes/settings_scene.c (limited to 'src/scenes/settings_scene.c') diff --git a/src/scenes/settings_scene.c b/src/scenes/settings_scene.c new file mode 100644 index 0000000..23655d3 --- /dev/null +++ b/src/scenes/settings_scene.c @@ -0,0 +1,152 @@ +enum settings_state +{ + SETTINGS_AUDIO, + SETTINGS_DISPLAY, + SETTINGS_KEYBINDINGS, +}; + +enum settings_state settings_state = SETTINGS_AUDIO; + +void settings_scene_init() { + +} + +static void draw_display_settings(s32 x, s32 y, s32 w, s32 h) +{ + s32 option_spacing = 20*scale; + s32 checkbox_s = 30*scale; + s32 checkbox_offset = ((checkbox_s-fnt_rd24->px_h)/2); + s32 text_y = y + option_spacing; + s32 text_x = x + checkbox_s + option_spacing; + + #define PUSH_DISPLAY_OPTION(_str, _opt)\ + renderer->render_text(fnt_rd24, text_x, text_y, _str, COLOR_TEXT);\ + if (button_draw_background(scale, x,text_y-checkbox_offset, checkbox_s, checkbox_s, COLOR_WHITE, COLOR_BUTTON)) {\ + if (is_left_clicked()) { \ + _opt = !_opt;\ + if (&_opt == &option_vsync) platform_toggle_vsync(main_window, option_vsync);\ + if (&_opt == &option_fullscreen) platform_toggle_fullscreen(main_window, option_fullscreen);\ + audio_play_sound(snd_click, AUDIO_CHANNEL_SFX_1);\ + }\ + }\ + if (_opt) {\ + s32 tw = renderer->calculate_text_width(fnt_rd24, "X");\ + renderer->render_text(fnt_rd24, x + checkbox_s/2 - tw/2,text_y-checkbox_offset + checkbox_s/2 - fnt_rd24->px_h/2, "X", COLOR_TEXT);\ + }\ + text_y += (checkbox_s + option_spacing); + + PUSH_DISPLAY_OPTION("Vsync", option_vsync); + PUSH_DISPLAY_OPTION("Fullscreen", option_fullscreen); +} + +static void draw_audio_settings(s32 x, s32 y, s32 w, s32 h) +{ + s32 option_spacing = 20*scale; + s32 slider_h = 30*scale; + s32 slider_offset = ((slider_h-fnt_rd24->px_h)/2); + s32 slider_w = w/2; + s32 slider_x = x + slider_w; + s32 text_y = y + option_spacing; + + // Music + #define PUSH_VOLUME_OPTION(_text, _opt)\ + {\ + static bool is_editing = false;\ + renderer->render_text(fnt_rd24, x, text_y, _text, COLOR_TEXT);\ + s32 slider_y = text_y - slider_offset;\ + float percentage = is_editing ? ((_global_mouse.x - (slider_x+10*scale)) / (float)(slider_w-20*scale)) : _opt;\ + if (percentage < 0.0f) percentage = 0.0f;\ + if (percentage > 1.0f) percentage = 1.0f;\ + button_draw_background_percentage(scale, slider_x,slider_y,slider_w,slider_h, COLOR_WHITE, COLOR_BUTTON, percentage, COLOR_WHITE);\ + bool hovered = mouse_interacts(slider_x,slider_y,slider_w,slider_h);\ + if (hovered && is_left_clicked()) is_editing = true;\ + if (is_editing) {\ + audio_set_mixer_volume(AUDIO_CHANNEL_SFX_1, volume_sfx*volume_global);\ + audio_set_mixer_volume(AUDIO_CHANNEL_SFX_2, volume_sfx*volume_global);\ + audio_set_music_volume(volume_music*volume_global);\ + }\ + if (is_editing) {\ + if (!is_left_down()) { is_editing = false; audio_play_sound(snd_click, AUDIO_CHANNEL_SFX_1); }\ + _opt = percentage;\ + }\ + text_y += (slider_h + option_spacing);\ + } + + PUSH_VOLUME_OPTION("Global", volume_global); + PUSH_VOLUME_OPTION("Music", volume_music); + PUSH_VOLUME_OPTION("Interface", volume_sfx); +} + +static void settings_draw_options(platform_window* window) +{ + s32 screen_center_x = area.x + (area.w/2); + s32 screen_center_y = area.y + (area.h/2); + + s32 panel_w = 400 * scale; + s32 panel_h = 500 * scale; + s32 panel_x = screen_center_x - (panel_w/2); + s32 panel_y = screen_center_y - (panel_h/2); + panel_render(scale, panel_x, panel_y, panel_w, panel_h); + + // Buttons + s32 button_pad = 10*scale; + s32 button_w = (panel_w-(button_pad*4))/3; + s32 button_h = 37*scale; + s32 button_y = panel_y + button_pad*1.3f; + s32 button_x = panel_x + button_pad; + + if (button_render(scale, BUTTON_ENABLED, "Audio", button_x, button_y, button_w, button_h)) + { + settings_state = SETTINGS_AUDIO; + } + + if (button_render(scale, BUTTON_ENABLED, "Display", button_x + (button_w + button_pad), button_y, button_w, button_h)) + { + settings_state = SETTINGS_DISPLAY; + } + + if (button_render(scale, BUTTON_ENABLED, "Keybindings", button_x + (button_w + button_pad)*2, button_y, button_w, button_h)) + { + settings_state = SETTINGS_KEYBINDINGS; + } + + s32 detail_pad = 25*scale; + s32 detail_w = panel_w - (detail_pad*2)-(button_pad*2); + s32 detail_h = panel_h - (detail_pad*2)-(button_pad*3)-button_h; + s32 detail_x = panel_x+detail_pad+button_pad; + s32 detail_y = button_y + button_h + detail_pad+button_pad; + + if (settings_state == SETTINGS_AUDIO) { + draw_audio_settings(detail_x, detail_y, detail_w, detail_h); + } + else if (settings_state == SETTINGS_DISPLAY) { + draw_display_settings(detail_x, detail_y, detail_w, detail_h); + } + + // back button + { + s32 back_h = img_back->height * scale/2; + s32 back_w = img_back->width * scale/2; + s32 back_x = panel_x + (panel_w/10); + s32 back_y = panel_y + panel_h - (back_h/2) - 1; + + if (push_back_button(scale, back_x, back_y, back_w, back_h)) { + game_set_active_scene(GAME_STATE_MENU); + } + } +} + +void settings_scene_render(platform_window* window) { + menu_draw_background(window); + settings_draw_options(window); +} + +void settings_scene_update(platform_window* window) { + if (keyboard_is_key_pressed(KEY_ESCAPE)) { + game_set_active_scene(GAME_STATE_MENU); + } +} + +void settings_scene_destroy() { + +} \ No newline at end of file -- cgit v1.2.3-70-g09d2