Finish brief version of new project design

selection
NaiJi ✨ 3 years ago
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…
Cancel
Save