diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fa3419..86508a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,11 @@ - Marker Selection - Fix screen filter not resizing properly - Controller mapping +- Visible controls + - Start + - Options + - Left / Right + - Back ## Misc - Handling Resolution changes diff --git a/TODO.md b/TODO.md index 34c0557..142fb0b 100644 --- a/TODO.md +++ b/TODO.md @@ -2,8 +2,7 @@ ## Misc ## Music Select Screen -- Visible controls - - Start Button +- Start Button Action ## Gameplay Screen diff --git a/meson.build b/meson.build index c4950e7..e1bb548 100644 --- a/meson.build +++ b/meson.build @@ -47,22 +47,24 @@ sources = [ # 'src/Resources/CoverAtlas.hpp', # 'src/Resources/CoverAtlas.cpp', # 'src/Screens/Gameplay.hpp', - '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/Drawables/ControlPanels.hpp', + 'src/Screens/MusicSelect/Drawables/ControlPanels.cpp', 'src/Screens/MusicSelect/Options/OptionPage.hpp', 'src/Screens/MusicSelect/Options/OptionPage.cpp', '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.cpp', 'src/Screens/MusicSelect/Panels/Panel.hpp', 'src/Screens/MusicSelect/Panels/Panel.cpp', '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.cpp', 'src/Screens/MusicSelect/Ribbon.hpp', diff --git a/src/Main.cpp b/src/Main.cpp index 4ff5c7c..9fe2a4f 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -17,8 +17,17 @@ int main(int, char const **) { + // Load prefs, music, markers const std::string jujube_path = whereami::executable_dir(); 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; settings.antialiasingLevel = 8; sf::RenderWindow window{ @@ -30,12 +39,6 @@ int main(int, char const **) { preferences.screen.fullscreen ? sf::Style::Fullscreen : sf::Style::Default, 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); /* while (true) { diff --git a/src/Screens/MusicSelect/Drawables/ControlPanels.cpp b/src/Screens/MusicSelect/Drawables/ControlPanels.cpp new file mode 100644 index 0000000..324eab0 --- /dev/null +++ b/src/Screens/MusicSelect/Drawables/ControlPanels.cpp @@ -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(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(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(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); + } +} \ No newline at end of file diff --git a/src/Screens/MusicSelect/Drawables/ControlPanels.hpp b/src/Screens/MusicSelect/Drawables/ControlPanels.hpp new file mode 100644 index 0000000..adb052a --- /dev/null +++ b/src/Screens/MusicSelect/Drawables/ControlPanels.hpp @@ -0,0 +1,42 @@ +#pragma once + +#include + +#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; + }; +} \ No newline at end of file diff --git a/src/Screens/MusicSelect/MusicSelect.cpp b/src/Screens/MusicSelect/MusicSelect.cpp index ee8e085..500260c 100644 --- a/src/Screens/MusicSelect/MusicSelect.cpp +++ b/src/Screens/MusicSelect/MusicSelect.cpp @@ -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), song_info(t_resources), main_option_page(t_resources), + options_button(t_resources), + start_button(t_resources), 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; } @@ -33,6 +35,8 @@ void MusicSelect::Screen::select_chart(sf::RenderWindow& window) { ribbon.setPosition(get_ribbon_x(), get_ribbon_y()); resources.button_highlight.setPosition(get_ribbon_x(), get_ribbon_y()); 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()) { sf::Event event; while (window.pollEvent(event)) { @@ -58,6 +62,8 @@ void MusicSelect::Screen::select_chart(sf::RenderWindow& window) { if (not resources.options_state.empty()) { 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; default: break; @@ -66,6 +72,8 @@ void MusicSelect::Screen::select_chart(sf::RenderWindow& window) { ImGui::SFML::Update(window, imguiClock.restart()); window.clear(sf::Color(7, 23, 53)); window.draw(ribbon); + window.draw(options_button); + window.draw(start_button); window.draw(song_info); if (not resources.options_state.empty()) { 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) { resources.button_highlight.button_pressed(button); auto button_index = Data::button_to_index(button); - if (button_index < 12) { + if (button_index < 14) { ribbon.click_on(button); } else { 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 if (resources.options_state.empty()) { resources.options_state.push_back(main_option_page); diff --git a/src/Screens/MusicSelect/MusicSelect.hpp b/src/Screens/MusicSelect/MusicSelect.hpp index acba0db..5cde029 100644 --- a/src/Screens/MusicSelect/MusicSelect.hpp +++ b/src/Screens/MusicSelect/MusicSelect.hpp @@ -17,6 +17,7 @@ #include "SongInfo.hpp" #include "SharedResources.hpp" #include "Options/OptionPage.hpp" +#include "Drawables/ControlPanels.hpp" namespace MusicSelect { @@ -32,13 +33,13 @@ namespace MusicSelect { void select_chart(sf::RenderWindow& window); void draw_debug() override; private: - // Data const Data::SongList song_list; - // State Ribbon ribbon; SongInfo song_info; MainOptionPage main_option_page; + OptionsButton options_button; + StartButton start_button; Drawables::BlackFrame black_frame; sf::RectangleShape panel_filter; diff --git a/src/Screens/MusicSelect/Options/InputRemap.cpp b/src/Screens/MusicSelect/Options/InputRemap.cpp index 5e412e0..e2a65b6 100644 --- a/src/Screens/MusicSelect/Options/InputRemap.cpp +++ b/src/Screens/MusicSelect/Options/InputRemap.cpp @@ -178,15 +178,15 @@ namespace MusicSelect { mapping_preview.setPosition(get_big_cover_x(), get_big_cover_y()); target.draw(mapping_preview); if (confirm_clock) { - if (confirm_clock->getElapsedTime() > sf::seconds(5)) { - preferences.key_mapping = Data::KeyMapping{m_key_to_button}; + auto countdown_time = confirm_clock->getElapsedTime(); + if (countdown_time < sf::seconds(5)) { + std::string seconds = std::to_string(5 - static_cast(countdown_time.asSeconds())); + big_number.setString(seconds); + big_number.setCharacterSize(static_cast(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(confirm_clock->getElapsedTime().asSeconds())); - big_number.setString(seconds); - big_number.setCharacterSize(static_cast(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; confirm_text_top.setCharacterSize(static_cast(text_size)); confirm_text_bottom.setCharacterSize(static_cast(text_size)); diff --git a/src/Screens/MusicSelect/Options/OptionPage.cpp b/src/Screens/MusicSelect/Options/OptionPage.cpp index f09f565..3b21d49 100644 --- a/src/Screens/MusicSelect/Options/OptionPage.cpp +++ b/src/Screens/MusicSelect/Options/OptionPage.cpp @@ -17,7 +17,8 @@ namespace MusicSelect { RibbonPage::RibbonPage(const PanelLayout& layout, SharedResources& 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 { states.transform *= getTransform(); 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) : diff --git a/src/Screens/MusicSelect/Options/OptionPage.hpp b/src/Screens/MusicSelect/Options/OptionPage.hpp index 0e51a28..fd8b43d 100644 --- a/src/Screens/MusicSelect/Options/OptionPage.hpp +++ b/src/Screens/MusicSelect/Options/OptionPage.hpp @@ -5,6 +5,7 @@ #include #include "../../../Data/Buttons.hpp" +#include "../Drawables/ControlPanels.hpp" #include "../Ribbon.hpp" #include "../SharedResources.hpp" @@ -25,9 +26,6 @@ namespace MusicSelect { const std::string name; }; - class ButtonRemapping : public OptionPage { - }; - class RibbonPage : public OptionPage { public: RibbonPage(const PanelLayout& layout, SharedResources& t_resources); @@ -36,6 +34,7 @@ namespace MusicSelect { private: void draw(sf::RenderTarget& target, sf::RenderStates states) const override; Ribbon m_ribbon; + mutable BackButton back_button; }; class MainOptionPage final : public RibbonPage { diff --git a/src/Screens/MusicSelect/Panels/Panel.cpp b/src/Screens/MusicSelect/Panels/Panel.cpp index 15c97c1..cae512d 100644 --- a/src/Screens/MusicSelect/Panels/Panel.cpp +++ b/src/Screens/MusicSelect/Panels/Panel.cpp @@ -6,7 +6,6 @@ #include "../../../Toolkit/HSL.hpp" #include "../../../Toolkit/NormalizedOrigin.hpp" - #include "../Ribbon.hpp" #include "../SharedResources.hpp" diff --git a/src/Screens/MusicSelect/Panels/Panel.hpp b/src/Screens/MusicSelect/Panels/Panel.hpp index f20ea5d..ec6b425 100644 --- a/src/Screens/MusicSelect/Panels/Panel.hpp +++ b/src/Screens/MusicSelect/Panels/Panel.hpp @@ -6,6 +6,7 @@ #include #include +#include "../../../Data/Buttons.hpp" #include "../../../Data/Song.hpp" #include "../../../Toolkit/AffineTransform.hpp" #include "../DensityGraph.hpp" diff --git a/src/Screens/MusicSelect/Ribbon.cpp b/src/Screens/MusicSelect/Ribbon.cpp index ec7fef1..db36e52 100644 --- a/src/Screens/MusicSelect/Ribbon.cpp +++ b/src/Screens/MusicSelect/Ribbon.cpp @@ -67,7 +67,9 @@ namespace MusicSelect { Ribbon::Ribbon(PanelLayout layout, SharedResources& 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; } @@ -87,7 +89,17 @@ namespace MusicSelect { } 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() { @@ -139,6 +151,12 @@ namespace MusicSelect { void Ribbon::draw(sf::RenderTarget &target, sf::RenderStates states) const { 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 (not m_move_animation->ended()) { return draw_with_animation(target, states); diff --git a/src/Screens/MusicSelect/Ribbon.hpp b/src/Screens/MusicSelect/Ribbon.hpp index c5a7ac9..8fa5a1f 100644 --- a/src/Screens/MusicSelect/Ribbon.hpp +++ b/src/Screens/MusicSelect/Ribbon.hpp @@ -13,6 +13,7 @@ #include "../../Toolkit/EasingFunctions.hpp" #include "SharedResources.hpp" #include "PanelLayout.hpp" +#include "Drawables/ControlPanels.hpp" namespace MusicSelect { @@ -58,5 +59,7 @@ namespace MusicSelect { std::size_t m_position = 0; mutable std::optional m_move_animation; float m_time_factor = 1.f; + mutable LeftButton left_button; + mutable RightButton right_button; }; } \ No newline at end of file