1
0
mirror of synced 2025-02-08 22:59:41 +01:00

Visible Controls

This commit is contained in:
Stepland 2020-03-08 14:39:37 +01:00
parent f4a4dc7de7
commit 62a042184c
15 changed files with 229 additions and 41 deletions

View File

@ -34,6 +34,11 @@
- Marker Selection - Marker Selection
- Fix screen filter not resizing properly - Fix screen filter not resizing properly
- Controller mapping - Controller mapping
- Visible controls
- Start
- Options
- Left / Right
- Back
## Misc ## Misc
- Handling Resolution changes - Handling Resolution changes

View File

@ -2,8 +2,7 @@
## Misc ## Misc
## Music Select Screen ## Music Select Screen
- Visible controls - Start Button Action
- Start Button
## Gameplay Screen ## Gameplay Screen

View File

@ -47,22 +47,24 @@ sources = [
# 'src/Resources/CoverAtlas.hpp', # 'src/Resources/CoverAtlas.hpp',
# 'src/Resources/CoverAtlas.cpp', # 'src/Resources/CoverAtlas.cpp',
# 'src/Screens/Gameplay.hpp', # 'src/Screens/Gameplay.hpp',
'src/Screens/MusicSelect/DensityGraph.hpp', 'src/Screens/MusicSelect/Drawables/ControlPanels.hpp',
'src/Screens/MusicSelect/DensityGraph.cpp', 'src/Screens/MusicSelect/Drawables/ControlPanels.cpp',
'src/Screens/MusicSelect/MusicPreview.hpp',
'src/Screens/MusicSelect/MusicPreview.cpp',
'src/Screens/MusicSelect/MusicSelect.hpp',
'src/Screens/MusicSelect/MusicSelect.cpp',
'src/Screens/MusicSelect/Options/OptionPage.hpp', 'src/Screens/MusicSelect/Options/OptionPage.hpp',
'src/Screens/MusicSelect/Options/OptionPage.cpp', 'src/Screens/MusicSelect/Options/OptionPage.cpp',
'src/Screens/MusicSelect/Options/InputRemap.hpp', 'src/Screens/MusicSelect/Options/InputRemap.hpp',
'src/Screens/MusicSelect/Options/InputRemap.cpp', 'src/Screens/MusicSelect/Options/InputRemap.cpp',
'src/Screens/MusicSelect/Panels/MarkerPanel.hpp', 'src/Screens/MusicSelect/Panels/MarkerPanel.hpp',
'src/Screens/MusicSelect/Panels/MarkerPanel.cpp', 'src/Screens/MusicSelect/Panels/MarkerPanel.cpp',
'src/Screens/MusicSelect/Panels/Panel.hpp', 'src/Screens/MusicSelect/Panels/Panel.hpp',
'src/Screens/MusicSelect/Panels/Panel.cpp', 'src/Screens/MusicSelect/Panels/Panel.cpp',
'src/Screens/MusicSelect/Panels/SubpagePanel.hpp', 'src/Screens/MusicSelect/Panels/SubpagePanel.hpp',
'src/Screens/MusicSelect/Panels/SubpagePanel.cpp', 'src/Screens/MusicSelect/Panels/SubpagePanel.cpp',
'src/Screens/MusicSelect/DensityGraph.hpp',
'src/Screens/MusicSelect/DensityGraph.cpp',
'src/Screens/MusicSelect/MusicPreview.hpp',
'src/Screens/MusicSelect/MusicPreview.cpp',
'src/Screens/MusicSelect/MusicSelect.hpp',
'src/Screens/MusicSelect/MusicSelect.cpp',
'src/Screens/MusicSelect/PanelLayout.hpp', 'src/Screens/MusicSelect/PanelLayout.hpp',
'src/Screens/MusicSelect/PanelLayout.cpp', 'src/Screens/MusicSelect/PanelLayout.cpp',
'src/Screens/MusicSelect/Ribbon.hpp', 'src/Screens/MusicSelect/Ribbon.hpp',

View File

@ -17,8 +17,17 @@
int main(int, char const **) { int main(int, char const **) {
// Load prefs, music, markers
const std::string jujube_path = whereami::executable_dir(); const std::string jujube_path = whereami::executable_dir();
Data::Preferences preferences{jujube_path}; Data::Preferences preferences{jujube_path};
Data::SongList song_list{jujube_path};
MusicSelect::SharedResources music_select_resources{preferences};
if (music_select_resources.markers.find(preferences.options.marker) == music_select_resources.markers.end()) {
preferences.options.marker = music_select_resources.markers.begin()->first;
}
MusicSelect::Screen music_select{song_list, music_select_resources};
// Create the window
sf::ContextSettings settings; sf::ContextSettings settings;
settings.antialiasingLevel = 8; settings.antialiasingLevel = 8;
sf::RenderWindow window{ sf::RenderWindow window{
@ -30,12 +39,6 @@ int main(int, char const **) {
preferences.screen.fullscreen ? sf::Style::Fullscreen : sf::Style::Default, preferences.screen.fullscreen ? sf::Style::Fullscreen : sf::Style::Default,
settings settings
}; };
Data::SongList song_list{jujube_path};
MusicSelect::SharedResources music_select_resources{preferences};
if (music_select_resources.markers.find(preferences.options.marker) == music_select_resources.markers.end()) {
preferences.options.marker = music_select_resources.markers.begin()->first;
}
MusicSelect::Screen music_select{song_list, music_select_resources};
music_select.select_chart(window); music_select.select_chart(window);
/* /*
while (true) { while (true) {

View File

@ -0,0 +1,111 @@
#include "ControlPanels.hpp"
#include "../../../Toolkit/NormalizedOrigin.hpp"
namespace MusicSelect {
void LeftButton::draw(sf::RenderTarget& target, sf::RenderStates states) const {
states.transform *= getTransform();
sf::CircleShape circle{get_panel_size()*0.4f};
circle.setFillColor(sf::Color::Black);
circle.setOutlineThickness(0.02f*get_panel_size());
circle.setOutlineColor(sf::Color::White);
Toolkit::set_origin_normalized(circle, 0.5f, 0.5f);
circle.setPosition(get_panel_size()*0.5f, get_panel_size()*0.5f);
target.draw(circle, states);
sf::RectangleShape arrow_part{sf::Vector2f{0.1f,0.4f}*get_panel_size()};
arrow_part.setFillColor(sf::Color::White);
Toolkit::set_origin_normalized(arrow_part, 2.f, 0.5f);
arrow_part.setPosition(get_panel_size()*0.5f, get_panel_size()*0.5f);
arrow_part.move(0.05f*get_panel_size(), 0.f);
arrow_part.rotate(45.f);
target.draw(arrow_part, states);
arrow_part.rotate(-90.f);
target.draw(arrow_part, states);
}
void RightButton::draw(sf::RenderTarget& target, sf::RenderStates states) const {
states.transform *= getTransform();
sf::CircleShape circle{get_panel_size()*0.4f};
circle.setFillColor(sf::Color::Black);
circle.setOutlineThickness(0.02f*get_panel_size());
circle.setOutlineColor(sf::Color::White);
Toolkit::set_origin_normalized(circle, 0.5f, 0.5f);
circle.setPosition(get_panel_size()*0.5f, get_panel_size()*0.5f);
target.draw(circle, states);
sf::RectangleShape arrow_part{sf::Vector2f{0.1f,0.4f}*get_panel_size()};
arrow_part.setFillColor(sf::Color::White);
Toolkit::set_origin_normalized(arrow_part, -1.f, 0.5f);
arrow_part.setPosition(get_panel_size()*0.5f, get_panel_size()*0.5f);
arrow_part.move(-0.05f*get_panel_size(), 0.f);
arrow_part.rotate(45.f);
target.draw(arrow_part, states);
arrow_part.rotate(-90.f);
target.draw(arrow_part, states);
}
void OptionsButton::draw(sf::RenderTarget& target, sf::RenderStates states) const {
states.transform *= getTransform();
sf::CircleShape circle{get_panel_size()*0.4f};
circle.setFillColor(sf::Color::Black);
circle.setOutlineThickness(0.02f*get_panel_size());
circle.setOutlineColor(sf::Color::White);
Toolkit::set_origin_normalized(circle, 0.5f, 0.5f);
circle.setPosition(get_panel_size()*0.5f, get_panel_size()*0.5f);
target.draw(circle, states);
sf::Text label{
"OPTIONS",
resources.fallback_font.black,
static_cast<unsigned int>(0.2f*get_panel_size())
};
label.setFillColor(sf::Color::White);
Toolkit::set_local_origin_normalized(label, 0.5f, 0.5f);
label.setPosition(get_panel_size()*0.5f, get_panel_size()*0.5f);
label.setScale(0.8f, 1.0f);
target.draw(label, states);
}
void StartButton::draw(sf::RenderTarget& target, sf::RenderStates states) const {
states.transform *= getTransform();
sf::CircleShape circle{get_panel_size()*0.4f};
circle.setFillColor(sf::Color::Black);
circle.setOutlineThickness(0.02f*get_panel_size());
circle.setOutlineColor(resources.BSC_color);
Toolkit::set_origin_normalized(circle, 0.5f, 0.5f);
circle.setPosition(get_panel_size()*0.5f, get_panel_size()*0.5f);
target.draw(circle, states);
sf::Text label{
"START",
resources.fallback_font.black,
static_cast<unsigned int>(0.2f*get_panel_size())
};
label.setFillColor(resources.BSC_color);
Toolkit::set_local_origin_normalized(label, 0.5f, 0.5f);
label.setPosition(get_panel_size()*0.5f, get_panel_size()*0.5f);
target.draw(label, states);
}
void BackButton::draw(sf::RenderTarget& target, sf::RenderStates states) const {
states.transform *= getTransform();
sf::CircleShape circle{get_panel_size()*0.4f};
circle.setFillColor(sf::Color::Black);
circle.setOutlineThickness(0.02f*get_panel_size());
circle.setOutlineColor(resources.EXT_color);
Toolkit::set_origin_normalized(circle, 0.5f, 0.5f);
circle.setPosition(get_panel_size()*0.5f, get_panel_size()*0.5f);
target.draw(circle, states);
sf::Text label{
"BACK",
resources.fallback_font.black,
static_cast<unsigned int>(0.2f*get_panel_size())
};
label.setFillColor(resources.EXT_color);
Toolkit::set_local_origin_normalized(label, 0.5f, 0.5f);
label.setPosition(get_panel_size()*0.5f, get_panel_size()*0.5f);
target.draw(label, states);
}
}

View File

@ -0,0 +1,42 @@
#pragma once
#include <SFML/Graphics.hpp>
#include "../SharedResources.hpp"
namespace MusicSelect {
class LeftButton final : public sf::Drawable, public sf::Transformable, public HoldsSharedResources {
public:
using HoldsSharedResources::HoldsSharedResources;
private:
void draw(sf::RenderTarget& target, sf::RenderStates states) const override;
};
class RightButton final : public sf::Drawable, public sf::Transformable, public HoldsSharedResources {
public:
using HoldsSharedResources::HoldsSharedResources;
private:
void draw(sf::RenderTarget& target, sf::RenderStates states) const override;
};
class OptionsButton final : public sf::Drawable, public sf::Transformable, public HoldsSharedResources {
public:
using HoldsSharedResources::HoldsSharedResources;
private:
void draw(sf::RenderTarget& target, sf::RenderStates states) const override;
};
class StartButton final : public sf::Drawable, public sf::Transformable, public HoldsSharedResources {
public:
using HoldsSharedResources::HoldsSharedResources;
private:
void draw(sf::RenderTarget& target, sf::RenderStates states) const override;
};
class BackButton final : public sf::Drawable, public sf::Transformable, public HoldsSharedResources {
public:
using HoldsSharedResources::HoldsSharedResources;
private:
void draw(sf::RenderTarget& target, sf::RenderStates states) const override;
};
}

View File

@ -19,9 +19,11 @@ MusicSelect::Screen::Screen(const Data::SongList& t_song_list, SharedResources&
ribbon(PanelLayout::title_sort(t_song_list, t_resources), t_resources), ribbon(PanelLayout::title_sort(t_song_list, t_resources), t_resources),
song_info(t_resources), song_info(t_resources),
main_option_page(t_resources), main_option_page(t_resources),
options_button(t_resources),
start_button(t_resources),
black_frame(t_resources.preferences) black_frame(t_resources.preferences)
{ {
panel_filter.setFillColor(sf::Color(0,0,0,128)); panel_filter.setFillColor(sf::Color(0,0,0,200));
std::cout << "loaded MusicSelect::Screen" << std::endl; std::cout << "loaded MusicSelect::Screen" << std::endl;
} }
@ -33,6 +35,8 @@ void MusicSelect::Screen::select_chart(sf::RenderWindow& window) {
ribbon.setPosition(get_ribbon_x(), get_ribbon_y()); ribbon.setPosition(get_ribbon_x(), get_ribbon_y());
resources.button_highlight.setPosition(get_ribbon_x(), get_ribbon_y()); resources.button_highlight.setPosition(get_ribbon_x(), get_ribbon_y());
panel_filter.setSize(sf::Vector2f{window.getSize()}); panel_filter.setSize(sf::Vector2f{window.getSize()});
options_button.setPosition(get_ribbon_x()+2.f*get_panel_step(), get_ribbon_y()+3.f*get_panel_step());
start_button.setPosition(get_ribbon_x()+3.f*get_panel_step(), get_ribbon_y()+3.f*get_panel_step());
while ((not chart_selected) and window.isOpen()) { while ((not chart_selected) and window.isOpen()) {
sf::Event event; sf::Event event;
while (window.pollEvent(event)) { while (window.pollEvent(event)) {
@ -58,6 +62,8 @@ void MusicSelect::Screen::select_chart(sf::RenderWindow& window) {
if (not resources.options_state.empty()) { if (not resources.options_state.empty()) {
resources.options_state.back().get().update(); resources.options_state.back().get().update();
} }
options_button.setPosition(get_ribbon_x()+2.f*get_panel_step(), get_ribbon_y()+3.f*get_panel_step());
start_button.setPosition(get_ribbon_x()+3.f*get_panel_step(), get_ribbon_y()+3.f*get_panel_step());
break; break;
default: default:
break; break;
@ -66,6 +72,8 @@ void MusicSelect::Screen::select_chart(sf::RenderWindow& window) {
ImGui::SFML::Update(window, imguiClock.restart()); ImGui::SFML::Update(window, imguiClock.restart());
window.clear(sf::Color(7, 23, 53)); window.clear(sf::Color(7, 23, 53));
window.draw(ribbon); window.draw(ribbon);
window.draw(options_button);
window.draw(start_button);
window.draw(song_info); window.draw(song_info);
if (not resources.options_state.empty()) { if (not resources.options_state.empty()) {
window.draw(panel_filter); window.draw(panel_filter);
@ -193,16 +201,10 @@ void MusicSelect::Screen::handle_mouse_click(const sf::Event::MouseButtonEvent&
void MusicSelect::Screen::press_button(const Data::Button& button) { void MusicSelect::Screen::press_button(const Data::Button& button) {
resources.button_highlight.button_pressed(button); resources.button_highlight.button_pressed(button);
auto button_index = Data::button_to_index(button); auto button_index = Data::button_to_index(button);
if (button_index < 12) { if (button_index < 14) {
ribbon.click_on(button); ribbon.click_on(button);
} else { } else {
switch (button) { switch (button) {
case Data::Button::B13: // Left Arrow
ribbon.move_left();
break;
case Data::Button::B14: // Right Arrow
ribbon.move_right();
break;
case Data::Button::B15: // Options Menu case Data::Button::B15: // Options Menu
if (resources.options_state.empty()) { if (resources.options_state.empty()) {
resources.options_state.push_back(main_option_page); resources.options_state.push_back(main_option_page);

View File

@ -17,6 +17,7 @@
#include "SongInfo.hpp" #include "SongInfo.hpp"
#include "SharedResources.hpp" #include "SharedResources.hpp"
#include "Options/OptionPage.hpp" #include "Options/OptionPage.hpp"
#include "Drawables/ControlPanels.hpp"
namespace MusicSelect { namespace MusicSelect {
@ -32,13 +33,13 @@ namespace MusicSelect {
void select_chart(sf::RenderWindow& window); void select_chart(sf::RenderWindow& window);
void draw_debug() override; void draw_debug() override;
private: private:
// Data
const Data::SongList song_list; const Data::SongList song_list;
// State
Ribbon ribbon; Ribbon ribbon;
SongInfo song_info; SongInfo song_info;
MainOptionPage main_option_page; MainOptionPage main_option_page;
OptionsButton options_button;
StartButton start_button;
Drawables::BlackFrame black_frame; Drawables::BlackFrame black_frame;
sf::RectangleShape panel_filter; sf::RectangleShape panel_filter;

View File

@ -178,15 +178,15 @@ namespace MusicSelect {
mapping_preview.setPosition(get_big_cover_x(), get_big_cover_y()); mapping_preview.setPosition(get_big_cover_x(), get_big_cover_y());
target.draw(mapping_preview); target.draw(mapping_preview);
if (confirm_clock) { if (confirm_clock) {
if (confirm_clock->getElapsedTime() > sf::seconds(5)) { auto countdown_time = confirm_clock->getElapsedTime();
preferences.key_mapping = Data::KeyMapping{m_key_to_button}; if (countdown_time < sf::seconds(5)) {
std::string seconds = std::to_string(5 - static_cast<int>(countdown_time.asSeconds()));
big_number.setString(seconds);
big_number.setCharacterSize(static_cast<unsigned int>(3*get_panel_step()));
Toolkit::set_local_origin_normalized(big_number, 0.5f, 0.5f);
big_number.setPosition(get_ribbon_size()*0.5f, get_ribbon_size()*0.5f);
target.draw(big_number, states);
} }
std::string seconds = std::to_string(5 - static_cast<int>(confirm_clock->getElapsedTime().asSeconds()));
big_number.setString(seconds);
big_number.setCharacterSize(static_cast<unsigned int>(3*get_panel_step()));
Toolkit::set_local_origin_normalized(big_number, 0.5f, 0.5f);
big_number.setPosition(get_ribbon_size()*0.5f, get_ribbon_size()*0.5f);
target.draw(big_number, states);
auto text_size = 0.1f*grid_size; auto text_size = 0.1f*grid_size;
confirm_text_top.setCharacterSize(static_cast<unsigned int>(text_size)); confirm_text_top.setCharacterSize(static_cast<unsigned int>(text_size));
confirm_text_bottom.setCharacterSize(static_cast<unsigned int>(text_size)); confirm_text_bottom.setCharacterSize(static_cast<unsigned int>(text_size));

View File

@ -17,7 +17,8 @@ namespace MusicSelect {
RibbonPage::RibbonPage(const PanelLayout& layout, SharedResources& t_resources) : RibbonPage::RibbonPage(const PanelLayout& layout, SharedResources& t_resources) :
OptionPage(t_resources), OptionPage(t_resources),
m_ribbon(layout, t_resources) m_ribbon(layout, t_resources),
back_button(t_resources)
{ {
} }
@ -56,6 +57,8 @@ namespace MusicSelect {
void RibbonPage::draw(sf::RenderTarget& target, sf::RenderStates states) const { void RibbonPage::draw(sf::RenderTarget& target, sf::RenderStates states) const {
states.transform *= getTransform(); states.transform *= getTransform();
target.draw(m_ribbon, states); target.draw(m_ribbon, states);
back_button.setPosition(2.f*get_panel_step(), 3.f*get_panel_step());
target.draw(back_button, states);
} }
MainOptionPage::MainOptionPage(SharedResources& t_resources) : MainOptionPage::MainOptionPage(SharedResources& t_resources) :

View File

@ -5,6 +5,7 @@
#include <SFML/Window/Event.hpp> #include <SFML/Window/Event.hpp>
#include "../../../Data/Buttons.hpp" #include "../../../Data/Buttons.hpp"
#include "../Drawables/ControlPanels.hpp"
#include "../Ribbon.hpp" #include "../Ribbon.hpp"
#include "../SharedResources.hpp" #include "../SharedResources.hpp"
@ -25,9 +26,6 @@ namespace MusicSelect {
const std::string name; const std::string name;
}; };
class ButtonRemapping : public OptionPage {
};
class RibbonPage : public OptionPage { class RibbonPage : public OptionPage {
public: public:
RibbonPage(const PanelLayout& layout, SharedResources& t_resources); RibbonPage(const PanelLayout& layout, SharedResources& t_resources);
@ -36,6 +34,7 @@ namespace MusicSelect {
private: private:
void draw(sf::RenderTarget& target, sf::RenderStates states) const override; void draw(sf::RenderTarget& target, sf::RenderStates states) const override;
Ribbon m_ribbon; Ribbon m_ribbon;
mutable BackButton back_button;
}; };
class MainOptionPage final : public RibbonPage { class MainOptionPage final : public RibbonPage {

View File

@ -6,7 +6,6 @@
#include "../../../Toolkit/HSL.hpp" #include "../../../Toolkit/HSL.hpp"
#include "../../../Toolkit/NormalizedOrigin.hpp" #include "../../../Toolkit/NormalizedOrigin.hpp"
#include "../Ribbon.hpp" #include "../Ribbon.hpp"
#include "../SharedResources.hpp" #include "../SharedResources.hpp"

View File

@ -6,6 +6,7 @@
#include <SFML/Graphics.hpp> #include <SFML/Graphics.hpp>
#include <SFML/Window.hpp> #include <SFML/Window.hpp>
#include "../../../Data/Buttons.hpp"
#include "../../../Data/Song.hpp" #include "../../../Data/Song.hpp"
#include "../../../Toolkit/AffineTransform.hpp" #include "../../../Toolkit/AffineTransform.hpp"
#include "../DensityGraph.hpp" #include "../DensityGraph.hpp"

View File

@ -67,7 +67,9 @@ namespace MusicSelect {
Ribbon::Ribbon(PanelLayout layout, SharedResources& t_resources) : Ribbon::Ribbon(PanelLayout layout, SharedResources& t_resources) :
HoldsSharedResources(t_resources), HoldsSharedResources(t_resources),
m_layout(layout) m_layout(layout),
left_button(t_resources),
right_button(t_resources)
{ {
std::cout << "Loaded MusicSelect::Ribbon" << std::endl; std::cout << "Loaded MusicSelect::Ribbon" << std::endl;
} }
@ -87,7 +89,17 @@ namespace MusicSelect {
} }
void Ribbon::click_on(const Data::Button& button) { void Ribbon::click_on(const Data::Button& button) {
get_panel_under_button(button)->click(*this, button); switch (button) {
case Data::Button::B13: // Left Arrow
move_left();
break;
case Data::Button::B14: // Right Arrow
move_right();
break;
default:
get_panel_under_button(button)->click(*this, button);
break;
}
} }
void Ribbon::move_right() { void Ribbon::move_right() {
@ -139,6 +151,12 @@ namespace MusicSelect {
void Ribbon::draw(sf::RenderTarget &target, sf::RenderStates states) const { void Ribbon::draw(sf::RenderTarget &target, sf::RenderStates states) const {
states.transform *= getTransform(); states.transform *= getTransform();
left_button.setPosition(0.f, 3.f*get_panel_step());
target.draw(left_button, states);
right_button.setPosition(get_panel_step(), 3.f*get_panel_step());
target.draw(right_button, states);
if (m_move_animation) { if (m_move_animation) {
if (not m_move_animation->ended()) { if (not m_move_animation->ended()) {
return draw_with_animation(target, states); return draw_with_animation(target, states);

View File

@ -13,6 +13,7 @@
#include "../../Toolkit/EasingFunctions.hpp" #include "../../Toolkit/EasingFunctions.hpp"
#include "SharedResources.hpp" #include "SharedResources.hpp"
#include "PanelLayout.hpp" #include "PanelLayout.hpp"
#include "Drawables/ControlPanels.hpp"
namespace MusicSelect { namespace MusicSelect {
@ -58,5 +59,7 @@ namespace MusicSelect {
std::size_t m_position = 0; std::size_t m_position = 0;
mutable std::optional<MoveAnimation> m_move_animation; mutable std::optional<MoveAnimation> m_move_animation;
float m_time_factor = 1.f; float m_time_factor = 1.f;
mutable LeftButton left_button;
mutable RightButton right_button;
}; };
} }