diff options
| author | Aldrik Ramaekers <aldrikboy@gmail.com> | 2024-11-23 21:52:24 +0100 |
|---|---|---|
| committer | Aldrik Ramaekers <aldrikboy@gmail.com> | 2024-11-23 21:52:24 +0100 |
| commit | 6f7374c2fa58c8692b51018864b802e6b876d305 (patch) | |
| tree | a7e8ead757e9f4de1920395336dcac1c8a989576 /src/scenes/settings_scene.c | |
A new start
Diffstat (limited to 'src/scenes/settings_scene.c')
| -rw-r--r-- | src/scenes/settings_scene.c | 152 |
1 files changed, 152 insertions, 0 deletions
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 |
