1
0
Fork 0
mirror of https://github.com/TerryCavanagh/VVVVVV.git synced 2024-12-23 10:09:43 +01:00

Slider inputs for audio volume

This commit is contained in:
NyakoFox 2024-04-09 17:39:23 -03:00
parent 59a97d2404
commit e96d1391cd
5 changed files with 150 additions and 27 deletions

View file

@ -6964,16 +6964,34 @@ void Game::createmenu( enum Menu::MenuName t, bool samemenu/*= false*/ )
maxspacing = 15; maxspacing = 15;
break; break;
case Menu::audiooptions: case Menu::audiooptions:
{
int offset = 0;
option(loc::gettext("music volume")); option(loc::gettext("music volume"));
option(loc::gettext("sound volume")); option(loc::gettext("sound volume"));
if (music.mmmmmm) if (music.mmmmmm)
{ {
offset++;
option(loc::gettext("soundtrack")); option(loc::gettext("soundtrack"));
} }
option(loc::gettext("return")); option(loc::gettext("return"));
menuyoff = 0; menuyoff = 0;
maxspacing = 15; maxspacing = 15;
auto_buttons = false;
touch::create_slider_button((320 - 160) / 2, 120 - 32, 160, 48, loc::gettext("music volume"), &music.user_music_volume, 0, USER_VOLUME_MAX);
touch::create_slider_button((320 - 160) / 2, 120 + 32, 160, 48, loc::gettext("sound volume"), &music.user_sound_volume, 0, USER_VOLUME_MAX);
if (music.mmmmmm)
{
touch::create_toggle_button((320 - 160) / 2, 200 - 48, 160, 12, loc::gettext("MMMMMM soundtrack"), offset, music.usingmmmmmm);
}
touch::create_menu_button(46 - 16, 200, 76, 26, loc::gettext("previous"), -2);
touch::create_menu_button(122, 200, 76, 26, loc::gettext("return"), offset + 2);
touch::create_menu_button(198 + 16, 200, 76, 26, loc::gettext("next"), -1);
break; break;
}
case Menu::accessibility: case Menu::accessibility:
#if !defined(MAKEANDPLAY) #if !defined(MAKEANDPLAY)
option(loc::gettext("unlock play modes")); option(loc::gettext("unlock play modes"));

View file

@ -1180,6 +1180,22 @@ void menuactionpress(void)
map.nexttowercolour(); map.nexttowercolour();
music.playef(Sound_VIRIDIAN); music.playef(Sound_VIRIDIAN);
} }
if (game.currentmenuoption == -2)
{
// gameplay menu
music.playef(Sound_VIRIDIAN);
game.createmenu(Menu::graphicoptions, true);
map.nexttowercolour();
}
if (game.currentmenuoption == -1)
{
// audio menu
music.playef(Sound_VIRIDIAN);
game.createmenu(Menu::touch_input, true);
map.nexttowercolour();
}
break; break;
case Menu::language: case Menu::language:
{ {
@ -2600,6 +2616,7 @@ void titleinput(void)
{ {
slidermodeinput(); slidermodeinput();
} }
touch::update_sliders();
} }
if (game.currentmenuoption < 0) game.currentmenuoption = game.menuoptions.size()-1; if (game.currentmenuoption < 0) game.currentmenuoption = game.menuoptions.size()-1;

View file

@ -512,6 +512,20 @@ static void menurender(void)
break; break;
} }
case Menu::audiooptions: case Menu::audiooptions:
if (key.using_touch)
{
font::print(PR_2X | PR_CEN, -1, 30, loc::gettext("Audio Options"), tr, tg, tb);
if (music.mmmmmm)
{
font::print_wrap(PR_CEN, -1, 65, loc::gettext("Adjust volume settings and soundtrack."), tr, tg, tb);
}
else
{
font::print_wrap(PR_CEN, -1, 65, loc::gettext("Adjust volume settings."), tr, tg, tb);
}
}
else
{
switch (game.currentmenuoption) switch (game.currentmenuoption)
{ {
case 0: case 0:
@ -546,6 +560,7 @@ static void menurender(void)
font::print_wrap(PR_CEN, -1, next_y, soundtrack, tr, tg, tb); font::print_wrap(PR_CEN, -1, next_y, soundtrack, tr, tg, tb);
break; break;
} }
}
} }
break; break;

View file

