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:
parent
59a97d2404
commit
e96d1391cd
5 changed files with 150 additions and 27 deletions
|
@ -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"));
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue