Visible Controls
This commit is contained in:
parent
f4a4dc7de7
commit
62a042184c
@ -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
|
||||
|
3
TODO.md
3
TODO.md
@ -2,8 +2,7 @@
|
||||
## Misc
|
||||
|
||||
## Music Select Screen
|
||||
- Visible controls
|
||||
- Start Button
|
||||
- Start Button Action
|
||||
|
||||
## Gameplay Screen
|
||||
|
||||
|
14
meson.build
14
meson.build
@ -47,12 +47,8 @@ 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',
|
||||
@ -63,6 +59,12 @@ sources = [
|
||||
'src/Screens/MusicSelect/Panels/Panel.cpp',
|
||||
'src/Screens/MusicSelect/Panels/SubpagePanel.hpp',
|
||||
'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',
|
||||
|
15
src/Main.cpp
15
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) {
|
||||
|
111
src/Screens/MusicSelect/Drawables/ControlPanels.cpp
Normal file
111
src/Screens/MusicSelect/Drawables/ControlPanels.cpp
Normal 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);
|
||||
}
|
||||
}
|
42
src/Screens/MusicSelect/Drawables/ControlPanels.hpp
Normal file
42
src/Screens/MusicSelect/Drawables/ControlPanels.hpp
Normal 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;
|
||||
};
|
||||
}
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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<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;
|
||||
confirm_text_top.setCharacterSize(static_cast<unsigned int>(text_size));
|
||||
confirm_text_bottom.setCharacterSize(static_cast<unsigned int>(text_size));
|
||||
|
@ -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) :
|
||||
|
@ -5,6 +5,7 @@
|
||||
#include <SFML/Window/Event.hpp>
|
||||
|
||||
#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 {
|
||||
|
@ -6,7 +6,6 @@
|
||||
|
||||
#include "../../../Toolkit/HSL.hpp"
|
||||
#include "../../../Toolkit/NormalizedOrigin.hpp"
|
||||
|
||||
#include "../Ribbon.hpp"
|
||||
#include "../SharedResources.hpp"
|
||||
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include <SFML/Graphics.hpp>
|
||||
#include <SFML/Window.hpp>
|
||||
|
||||
#include "../../../Data/Buttons.hpp"
|
||||
#include "../../../Data/Song.hpp"
|
||||
#include "../../../Toolkit/AffineTransform.hpp"
|
||||
#include "../DensityGraph.hpp"
|
||||
|
@ -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);
|
||||
|
@ -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<MoveAnimation> m_move_animation;
|
||||
float m_time_factor = 1.f;
|
||||
mutable LeftButton left_button;
|
||||
mutable RightButton right_button;
|
||||
};
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user