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
- Fix screen filter not resizing properly
- Controller mapping
- Visible controls
- Start
- Options
- Left / Right
- Back
## Misc
- Handling Resolution changes

View File

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

View File

@ -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',

View File

@ -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) {

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),
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);

View File

@ -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;

View File

@ -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};
}
std::string seconds = std::to_string(5 - static_cast<int>(confirm_clock->getElapsedTime().asSeconds()));
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);
}
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));

View File

@ -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) :

View File

@ -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 {

View File

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

View File

@ -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"

View File

@ -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) {
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);

View File

@ -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;
};
}