2021-05-28 19:50:57 +02:00
|
|
|
#include "classicgame.h"
|
2021-05-31 19:04:16 +02:00
|
|
|
#include "classicinputtype.h"
|
2021-06-07 20:19:58 +02:00
|
|
|
#include "classictimeline.h"
|
2021-06-09 20:08:58 +02:00
|
|
|
#include "classicviewmanager.h"
|
2021-06-08 20:32:36 +02:00
|
|
|
#include "classicnote.h"
|
2021-05-28 19:50:57 +02:00
|
|
|
|
2021-06-07 20:19:58 +02:00
|
|
|
ClassicGame::ClassicGame() :
|
2021-06-09 20:08:58 +02:00
|
|
|
_timeline(std::make_unique<ClassicTimeline>()),
|
|
|
|
_view_manager(std::make_unique<ClassicViewManager>())
|
2021-05-31 19:04:16 +02:00
|
|
|
{
|
2021-06-11 18:58:44 +02:00
|
|
|
_font.loadFromFile("VeraMono.ttf");
|
2021-05-31 19:04:16 +02:00
|
|
|
_keys_to_buttons =
|
|
|
|
{
|
|
|
|
{sf::Keyboard::Up, Button::UP}, // Load from settings
|
|
|
|
{sf::Keyboard::Right, Button::RIGHT},
|
|
|
|
{sf::Keyboard::Down, Button::DOWN},
|
|
|
|
{sf::Keyboard::Left, Button::LEFT},
|
|
|
|
|
|
|
|
{sf::Keyboard::W, Button::UP},
|
|
|
|
{sf::Keyboard::D, Button::RIGHT},
|
|
|
|
{sf::Keyboard::S, Button::DOWN},
|
|
|
|
{sf::Keyboard::A, Button::LEFT},
|
|
|
|
|
|
|
|
{sf::Keyboard::E, Button::SLIDER_RIGHT},
|
|
|
|
{sf::Keyboard::Q, Button::SLIDER_LEFT}
|
|
|
|
};
|
|
|
|
|
|
|
|
_buttons_to_pressed_actions=
|
|
|
|
{
|
|
|
|
{Button::UP, Action::PRESS_UP},
|
|
|
|
{Button::RIGHT, Action::PRESS_RIGHT},
|
|
|
|
{Button::DOWN, Action::PRESS_DOWN},
|
|
|
|
{Button::LEFT, Action::PRESS_LEFT},
|
|
|
|
|
|
|
|
{Button::SLIDER_RIGHT, Action::PRESS_SLIDER_RIGHT},
|
|
|
|
{Button::SLIDER_LEFT, Action::PRESS_SLIDER_LEFT}
|
|
|
|
};
|
|
|
|
|
|
|
|
_buttons_to_released_actions=
|
|
|
|
{
|
|
|
|
{Button::UP, Action::RELEASE_UP},
|
|
|
|
{Button::RIGHT, Action::RELEASE_RIGHT},
|
|
|
|
{Button::DOWN, Action::RELEASE_DOWN},
|
|
|
|
{Button::LEFT, Action::RELEASE_LEFT},
|
|
|
|
|
|
|
|
{Button::SLIDER_RIGHT, Action::RELEASE_SLIDER_RIGHT},
|
|
|
|
{Button::SLIDER_LEFT, Action::RELEASE_SLIDER_LEFT}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2021-06-09 20:08:58 +02:00
|
|
|
ClassicGame::~ClassicGame()
|
|
|
|
{}
|
|
|
|
|
2021-05-31 19:04:16 +02:00
|
|
|
void ClassicGame::run()
|
|
|
|
{
|
2021-06-11 18:58:44 +02:00
|
|
|
_timeline->fetchVisibleNotes(_view_manager);
|
|
|
|
_timeline->run();
|
2021-05-31 19:04:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void ClassicGame::input(const sf::Event& event)
|
|
|
|
{
|
|
|
|
Action new_action = Action::NONE;
|
2021-06-08 20:32:36 +02:00
|
|
|
microsec timestamp = _timeline->currentMusicOffset();
|
2021-05-31 19:04:16 +02:00
|
|
|
|
|
|
|
switch (event.type)
|
|
|
|
{
|
|
|
|
default:
|
2021-06-11 18:58:44 +02:00
|
|
|
return;
|
|
|
|
break;
|
2021-05-31 19:04:16 +02:00
|
|
|
case sf::Event::KeyPressed:
|
|
|
|
{
|
|
|
|
if (_keys_to_buttons.find(event.key.code) != _keys_to_buttons.end())
|
|
|
|
new_action = getActionKeyPressed(_keys_to_buttons[event.key.code]);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case sf::Event::KeyReleased:
|
|
|
|
{
|
|
|
|
if (_keys_to_buttons.find(event.key.code) != _keys_to_buttons.end())
|
|
|
|
new_action = getActionKeyReleased(_keys_to_buttons[event.key.code]);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2021-06-08 20:32:36 +02:00
|
|
|
auto note = _timeline->getActiveNote();
|
|
|
|
|
2021-06-11 18:58:44 +02:00
|
|
|
if (!_timeline->isExpired(note) || (*note)->state() != ClassicNote::State::DEAD)
|
|
|
|
{
|
|
|
|
auto grade = (*note)->input(ClassicInputType(timestamp, new_action));
|
|
|
|
|
|
|
|
sf::Text new_grade;
|
|
|
|
new_grade.setFillColor(sf::Color::White);
|
|
|
|
new_grade.setPosition((*note)->getCoordinates().x, (*note)->getCoordinates().y - 40);
|
|
|
|
switch (grade)
|
|
|
|
{
|
|
|
|
case ClassicNote::Grade::PERFECT:
|
|
|
|
new_grade.setString("PERFECT"); break;
|
|
|
|
case ClassicNote::Grade::GOOD:
|
|
|
|
new_grade.setString("GOOD"); break;
|
|
|
|
case ClassicNote::Grade::BAD:
|
|
|
|
new_grade.setString("BAD"); break;
|
|
|
|
}
|
|
|
|
|
|
|
|
new_grade.setFont(_font);
|
|
|
|
_grades.emplace_back(new_grade);
|
|
|
|
}
|
2021-05-31 19:04:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
Action ClassicGame::getActionKeyPressed(Button button) const
|
|
|
|
{
|
|
|
|
return _buttons_to_pressed_actions.at(button);
|
|
|
|
}
|
|
|
|
|
|
|
|
Action ClassicGame::getActionKeyReleased(Button button) const
|
|
|
|
{
|
|
|
|
return _buttons_to_released_actions.at(button);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ClassicGame::update()
|
|
|
|
{
|
2021-06-08 20:32:36 +02:00
|
|
|
_timeline->update();
|
|
|
|
_timeline->fetchVisibleNotes(_view_manager);
|
2021-06-11 18:58:44 +02:00
|
|
|
|
|
|
|
for (auto& grade : _grades)
|
|
|
|
{
|
|
|
|
if (grade.getFillColor().a > 20)
|
|
|
|
{
|
|
|
|
grade.setFillColor(sf::Color(255, 255, 255, grade.getFillColor().a - 20));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
_grades.remove_if([](const auto& grade) { return grade.getFillColor().a <= 20; });
|
2021-05-31 19:04:16 +02:00
|
|
|
}
|
|
|
|
|
2021-06-09 20:08:58 +02:00
|
|
|
void ClassicGame::draw(sf::RenderWindow& window) const
|
2021-05-28 19:50:57 +02:00
|
|
|
{
|
2021-06-09 20:08:58 +02:00
|
|
|
_timeline->drawVisibleNotes(window);
|
2021-06-11 18:58:44 +02:00
|
|
|
|
|
|
|
for (auto& grade : _grades)
|
|
|
|
{
|
|
|
|
window.draw(grade);
|
|
|
|
}
|
2021-05-28 19:50:57 +02:00
|
|
|
}
|