forked from NaiJi/project-kyoku
Finish brief version of new project design
This commit is contained in:
parent
e5969d1484
commit
ed300edcf6
|
@ -2,9 +2,9 @@ cmake_minimum_required(VERSION 3.5)
|
|||
|
||||
project(project-kyoku LANGUAGES CXX)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD 14)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -g")
|
||||
file(GLOB SOURCES "src/*.cpp" "src/classicgame/*")
|
||||
|
||||
# STATIC #
|
||||
|
|
|
@ -13,6 +13,7 @@ class Application
|
|||
{
|
||||
public:
|
||||
Application();
|
||||
~Application();
|
||||
void run();
|
||||
void input();
|
||||
void update();
|
||||
|
|
|
@ -13,7 +13,7 @@ public:
|
|||
|
||||
virtual void input(const sf::Event& event) = 0;
|
||||
virtual void update() = 0;
|
||||
virtual void draw(const sf::RenderWindow& window) const = 0;
|
||||
virtual void draw(sf::RenderWindow& window) const = 0;
|
||||
};
|
||||
|
||||
#endif // GAME_H
|
||||
|
|
|
@ -2,17 +2,19 @@
|
|||
|
||||
#include <vector>
|
||||
#include <SFML/System/Clock.hpp>
|
||||
#include <SFML/Graphics/Drawable.hpp>
|
||||
|
||||
using microsec = sf::Int64;
|
||||
|
||||
class Note
|
||||
class Note : public sf::Drawable
|
||||
{
|
||||
public:
|
||||
explicit Note(microsec perfect_offset) :
|
||||
_perfect_offset(perfect_offset) {}
|
||||
virtual ~Note() = 0;
|
||||
virtual ~Note() = default;
|
||||
|
||||
virtual bool isActive(microsec music_offset) const = 0;
|
||||
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const = 0;
|
||||
|
||||
virtual microsec offset() const
|
||||
{
|
||||
|
|
|
@ -34,7 +34,7 @@ public:
|
|||
&& music_play_offset < _end_handling_offset;
|
||||
}
|
||||
|
||||
inline GRADE calculatePrecision(microsec odds) const
|
||||
inline GRADE calculatePrecision(microsec odds) const noexcept
|
||||
{
|
||||
microsec shift_from_perfect = std::abs(odds - offset());
|
||||
|
||||
|
|
|
@ -2,5 +2,6 @@
|
|||
|
||||
class Sprite
|
||||
{
|
||||
|
||||
public:
|
||||
virtual ~Sprite() = default;
|
||||
};
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#ifndef TIMELINE_H
|
||||
#define TIMELINE_H
|
||||
|
||||
#include <SFML/Graphics/RenderWindow.hpp>
|
||||
#include <SFML/Config.hpp>
|
||||
#include <memory>
|
||||
|
||||
|
@ -16,6 +17,7 @@ public:
|
|||
virtual void clear() = 0;
|
||||
|
||||
virtual microsec currentMusicOffset() const = 0;
|
||||
virtual void drawVisibleNotes(sf::RenderWindow& window) const = 0;
|
||||
};
|
||||
|
||||
#endif // TIMELINE_H
|
||||
|
|
|
@ -7,8 +7,6 @@ class TimelineViewManager
|
|||
{
|
||||
public:
|
||||
virtual ~TimelineViewManager() = default;
|
||||
|
||||
virtual void initNoteGraphics(Note *note) = 0;
|
||||
};
|
||||
|
||||
#endif // TIMELINEVIEWMANAGER_H
|
||||
|
|
|
@ -18,6 +18,9 @@ Application::Application() :
|
|||
_grade.setString("NOT INIT");
|
||||
}
|
||||
|
||||
Application::~Application()
|
||||
{}
|
||||
|
||||
void Application::run()
|
||||
{
|
||||
_game_window.display();
|
||||
|
@ -62,5 +65,5 @@ void Application::update()
|
|||
|
||||
void Application::draw()
|
||||
{
|
||||
// _game->draw();
|
||||
_game->draw(_game_window);
|
||||
}
|
||||
|
|
|
@ -1,12 +0,0 @@
|
|||
#include "classicarrow.h"
|
||||
|
||||
ClassicArrow::ClassicArrow()
|
||||
{}
|
||||
|
||||
ClassicArrow::~ClassicArrow()
|
||||
{}
|
||||
|
||||
void ClassicArrow::update()
|
||||
{
|
||||
|
||||
}
|
|
@ -1,40 +0,0 @@
|
|||
#ifndef CLASSICARROW_H
|
||||
#define CLASSICARROW_H
|
||||
|
||||
#include "notegraphicsentity.h"
|
||||
|
||||
#include <SFML/Graphics/RectangleShape.hpp>
|
||||
|
||||
class ClassicArrow : public NoteGraphicsEntity
|
||||
{
|
||||
public:
|
||||
|
||||
enum class Type
|
||||
{
|
||||
ARROW_UP,
|
||||
ARROW_RIGHT,
|
||||
ARROW_DOWN,
|
||||
ARROW_LEFT
|
||||
};
|
||||
|
||||
explicit ClassicArrow();
|
||||
virtual ~ClassicArrow() override;
|
||||
|
||||
virtual void update() override;
|
||||
|
||||
virtual void onKeyPressed() override;
|
||||
virtual void onKeyReleased() override;
|
||||
|
||||
virtual void show() override;
|
||||
virtual void killAsExpired() override;
|
||||
virtual void reset() override;
|
||||
|
||||
virtual bool isActive() const override;
|
||||
|
||||
private:
|
||||
sf::RectangleShape static_sprite;
|
||||
sf::RectangleShape trail_sprite;
|
||||
sf::VertexArray trail_vertex;
|
||||
};
|
||||
|
||||
#endif // CLASSICARROW_H
|
|
@ -1,10 +1,12 @@
|
|||
#include "classicgame.h"
|
||||
#include "classicinputtype.h"
|
||||
#include "classictimeline.h"
|
||||
#include "classicviewmanager.h"
|
||||
#include "classicnote.h"
|
||||
|
||||
ClassicGame::ClassicGame() :
|
||||
_timeline(std::make_unique<ClassicTimeline>())
|
||||
_timeline(std::make_unique<ClassicTimeline>()),
|
||||
_view_manager(std::make_unique<ClassicViewManager>())
|
||||
{
|
||||
_keys_to_buttons =
|
||||
{
|
||||
|
@ -45,6 +47,9 @@ ClassicGame::ClassicGame() :
|
|||
};
|
||||
}
|
||||
|
||||
ClassicGame::~ClassicGame()
|
||||
{}
|
||||
|
||||
void ClassicGame::run()
|
||||
{
|
||||
|
||||
|
@ -95,7 +100,7 @@ void ClassicGame::update()
|
|||
_timeline->fetchVisibleNotes(_view_manager);
|
||||
}
|
||||
|
||||
void ClassicGame::draw(const sf::RenderWindow& window) const
|
||||
void ClassicGame::draw(sf::RenderWindow& window) const
|
||||
{
|
||||
|
||||
_timeline->drawVisibleNotes(window);
|
||||
}
|
||||
|
|
|
@ -13,13 +13,13 @@ class ClassicGame final : public Game
|
|||
{
|
||||
public:
|
||||
explicit ClassicGame();
|
||||
virtual ~ClassicGame() override = default;
|
||||
virtual ~ClassicGame() override;
|
||||
|
||||
virtual void run() override;
|
||||
|
||||
virtual void input(const sf::Event& event) override;
|
||||
virtual void update() override;
|
||||
virtual void draw(const sf::RenderWindow& window) const override;
|
||||
virtual void draw(sf::RenderWindow &window) const override;
|
||||
|
||||
private:
|
||||
std::map<sf::Keyboard::Key, Button> _keys_to_buttons;
|
||||
|
|
|
@ -1,7 +1,11 @@
|
|||
#include "classicnote.h"
|
||||
#include "classicsprite.h"
|
||||
#include <SFML/Graphics/RenderTarget.hpp>
|
||||
|
||||
ClassicNote::ClassicNote(const std::vector<microsec>& intervals, microsec perfect_offset, Action action) :
|
||||
ClassicNote::ClassicNote(const std::vector<microsec>& intervals, microsec perfect_offset,
|
||||
Action action, const Coordinates& coord) :
|
||||
Note(perfect_offset),
|
||||
_coordinates(coord),
|
||||
_evaluator(intervals, _perfect_offset),
|
||||
_action(action)
|
||||
{}
|
||||
|
@ -11,6 +15,11 @@ bool ClassicNote::isActive(microsec music_offset) const
|
|||
return _evaluator.isActive(music_offset);
|
||||
}
|
||||
|
||||
void ClassicNote::draw(sf::RenderTarget& target, sf::RenderStates states) const
|
||||
{
|
||||
target.draw(*_sprite, states);
|
||||
}
|
||||
|
||||
ClassicNote::GRADE ClassicNote::input(ClassicInputType&& input_data)
|
||||
{
|
||||
if (input_data == _action)
|
||||
|
@ -20,3 +29,24 @@ ClassicNote::GRADE ClassicNote::input(ClassicInputType&& input_data)
|
|||
|
||||
return ClassicNote::GRADE::BAD;
|
||||
}
|
||||
|
||||
Action ClassicNote::action() const
|
||||
{
|
||||
return _action;
|
||||
}
|
||||
|
||||
std::shared_ptr<ClassicSprite> ClassicNote::sprite() const noexcept
|
||||
{
|
||||
return _sprite;
|
||||
}
|
||||
|
||||
void ClassicNote::setSprite(const std::shared_ptr<ClassicSprite>& sprite) noexcept
|
||||
{
|
||||
_sprite = sprite;
|
||||
_sprite->setCoordinates(_coordinates.x, _coordinates.y);
|
||||
}
|
||||
|
||||
inline const Coordinates& ClassicNote::getCoordinates() const noexcept
|
||||
{
|
||||
return _coordinates;
|
||||
}
|
||||
|
|
|
@ -4,6 +4,21 @@
|
|||
#include "precisionevaluator.h"
|
||||
#include "classicinputtype.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
struct Coordinates
|
||||
{
|
||||
float x;
|
||||
float y;
|
||||
|
||||
inline Coordinates operator+(const Coordinates& right) noexcept
|
||||
{
|
||||
return {right.x + x, right.y - y};
|
||||
}
|
||||
}; // MOVE TO OWN HEADER ^
|
||||
|
||||
class ClassicSprite;
|
||||
|
||||
class ClassicNote : public Note
|
||||
{
|
||||
public:
|
||||
|
@ -15,13 +30,24 @@ public:
|
|||
BAD
|
||||
};
|
||||
|
||||
explicit ClassicNote(const std::vector<microsec>& intervals, microsec perfect_offset, Action action);
|
||||
explicit ClassicNote(const std::vector<microsec>& intervals, microsec perfect_offset,
|
||||
Action action, const Coordinates& coord);
|
||||
virtual ~ClassicNote() = default;
|
||||
|
||||
virtual bool isActive(microsec music_offset) const override;
|
||||
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const override;
|
||||
|
||||
GRADE input(ClassicInputType&& input_data);
|
||||
Action action() const;
|
||||
|
||||
std::shared_ptr<ClassicSprite> sprite() const noexcept;
|
||||
void setSprite(const std::shared_ptr<ClassicSprite>& sprite) noexcept;
|
||||
inline const Coordinates& getCoordinates() const noexcept;
|
||||
|
||||
private:
|
||||
PrecisionEvaluator<GRADE> _evaluator;
|
||||
Action _action;
|
||||
const Coordinates _coordinates;
|
||||
const PrecisionEvaluator<GRADE> _evaluator;
|
||||
const Action _action;
|
||||
|
||||
std::shared_ptr<ClassicSprite> _sprite;
|
||||
};
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
#include "classicsprite.h"
|
||||
#include <SFML/Graphics/RenderTarget.hpp>
|
||||
|
||||
ClassicSprite::ClassicSprite(const sf::RectangleShape& shape) :
|
||||
_shape(shape)
|
||||
{}
|
||||
|
||||
void ClassicSprite::draw(sf::RenderTarget& target, sf::RenderStates states) const
|
||||
{
|
||||
target.draw(_shape, states);
|
||||
}
|
||||
|
||||
void ClassicSprite::setCoordinates(float x, float y) noexcept
|
||||
{
|
||||
_shape.setPosition(x, y);
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
#pragma once
|
||||
|
||||
#include "sprite.h"
|
||||
#include "SFML/Graphics/RectangleShape.hpp"
|
||||
|
||||
class ClassicSprite : public Sprite, public sf::Drawable
|
||||
{
|
||||
public:
|
||||
ClassicSprite(const sf::RectangleShape& shape);
|
||||
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const override;
|
||||
|
||||
void setCoordinates(float x, float y) noexcept;
|
||||
|
||||
private:
|
||||
sf::RectangleShape _shape;
|
||||
};
|
|
@ -2,6 +2,8 @@
|
|||
#include "classicactions.h"
|
||||
#include "classictimeline.h"
|
||||
#include "classicnote.h"
|
||||
#include "classicviewmanager.h"
|
||||
#include <SFML/Graphics/RenderTarget.hpp>
|
||||
|
||||
ClassicTimeline::ClassicTimeline()
|
||||
{
|
||||
|
@ -13,7 +15,7 @@ ClassicTimeline::ClassicTimeline()
|
|||
|
||||
_music.openFromFile(song_filename);
|
||||
_music.play();
|
||||
_music.setVolume(30);
|
||||
_music.setVolume(10);
|
||||
|
||||
_timeline.reserve(1000);
|
||||
|
||||
|
@ -25,18 +27,18 @@ ClassicTimeline::ClassicTimeline()
|
|||
microsec bpm_end = starting_beat_offset + (interval * amount_of_beats);
|
||||
_visibility_offset = note_input_offset * 12;
|
||||
|
||||
_timeline.emplace_back(new ClassicNote({note_input_offset}, bpm_iterator, Action::PRESS_DOWN));
|
||||
_timeline.emplace_back(new ClassicNote({note_input_offset}, bpm_iterator, Action::PRESS_DOWN, {90, 90}));
|
||||
bpm_iterator += interval;
|
||||
|
||||
_timeline.emplace_back(new ClassicNote({note_input_offset}, bpm_iterator, Action::PRESS_LEFT));
|
||||
_timeline.emplace_back(new ClassicNote({note_input_offset}, bpm_iterator, Action::PRESS_LEFT, {190, 90}));
|
||||
bpm_iterator += interval;
|
||||
|
||||
_timeline.emplace_back(new ClassicNote({note_input_offset}, bpm_iterator, Action::PRESS_LEFT));
|
||||
_timeline.emplace_back(new ClassicNote({note_input_offset}, bpm_iterator, Action::PRESS_LEFT, {290, 90}));
|
||||
bpm_iterator += interval;
|
||||
|
||||
while (bpm_iterator < bpm_end)
|
||||
{
|
||||
_timeline.emplace_back(new ClassicNote({note_input_offset}, bpm_iterator, Action::PRESS_UP));
|
||||
_timeline.emplace_back(new ClassicNote({note_input_offset}, bpm_iterator, Action::PRESS_UP, {390, 390}));
|
||||
bpm_iterator += interval;
|
||||
}
|
||||
|
||||
|
@ -45,6 +47,11 @@ ClassicTimeline::ClassicTimeline()
|
|||
_last_visible_note = _top_note;
|
||||
}
|
||||
|
||||
void ClassicTimeline::init()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
ClassicTimeline::~ClassicTimeline()
|
||||
{
|
||||
clear();
|
||||
|
@ -115,10 +122,23 @@ void ClassicTimeline::fetchVisibleNotes(const std::unique_ptr<ClassicViewManager
|
|||
|
||||
while (((*note_iterator)->offset() - _visibility_offset) <= music_offset)
|
||||
{
|
||||
++note_iterator;
|
||||
if (note_iterator > _last_visible_note)
|
||||
(void) view_manager;//_view_manager->initNoteGraphics((*note_iterator));
|
||||
view_manager->initNoteSprite(*note_iterator);
|
||||
++note_iterator;
|
||||
}
|
||||
|
||||
_last_visible_note = note_iterator;
|
||||
}
|
||||
|
||||
void ClassicTimeline::drawVisibleNotes(sf::RenderWindow &window) const
|
||||
{
|
||||
if (_last_visible_note == _timeline.end() || _top_note > _last_visible_note)
|
||||
return;
|
||||
|
||||
Iterator note_to_draw = _top_note;
|
||||
while (note_to_draw != (_last_visible_note))
|
||||
{
|
||||
window.draw(*(*note_to_draw));
|
||||
++note_to_draw;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@ public:
|
|||
virtual void clear() override;
|
||||
|
||||
virtual microsec currentMusicOffset() const override;
|
||||
virtual void drawVisibleNotes(sf::RenderWindow& window) const override;
|
||||
|
||||
void fetchVisibleNotes(const std::unique_ptr<ClassicViewManager>& view_manager);
|
||||
|
||||
|
|
|
@ -1,44 +1,47 @@
|
|||
#include "classicviewmanager.h"
|
||||
#include "note.h"
|
||||
#include "classicsprite.h"
|
||||
#include "classicnote.h"
|
||||
#include <SFML/Graphics/RectangleShape.hpp>
|
||||
|
||||
static constexpr std::size_t RESERVED_SIZE = 20;
|
||||
|
||||
ClassicViewManager::ClassicViewManager()
|
||||
{
|
||||
for (std::size_t i = ARROW_UP; i < AMOUNT_OF_KINDS; ++i)
|
||||
for (auto kind_of_action : {Action::PRESS_UP, Action::PRESS_DOWN,
|
||||
Action::PRESS_LEFT, Action::PRESS_RIGHT})
|
||||
{
|
||||
SpritePoll &poll = _sprite_dispatcher.at(i);
|
||||
poll.resize(RESERVED_SIZE);
|
||||
for (auto &sprite : poll)
|
||||
{
|
||||
sprite = createSprite(static_cast<Button>(i));
|
||||
}
|
||||
reallocatePoll(kind_of_action);
|
||||
}
|
||||
}
|
||||
|
||||
ClassicViewManager::~ClassicViewManager()
|
||||
{}
|
||||
void ClassicViewManager::reallocatePoll(Action kind_of_action)
|
||||
{
|
||||
SpritePoll &poll = _sprite_dispatcher[kind_of_action];
|
||||
for (std::size_t i = 0; i < RESERVED_SIZE; ++i)
|
||||
{
|
||||
poll.push(createSprite(kind_of_action));
|
||||
}
|
||||
}
|
||||
|
||||
std::shared_ptr<Sprite> ClassicViewManager::createSprite(Button kind_of_button) const
|
||||
std::shared_ptr<ClassicSprite> ClassicViewManager::createSprite(Action kind_of_action) const
|
||||
{
|
||||
sf::RectangleShape sprite;
|
||||
sprite.setSize({20.f, 20.f});
|
||||
switch (kind_of_button)
|
||||
switch (kind_of_action)
|
||||
{
|
||||
case ARROW_UP:
|
||||
case Action::PRESS_UP:
|
||||
sprite.setFillColor(sf::Color(255, 0, 0));
|
||||
break;
|
||||
|
||||
case ARROW_DOWN:
|
||||
case Action::PRESS_DOWN:
|
||||
sprite.setFillColor(sf::Color(0, 255, 0));
|
||||
break;
|
||||
|
||||
case ARROW_LEFT:
|
||||
case Action::PRESS_LEFT:
|
||||
sprite.setFillColor(sf::Color(0, 0, 255));
|
||||
break;
|
||||
|
||||
case ARROW_RIGHT:
|
||||
case Action::PRESS_RIGHT:
|
||||
sprite.setFillColor(sf::Color(255, 0, 255));
|
||||
break;
|
||||
|
||||
|
@ -46,19 +49,23 @@ std::shared_ptr<Sprite> ClassicViewManager::createSprite(Button kind_of_button)
|
|||
sprite.setFillColor(sf::Color(255, 239, 0));
|
||||
}
|
||||
|
||||
return std::make_shared<Sprite>(sprite);
|
||||
return std::make_shared<ClassicSprite>(sprite);
|
||||
}
|
||||
|
||||
void ClassicViewManager::initNoteGraphics(Note *note)
|
||||
void ClassicViewManager::initNoteSprite(ClassicNote* note)
|
||||
{
|
||||
const auto type = note->type();
|
||||
for (const auto& sprite : _sprite_dispatcher.at(static_cast<int>(type)))
|
||||
{
|
||||
if (!sprite->isAttached())
|
||||
{
|
||||
sprite->setCoordinates(note->position());
|
||||
note->resetSprite(sprite);
|
||||
return;
|
||||
}
|
||||
}
|
||||
const auto action_type = note->action();
|
||||
SpritePoll& poll = _sprite_dispatcher.at(action_type);
|
||||
|
||||
if (poll.empty())
|
||||
reallocatePoll(action_type);
|
||||
|
||||
note->setSprite(poll.top());
|
||||
poll.pop();
|
||||
}
|
||||
|
||||
void ClassicViewManager::resetNoteSprite(ClassicNote* note)
|
||||
{
|
||||
_sprite_dispatcher[note->action()].push(note->sprite());
|
||||
note->setSprite(nullptr);
|
||||
}
|
||||
|
|
|
@ -2,27 +2,29 @@
|
|||
#define CLASSICDIVAVIEWMANAGER_H
|
||||
|
||||
#include "timelineviewmanager.h"
|
||||
#include "classicarrow.h"
|
||||
#include "classicactions.h"
|
||||
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
#include <stack>
|
||||
#include <map>
|
||||
|
||||
class Sprite;
|
||||
class ClassicSprite;
|
||||
class ClassicNote;
|
||||
|
||||
class ClassicViewManager : public TimelineViewManager
|
||||
{
|
||||
public:
|
||||
explicit ClassicViewManager();
|
||||
virtual ~ClassicViewManager() override;
|
||||
|
||||
virtual void initNoteGraphics(Note *note) override;
|
||||
void initNoteSprite(ClassicNote *note);
|
||||
void resetNoteSprite(ClassicNote *note);
|
||||
|
||||
private:
|
||||
using SpritePoll = std::vector<std::shared_ptr<Sprite>>;
|
||||
using SpriteDispatcher = std::array<SpritePoll, AMOUNT_OF_KINDS>;
|
||||
SpriteDispatcher _sprite_dispatcher;
|
||||
void reallocatePoll(Action kind_of_action);
|
||||
std::shared_ptr<ClassicSprite> createSprite(Action kind_of_action) const;
|
||||
|
||||
std::shared_ptr<Sprite> createSprite(Button kind_of_button) const;
|
||||
using SpritePoll = std::stack<std::shared_ptr<ClassicSprite>>;
|
||||
std::map<Action, SpritePoll> _sprite_dispatcher;
|
||||
};
|
||||
|
||||
#endif // CLASSICDIVAVIEWMANAGER_H
|
||||
|
|
Loading…
Reference in New Issue