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))/2; 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)) { if (is_editing_settings_from_ingame) { game_set_active_scene(GAME_STATE_WORLD_MAP); } else { 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)) { if (is_editing_settings_from_ingame) { game_set_active_scene(GAME_STATE_WORLD_MAP); } else { game_set_active_scene(GAME_STATE_MENU); } } } void settings_scene_destroy() { }