@ -150,6 +150,19 @@ namespace touch
register_button(button); register_button(button);
} }
void create_slider_button(int x, int y, int width, int height, std::string text, int* var, int minvalue, int maxvalue)
{
TouchButton button = create_button(x, y, width, height, text);
button.type = TOUCH_BUTTON_TYPE_MENU_SLIDER;
button.id = -1;
button.disabled = false;
button.min = minvalue;
button.max = maxvalue;
button.var = var;
register_button(button);
}
void create_toggle_button(int x, int y, int width, int height, std::string text, int id, bool checked) void create_toggle_button(int x, int y, int width, int height, std::string text, int id, bool checked)
{ {
TouchButton button = create_button(x, y, width, height, text); TouchButton button = create_button(x, y, width, height, text);
@ -186,6 +199,7 @@ namespace touch
menuactionpress(); menuactionpress();
break; break;
case TOUCH_BUTTON_TYPE_NONE: case TOUCH_BUTTON_TYPE_NONE:
case TOUCH_BUTTON_TYPE_MENU_SLIDER:
default: default:
break; break;
} }
@ -281,6 +295,38 @@ namespace touch
} }
} }
void update_sliders()
{
SDL_Rect stretch_rect;
graphics.get_stretch_info(&stretch_rect);
for (int i = 0; i < all_buttons.size(); i++)
{
TouchButton* button = all_buttons[i];
if (button->type == TOUCH_BUTTON_TYPE_MENU_SLIDER && button->pressed)
{
int value = *button->var;
int range = button->max - button->min;
float percent = (float) (value - button->min) / range;
int finger_x = (fingers[button->fingerId].x - stretch_rect.x) * SCREEN_WIDTH_PIXELS / stretch_rect.w;
int newvalue = button->min + (int) ((finger_x - button->x) / (float)button->width * range);
if (newvalue < button->min)
{
newvalue = button->min;
}
if (newvalue > button->max)
{
newvalue = button->max;
}
*button->var = newvalue;
}
}
}
void render_buttons(int scale, bool ui, int r, int g, int b) void render_buttons(int scale, bool ui, int r, int g, int b)
{ {
for (int i = 0; i < all_buttons.size(); i++) for (int i = 0; i < all_buttons.size(); i++)
@ -325,6 +371,27 @@ namespace touch
switch (button->type) switch (button->type)
{ {
case TOUCH_BUTTON_TYPE_MENU_SLIDER:
{
// Find where the slider position is!
int value = *button->var;
int range = button->max - button->min;
float percent = (float) (value - button->min) / range;
int sliderpos = (int) ((button->width - 10) * percent);
// Draw track
graphics.fill_rect(button->x * scale + 2, (button->y + (button->height / 2)) * scale, button->width, 4, use_r / shadow_div, use_g / shadow_div, use_b / shadow_div);
graphics.fill_rect(button->x * scale, (button->y + (button->height / 2) - 2) * scale, button->width, 4, use_r / inner_div, use_g / inner_div, use_b / inner_div);
// Draw slider
graphics.fill_rect((button->x + sliderpos + 2) * scale, (button->y + (button->height / 2) - 3) * scale, 10, 10, use_r / shadow_div, use_g / shadow_div, use_b / shadow_div);
graphics.fill_rect((button->x + sliderpos) * scale, (button->y + (button->height / 2) - 5) * scale, 10, 10, use_r, use_g, use_b);
graphics.fill_rect((button->x + sliderpos + 1) * scale, (button->y + (button->height / 2) - 4) * scale, 8, 8, use_r / inner_div, use_g / inner_div, use_b / inner_div);
font::print(PR_CEN | PR_CJK_LOW | font_scale, button->x + (button->width / 2) * scale, button->y * scale, button->text, use_r, use_g, use_b);
break;
}
case TOUCH_BUTTON_TYPE_MENU_TOGGLE: case TOUCH_BUTTON_TYPE_MENU_TOGGLE:
graphics.draw_rect(button->x + offset * scale, button->y + offset * scale, 10, 10, use_r, use_g, use_b); graphics.draw_rect(button->x + offset * scale, button->y + offset * scale, 10, 10, use_r, use_g, use_b);
if (button->checked) if (button->checked)

View file

@ -57,6 +57,7 @@ enum TouchButtonType
TOUCH_BUTTON_TYPE_NONE, TOUCH_BUTTON_TYPE_NONE,
TOUCH_BUTTON_TYPE_MENU, TOUCH_BUTTON_TYPE_MENU,
TOUCH_BUTTON_TYPE_MENU_TOGGLE, TOUCH_BUTTON_TYPE_MENU_TOGGLE,
TOUCH_BUTTON_TYPE_MENU_SLIDER,
TOUCH_BUTTON_TYPE_MAP TOUCH_BUTTON_TYPE_MAP
}; };
@ -74,6 +75,9 @@ struct TouchButton
int id; // The ID for the button, mainly used for menu buttons int id; // The ID for the button, mainly used for menu buttons
bool disabled; // Whether the button is disabled or not (gray and can't use), different from active bool disabled; // Whether the button is disabled or not (gray and can't use), different from active
bool checked; // If this is a checkbox, whether it's checked or not bool checked; // If this is a checkbox, whether it's checked or not
int min; // If this is a slider, this is the minimum value
int max; // If this is a slider, this is the maximum value
int* var; // If this is a slider, this is the variable to modify
std::string text; // The text for the button, if it doesn't have an image std::string text; // The text for the button, if it doesn't have an image
SDL_Texture* image; // The image that gets displayed on the button, can be NULL SDL_Texture* image; // The image that gets displayed on the button, can be NULL
SDL_FingerID fingerId; SDL_FingerID fingerId;
@ -90,6 +94,7 @@ namespace touch
extern bool scroll; extern bool scroll;
void refresh_buttons(void); void refresh_buttons(void);
void update_sliders();
void reset(void); void reset(void);
void on_menu_create(void); void on_menu_create(void);
void update_buttons(void); void update_buttons(void);
@ -99,6 +104,7 @@ namespace touch
void create_menu_button(int x, int y, int width, int height, std::string text, int id); void create_menu_button(int x, int y, int width, int height, std::string text, int id);
void create_menu_button(int x, int y, int width, int height, std::string text, int id, bool disabled); void create_menu_button(int x, int y, int width, int height, std::string text, int id, bool disabled);
void create_slider_button(int x, int y, int width, int height, std::string text, int* var, int minvalue, int maxvalue);
void create_toggle_button(int x, int y, int width, int height, std::string text, int id, bool checked); void create_toggle_button(int x, int y, int width, int height, std::string text, int id, bool checked);
void remove_dynamic_buttons(void); void remove_dynamic_buttons(void);