forked from NaiJi/project-kyoku
Separate SFML graphics logic from game logic
parent
51d83f524a
commit
ac88cd9dfa
@ -1,18 +0,0 @@
|
||||
#include "shared/classicmode/classicfactory.h"
|
||||
#include "game/classicgame.h"
|
||||
#include "graphics/classicgraphicsmanager.h"
|
||||
#include "tools/music.h"
|
||||
|
||||
#include "editor/classiceditor.h"
|
||||
|
||||
#include <SFML/Graphics/RenderWindow.hpp>
|
||||
|
||||
std::unique_ptr<Game> classic::initGame()
|
||||
{
|
||||
return std::make_unique<ClassicGame>();
|
||||
}
|
||||
|
||||
std::unique_ptr<Editor> classic::initEditor()
|
||||
{
|
||||
return std::make_unique<ClassicEditor>();
|
||||
}
|
@ -1,137 +0,0 @@
|
||||
#include "classiceditorgraphicsmanager.h"
|
||||
#include "graphics/classicsprite.h"
|
||||
|
||||
#include "graphics/classicflyinganimationscenario.h"
|
||||
#include "graphics/classicdyinganimationscenario.h"
|
||||
|
||||
ClassicEditorGraphicsManager::ClassicEditorGraphicsManager(Timeline<MockClassicNote> &timeline, const microsec& visibility_offset) :
|
||||
ClassicGraphicsManager(visibility_offset),
|
||||
_timeline(&timeline)
|
||||
{
|
||||
_timeline->expire(_first);
|
||||
_timeline->expire(_last);
|
||||
}
|
||||
|
||||
void ClassicEditorGraphicsManager::draw(sf::RenderTarget& target, sf::RenderStates states) const
|
||||
{
|
||||
if (nothingToDraw())
|
||||
return;
|
||||
|
||||
for (auto it = _first; it != _last; ++it)
|
||||
{
|
||||
(*it)->draw(this, target, states);
|
||||
}
|
||||
}
|
||||
|
||||
void ClassicEditorGraphicsManager::draw(const std::vector<MockClassicNote::MockElement>& elements, sf::RenderTarget& target, sf::RenderStates states) const
|
||||
{
|
||||
for (std::size_t i = 0; i < elements.size(); ++i)
|
||||
{
|
||||
const auto& sprite = elements[i].sprite;
|
||||
|
||||
if (i >= 1)
|
||||
{
|
||||
const auto& neighbor_sprite = elements[i - 1].sprite;
|
||||
|
||||
const auto c1 = neighbor_sprite->trailCoordinates();
|
||||
const auto c2 = sprite->trailCoordinates();
|
||||
|
||||
target.draw(makeLine(c1, c2));
|
||||
}
|
||||
|
||||
target.draw(*sprite, states);
|
||||
}
|
||||
}
|
||||
|
||||
sf::VertexArray ClassicEditorGraphicsManager::makeLine(const Coordinates& c1, const Coordinates& c2) const
|
||||
{
|
||||
sf::VertexArray line(sf::LinesStrip, 2);
|
||||
line[0].color = sf::Color::Yellow;
|
||||
line[0].position = {c1.x + 10, c1.y};
|
||||
line[1].color = sf::Color::Blue;
|
||||
line[1].position = {c2.x + 10, c2.y};
|
||||
|
||||
return line;
|
||||
}
|
||||
|
||||
void ClassicEditorGraphicsManager::setGraphics(std::vector<MockClassicNote::MockElement>& elements, TimeRange &&range)
|
||||
{
|
||||
for (auto& element : elements)
|
||||
{
|
||||
element.sprite = _sprite_container.getSprite(element.type);
|
||||
element.sprite->setCoordinates(element.coordinates);
|
||||
element.sprite->setTrailCoordinates(Coordinates( 0.f, 9.f ));
|
||||
|
||||
element.animations[MockClassicNote::State::NONE] = nullptr;
|
||||
element.animations[MockClassicNote::State::FLYING] = std::make_shared<ClassicFlyingAnimationScenario>();
|
||||
element.animations[MockClassicNote::State::DYING] = std::make_shared<ClassicDyingAnimationScenario>();
|
||||
element.animations[MockClassicNote::State::DEAD] = nullptr;
|
||||
|
||||
element.animations[MockClassicNote::State::FLYING]->launch(element.sprite, range.begin, range.end);
|
||||
}
|
||||
}
|
||||
|
||||
void ClassicEditorGraphicsManager::update(const microsec &offset)
|
||||
{
|
||||
fetchLastNote(offset);
|
||||
fetchFirstNote(offset);
|
||||
|
||||
updateVisibleNotes(offset);
|
||||
}
|
||||
|
||||
void ClassicEditorGraphicsManager::updateVisibleNotes(const microsec &offset)
|
||||
{
|
||||
for (auto it = _first; it != _last; ++it)
|
||||
(*it)->update(offset);
|
||||
}
|
||||
|
||||
void ClassicEditorGraphicsManager::fetchFirstNote(const microsec& offset)
|
||||
{
|
||||
(void)offset; // ????
|
||||
|
||||
if (nothingToDraw())
|
||||
return;
|
||||
|
||||
Iterator note_iterator = _first;
|
||||
while (note_iterator != _last)
|
||||
{
|
||||
auto note = *note_iterator;
|
||||
if (note->shouldRemove())
|
||||
++_first;
|
||||
|
||||
++note_iterator;
|
||||
}
|
||||
}
|
||||
|
||||
void ClassicEditorGraphicsManager::fetchLastNote(const microsec& offset)
|
||||
{
|
||||
Iterator note_iterator = _timeline->getTopNote();
|
||||
while (!_timeline->isExpired(note_iterator) && isVisiblyClose(note_iterator, offset))
|
||||
{
|
||||
if (nothingToDraw())
|
||||
_first = note_iterator;
|
||||
|
||||
auto note = *note_iterator;
|
||||
|
||||
if (!note->isInGame())
|
||||
{
|
||||
note->putToGame();
|
||||
note->setGraphics(this, TimeRange{offset, note->offset()});
|
||||
}
|
||||
|
||||
++note_iterator;
|
||||
}
|
||||
|
||||
_last = note_iterator;
|
||||
}
|
||||
|
||||
bool ClassicEditorGraphicsManager::nothingToDraw() const noexcept
|
||||
{
|
||||
return _timeline->isExpired(_first)
|
||||
|| _timeline->isExpired(_last);
|
||||
}
|
||||
|
||||
bool ClassicEditorGraphicsManager::isVisiblyClose(const Iterator& iterator, const microsec& music_offset) const noexcept
|
||||
{
|
||||
return ((*iterator)->offset() - _visibility_offset) <= music_offset;
|
||||
}
|
@ -1,37 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "mockclassicnote.h"
|
||||
#include "graphics/classicgraphicsmanager.h"
|
||||
#include "core/timeline.h"
|
||||
|
||||
#include <SFML/Graphics/RenderTarget.hpp>
|
||||
|
||||
class ClassicSprite;
|
||||
|
||||
class ClassicEditorGraphicsManager : public ClassicGraphicsManager
|
||||
{
|
||||
public:
|
||||
explicit ClassicEditorGraphicsManager(Timeline<MockClassicNote>& timeline, const microsec& visibility_offset);
|
||||
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const override;
|
||||
|
||||
void draw(const std::vector<MockClassicNote::MockElement>& elements, sf::RenderTarget& target, sf::RenderStates states) const;
|
||||
void setGraphics(std::vector<MockClassicNote::MockElement> &elements, TimeRange&& range);
|
||||
|
||||
virtual void update(const microsec& offset) override;
|
||||
|
||||
private:
|
||||
using Iterator = Timeline<MockClassicNote>::Iterator;
|
||||
|
||||
Iterator _first;
|
||||
Iterator _last;
|
||||
|
||||
Timeline<MockClassicNote> * const _timeline;
|
||||
|
||||
inline bool nothingToDraw() const noexcept;
|
||||
inline bool isVisiblyClose(const Iterator& iterator, const microsec& music_offset) const noexcept;
|
||||
inline sf::VertexArray makeLine(const Coordinates& c1, const Coordinates& c2) const;
|
||||
|
||||
void fetchFirstNote(const microsec& offset);
|
||||
void fetchLastNote(const microsec& offset);
|
||||
void updateVisibleNotes(const microsec& offset);
|
||||
};
|
@ -0,0 +1,21 @@
|
||||
#pragma once
|
||||
|
||||
#include "classicmode/classicactions.h"
|
||||
#include "tools/mathutils.h"
|
||||
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
#include <array>
|
||||
|
||||
class ClassicSprite;
|
||||
class ClassicAnimationScenario;
|
||||
|
||||
struct MockElement
|
||||
{
|
||||
std::shared_ptr<ClassicSprite> sprite;
|
||||
std::array<std::shared_ptr<ClassicAnimationScenario>, 4> animations;
|
||||
Type type = Type::NONE;
|
||||
|
||||
Coordinates coordinates;
|
||||
std::vector<Coordinates> falling_curve_interpolation;
|
||||
};
|
@ -0,0 +1,30 @@
|
||||
#pragma once
|
||||
|
||||
#include "classicmode/classicactions.h"
|
||||
|
||||
#include "core/inputtype.h"
|
||||
#include "tools/mathutils.h"
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include <array>
|
||||
|
||||
class ClassicSprite;
|
||||
class ClassicAnimationScenario;
|
||||
|
||||
struct ArrowElement
|
||||
{
|
||||
std::shared_ptr<ClassicSprite> sprite;
|
||||
std::array<std::shared_ptr<ClassicAnimationScenario>, 5> animations;
|
||||
sf::Keyboard::Key pressed_as = sf::Keyboard::Unknown;
|
||||
|
||||
Coordinates coordinates;
|
||||
std::vector<Coordinates> falling_curve_interpolation;
|
||||
std::array<sf::Keyboard::Key, 2> keys;
|
||||
Type type = Type::NONE;
|
||||
bool pressed = false;
|
||||
|
||||
// Each note may consist of several buttons.
|
||||
// For example, ↑ → or ↓ → ←
|
||||
// Note Element represents this idea.
|
||||
};
|
@ -1,137 +0,0 @@
|
||||
#include "classicgamegraphicsmanager.h"
|
||||
#include "graphics/classicsprite.h"
|
||||
|
||||
#include "graphics/classicflyinganimationscenario.h"
|
||||
#include "graphics/classicdyinganimationscenario.h"
|
||||
|
||||
ClassicGameGraphicsManager::ClassicGameGraphicsManager(Timeline<ClassicNote> &timeline, const microsec& visibility_offset) :
|
||||
ClassicGraphicsManager(visibility_offset),
|
||||
_timeline(&timeline)
|
||||
{
|
||||
_timeline->expire(_first);
|
||||
_timeline->expire(_last);
|
||||
}
|
||||
|
||||
void ClassicGameGraphicsManager::draw(sf::RenderTarget& target, sf::RenderStates states) const
|
||||
{
|
||||
if (nothingToDraw())
|
||||
return;
|
||||
|
||||
for (auto it = _first; it != _last; ++it)
|
||||
{
|
||||
(*it)->draw(this, target, states);
|
||||
}
|
||||
}
|
||||
|
||||
void ClassicGameGraphicsManager::draw(const std::vector<ClassicArrowNote::ArrowElement>& elements, sf::RenderTarget& target, sf::RenderStates states) const
|
||||
{
|
||||
for (std::size_t i = 0; i < elements.size(); ++i)
|
||||
{
|
||||
const auto& sprite = elements[i].sprite;
|
||||
|
||||
if (i >= 1)
|
||||
{
|
||||
const auto& neighbor_sprite = elements[i - 1].sprite;
|
||||
|
||||
const auto c1 = neighbor_sprite->trailCoordinates();
|
||||
const auto c2 = sprite->trailCoordinates();
|
||||
|
||||
target.draw(makeLine(c1, c2));
|
||||
}
|
||||
|
||||
target.draw(*sprite, states);
|
||||
}
|
||||
}
|
||||
|
||||
sf::VertexArray ClassicGameGraphicsManager::makeLine(const Coordinates& c1, const Coordinates& c2) const
|
||||
{
|
||||
sf::VertexArray line(sf::LinesStrip, 2);
|
||||
line[0].color = sf::Color::Yellow;
|
||||
line[0].position = {c1.x + 10, c1.y};
|
||||
line[1].color = sf::Color::Blue;
|
||||
line[1].position = {c2.x + 10, c2.y};
|
||||
|
||||
return line;
|
||||
}
|
||||
|
||||
void ClassicGameGraphicsManager::setGraphics(std::vector<ClassicArrowNote::ArrowElement>& elements, TimeRange &&range)
|
||||
{
|
||||
for (auto& element : elements)
|
||||
{
|
||||
element.sprite = _sprite_container.getSprite(element.type);
|
||||
element.sprite->setCoordinates(element.coordinates);
|
||||
element.sprite->setTrailCoordinates(Coordinates( 0.f, 9.f ));
|
||||
|
||||
element.animations[ClassicArrowNote::State::NONE] = nullptr;
|
||||
element.animations[ClassicArrowNote::State::FLYING] = std::make_shared<ClassicFlyingAnimationScenario>();
|
||||
element.animations[ClassicArrowNote::State::DYING] = std::make_shared<ClassicDyingAnimationScenario>();
|
||||
element.animations[ClassicArrowNote::State::DEAD] = nullptr;
|
||||
|
||||
element.animations[ClassicArrowNote::State::FLYING]->launch(element.sprite, range.begin, range.end);
|
||||
}
|
||||
}
|
||||
|
||||
void ClassicGameGraphicsManager::update(const microsec &offset)
|
||||
{
|
||||
fetchLastNote(offset);
|
||||
fetchFirstNote(offset);
|
||||
|
||||
updateVisibleNotes(offset);
|
||||
}
|
||||
|
||||
void ClassicGameGraphicsManager::updateVisibleNotes(const microsec &offset)
|
||||
{
|
||||
for (auto it = _first; it != _last; ++it)
|
||||
(*it)->update(offset);
|
||||
}
|
||||
|
||||
void ClassicGameGraphicsManager::fetchFirstNote(const microsec& offset)
|
||||
{
|
||||
(void)offset; // ????
|
||||
|
||||
if (nothingToDraw())
|
||||
return;
|
||||
|
||||
Iterator note_iterator = _first;
|
||||
while (note_iterator != _last)
|
||||
{
|
||||
auto note = *note_iterator;
|
||||
if (note->shouldRemove())
|
||||
++_first;
|
||||
|
||||
++note_iterator;
|
||||
}
|
||||
}
|
||||
|
||||
void ClassicGameGraphicsManager::fetchLastNote(const microsec& offset)
|
||||
{
|
||||
Iterator note_iterator = _timeline->getTopNote();
|
||||
while (!_timeline->isExpired(note_iterator) && isVisiblyClose(note_iterator, offset))
|
||||
{
|
||||
if (nothingToDraw())
|
||||
_first = note_iterator;
|
||||
|
||||
auto note = *note_iterator;
|
||||
|
||||
if (!note->isInGame())
|
||||
{
|
||||
note->putToGame();
|
||||
note->setGraphics(this, TimeRange{offset, note->offset()});
|
||||
}
|
||||
|
||||
++note_iterator;
|
||||
}
|
||||
|
||||
_last = note_iterator;
|
||||
}
|
||||
|
||||
bool ClassicGameGraphicsManager::nothingToDraw() const noexcept
|
||||
{
|
||||
return _timeline->isExpired(_first)
|
||||
|| _timeline->isExpired(_last);
|
||||
}
|
||||
|
||||
bool ClassicGameGraphicsManager::isVisiblyClose(const Iterator& iterator, const microsec& music_offset) const noexcept
|
||||
{
|
||||
return ((*iterator)->offset() - _visibility_offset) <= music_offset;
|
||||
}
|
@ -1,37 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "game/classicarrownote.h"
|
||||
#include "graphics/classicgraphicsmanager.h"
|
||||
#include "core/timeline.h"
|
||||
|
||||
#include <SFML/Graphics/RenderTarget.hpp>
|
||||
|
||||
class ClassicSprite;
|
||||
|
||||
class ClassicGameGraphicsManager : public ClassicGraphicsManager
|
||||
{
|
||||
public:
|
||||
explicit ClassicGameGraphicsManager(Timeline<ClassicNote>& timeline, const microsec& visibility_offset);
|
||||
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const override;
|
||||
|
||||
void draw(const std::vector<ClassicArrowNote::ArrowElement>& elements, sf::RenderTarget& target, sf::RenderStates states) const;
|
||||
void setGraphics(std::vector<ClassicArrowNote::ArrowElement> &elements, TimeRange&& range);
|
||||
|
||||
virtual void update(const microsec& offset) override;
|
||||
|
||||
private:
|
||||
using Iterator = Timeline<ClassicNote>::Iterator;
|
||||
|
||||
Iterator _first;
|
||||
Iterator _last;
|
||||
|
||||
Timeline<ClassicNote> * const _timeline;
|
||||
|
||||
inline bool nothingToDraw() const noexcept;
|
||||
inline bool isVisiblyClose(const Iterator& iterator, const microsec& music_offset) const noexcept;
|
||||
inline sf::VertexArray makeLine(const Coordinates& c1, const Coordinates& c2) const;
|
||||
|
||||
void fetchFirstNote(const microsec& offset);
|
||||
void fetchLastNote(const microsec& offset);
|
||||
void updateVisibleNotes(const microsec& offset);
|
||||
};
|
@ -1,5 +1,5 @@
|
||||
#include "classicdyinganimationscenario.h"
|
||||
#include "classicsprite.h"
|
||||
#include "graphics/classicsprite.h"
|
||||
|
||||
void ClassicDyingAnimationScenario::launch(const std::shared_ptr<ClassicSprite> sprite, const microsec& time_begin, const microsec &time_end)
|
||||
{
|
@ -1,5 +1,5 @@
|
||||
#include "classicflyinganimationscenario.h"
|
||||
#include "classicsprite.h"
|
||||
#include "graphics/classicsprite.h"
|
||||
|
||||
void ClassicFlyingAnimationScenario::launch(const std::shared_ptr<ClassicSprite> sprite, const microsec& time_begin, const microsec &time_end)
|
||||
{
|
@ -0,0 +1,142 @@
|
||||
#include "classicscenegraphicsmanager.h"
|
||||
#include "graphics/classicsprite.h"
|
||||
|
||||
#include "game/arrowelement.h"
|
||||
#include "editor/mockelement.h"
|
||||
|
||||
#include "graphics/animations/classicflyinganimationscenario.h"
|
||||
#include "graphics/animations/classicdyinganimationscenario.h"
|
||||
|
||||
ClassicSceneGraphicsManager::ClassicSceneGraphicsManager(const std::shared_ptr<Timeline<ClassicNote>>& timeline,
|
||||
const std::shared_ptr<ClassicSpriteFactory>& factory,
|
||||
const microsec& visibility_offset) :
|
||||
ClassicGraphicsManager(factory, visibility_offset),
|
||||
_timeline(timeline)
|
||||
{
|
||||
_timeline->expire(_first);
|
||||
_timeline->expire(_last);
|
||||
}
|
||||
|
||||
void ClassicSceneGraphicsManager::display() const
|
||||
{
|
||||
if (nothingToDraw())
|
||||
return;
|
||||
|
||||
for (auto it = _first; it != _last; ++it)
|
||||
{
|
||||
(*it)->display(this);
|
||||
}
|
||||
}
|
||||
|
||||
void ClassicSceneGraphicsManager::update(const microsec &offset)
|
||||
{
|
||||
fetchLastNote(offset);
|
||||
fetchFirstNote(offset);
|
||||
|
||||
updateVisibleNotes(offset);
|
||||
}
|
||||
|
||||
void ClassicSceneGraphicsManager::display(const std::vector<ArrowElement>& elements) const
|
||||
{
|
||||
for (std::size_t i = 0; i < elements.size(); ++i)
|
||||
{
|
||||
const auto& sprite = elements[i].sprite;
|
||||
|
||||
if (i >= 1)
|
||||
{
|
||||
//const auto& neighbor_sprite = elements[i - 1].sprite;
|
||||
|
||||
//const auto c1 = neighbor_sprite->trailCoordinates();
|
||||
//const auto c2 = sprite->trailCoordinates();
|
||||
|
||||
//_render_target->draw(makeLine(c1, c2));
|
||||
}
|
||||
|
||||
sprite->display();
|
||||
}
|
||||
}
|
||||
|
||||
void ClassicSceneGraphicsManager::setGraphics(std::vector<ArrowElement>& elements, TimeRange &&range)
|
||||
{
|
||||
for (auto& element : elements)
|
||||
{
|
||||
element.sprite = _sprite_container.getSprite(element.type);
|
||||
element.sprite->setCoordinates(element.coordinates);
|
||||
element.sprite->setTrailCoordinates(Coordinates( 0.f, 9.f ));
|
||||
|
||||
element.animations[ClassicNote::State::NONE] = nullptr;
|
||||
element.animations[ClassicNote::State::FLYING] = std::make_shared<ClassicFlyingAnimationScenario>();
|
||||
element.animations[ClassicNote::State::DYING] = std::make_shared<ClassicDyingAnimationScenario>();
|
||||
element.animations[ClassicNote::State::DEAD] = nullptr;
|
||||
|
||||
element.animations[ClassicNote::State::FLYING]->launch(element.sprite, range.begin, range.end);
|
||||
}
|
||||
}
|
||||
|
||||
/*sf::VertexArray ClassicSceneGraphicsSFML::makeLine(const Coordinates& c1, const Coordinates& c2) const
|
||||
{
|
||||
sf::VertexArray line(sf::LinesStrip, 2);
|
||||
line[0].color = sf::Color::Yellow;
|
||||
line[0].position = {c1.x + 10, c1.y};
|
||||
line[1].color = sf::Color::Blue;
|
||||
line[1].position = {c2.x + 10, c2.y};
|
||||
|
||||
return line;
|
||||
}*/
|
||||
|
||||
void ClassicSceneGraphicsManager::updateVisibleNotes(const microsec &offset)
|
||||
{
|
||||
for (auto it = _first; it != _last; ++it)
|
||||
(*it)->update(offset);
|
||||
}
|
||||
|
||||
void ClassicSceneGraphicsManager::fetchFirstNote(const microsec& offset)
|
||||
{
|
||||
(void)offset; // ????
|
||||
|
||||
if (nothingToDraw())
|
||||
return;
|
||||
|
||||
Iterator note_iterator = _first;
|
||||
while (note_iterator != _last)
|
||||
{
|
||||
auto note = *note_iterator;
|
||||
if (note->shouldRemove())
|
||||
++_first;
|
||||
|
||||
++note_iterator;
|
||||
}
|
||||
}
|
||||
|
||||
void ClassicSceneGraphicsManager::fetchLastNote(const microsec& offset)
|
||||
{
|
||||
Iterator note_iterator = _timeline->getTopNote();
|
||||
while (!_timeline->isExpired(note_iterator) && isVisiblyClose(note_iterator, offset))
|
||||
{
|
||||
if (nothingToDraw())
|
||||
_first = note_iterator;
|
||||
|
||||
auto note = *note_iterator;
|
||||
|
||||
if (!note->isInGame())
|
||||
{
|
||||
note->putToGame();
|
||||
note->setGraphics(this, TimeRange{offset, note->offset()});
|
||||
}
|
||||
|
||||
++note_iterator;
|
||||
}
|
||||
|
||||
_last = note_iterator;
|
||||
}
|
||||
|
||||
bool ClassicSceneGraphicsManager::nothingToDraw() const noexcept
|
||||
{
|
||||
return _timeline->isExpired(_first)
|
||||
|| _timeline->isExpired(_last);
|
||||
}
|
||||
|
||||
bool ClassicSceneGraphicsManager::isVisiblyClose(const Iterator& iterator, const microsec& music_offset) const noexcept
|
||||
{
|
||||
return ((*iterator)->offset() - _visibility_offset) <= music_offset;
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
#pragma once
|
||||
|
||||
#include "game/classicnote.h"
|
||||
#include "graphics/classicgraphicsmanager.h"
|
||||
#include "core/timeline.h"
|
||||
|
||||
class ClassicSprite;
|
||||
|
||||
class ClassicSceneGraphicsManager : public ClassicGraphicsManager
|
||||
{
|
||||
public:
|
||||
explicit ClassicSceneGraphicsManager(const std::shared_ptr<Timeline<ClassicNote>>& timeline,
|
||||
const std::shared_ptr<ClassicSpriteFactory>& factory,
|
||||
const microsec& visibility_offset);
|
||||
|
||||
virtual void display() const override;
|
||||
virtual void update(const microsec& offset) override;
|
||||
|
||||
virtual void display(const std::vector<ArrowElement>& elements) const override;
|
||||
virtual void setGraphics(std::vector<ArrowElement>& elements, TimeRange&& range) override;
|
||||
|
||||
protected:
|
||||
using Iterator = Timeline<ClassicNote>::Iterator;
|
||||
|
||||
Iterator _first;
|
||||
Iterator _last;
|
||||
|
||||
const std::shared_ptr<Timeline<ClassicNote>> _timeline;
|
||||
|
||||
inline bool nothingToDraw() const noexcept;
|
||||
inline bool isVisiblyClose(const Iterator& iterator, const microsec& music_offset) const noexcept;
|
||||
//inline sf::VertexArray makeLine(const Coordinates& c1, const Coordinates& c2) const;
|
||||
|
||||
void fetchFirstNote(const microsec& offset);
|
||||
void fetchLastNote(const microsec& offset);
|
||||
void updateVisibleNotes(const microsec& offset);
|
||||
};
|
@ -0,0 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
|
||||
class ClassicNotePainter
|
||||
{
|
||||
virtual ~ClassicNotePainter() = default;
|
||||
};
|
@ -0,0 +1,32 @@
|
||||
#include "shared/classicmode/classicfactorysfml.h"
|
||||
#include "sfml/spritefactorysfml.h"
|
||||
|
||||
#include "graphics/classicscenegraphicsmanager.h"
|
||||
#include "core/timeline.h"
|
||||
|
||||
#include "game/classicgame.h"
|
||||
#include "editor/classiceditor.h"
|
||||
|
||||
std::unique_ptr<Game> classic::initGame(const std::shared_ptr<sf::RenderTarget>& render_target)
|
||||
{
|
||||
// read offset from beatmap metadata
|
||||
const microsec visibility_offset = 1648648;
|
||||
|
||||
const auto factory = std::make_shared<ClassicSpriteFactorySFML>(render_target);
|
||||
const auto timeline = std::make_shared<Timeline<ClassicNote>>();
|
||||
const auto graphics_manager = std::make_shared<ClassicSceneGraphicsManager>(timeline, factory, visibility_offset);
|
||||
|
||||
return std::make_unique<ClassicGame>(timeline, graphics_manager);
|
||||
}
|
||||
|
||||
std::unique_ptr<Editor> classic::initEditor(const std::shared_ptr<sf::RenderTarget>& render_target)
|
||||
{
|
||||
// read offset from beatmap metadata
|
||||
const microsec visibility_offset = 1648648;
|
||||
|
||||
const auto factory = std::make_shared<ClassicSpriteFactorySFML>(render_target);
|
||||
const auto timeline = std::make_shared<Timeline<ClassicNote>>();
|
||||
const auto graphics_manager = std::make_shared<ClassicSceneGraphicsManager>(timeline, factory, visibility_offset);
|
||||
|
||||
return std::make_unique<ClassicEditor>(timeline, graphics_manager);
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
#include "spritefactorysfml.h"
|
||||
|
||||
ClassicSpriteFactorySFML::ClassicSpriteFactorySFML(const std::shared_ptr<sf::RenderTarget>& render_target) :
|
||||
_render_target(render_target)
|
||||
{}
|
||||
|
||||
std::shared_ptr<ClassicSprite> ClassicSpriteFactorySFML::create(Type type) const
|
||||
{
|
||||
sf::RectangleShape sprite;
|
||||
sprite.setSize({20.f, 20.f});
|
||||
switch (type)
|
||||
{
|
||||
case Type::UP:
|
||||
sprite.setFillColor(sf::Color(255, 0, 0));
|
||||
break;
|
||||
|
||||
case Type::DOWN:
|
||||
sprite.setFillColor(sf::Color(0, 255, 0));
|
||||
break;
|
||||
|
||||
case Type::LEFT:
|
||||
sprite.setFillColor(sf::Color(0, 0, 255));
|
||||
break;
|
||||
|
||||
case Type::RIGHT:
|
||||
sprite.setFillColor(sf::Color(255, 0, 255));
|
||||
break;
|
||||
|
||||
default: // yellow
|
||||
sprite.setFillColor(sf::Color(255, 239, 0));
|
||||
}
|
||||
|
||||
return std::make_shared<ClassicSprite>(_render_target, sprite);
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
#pragma once
|
||||
|
||||
#include "graphics/classicspritefactory.h"
|
||||
|
||||
#include <SFML/Graphics/RenderTarget.hpp>
|
||||
|
||||
class ClassicSpriteFactorySFML : public ClassicSpriteFactory
|
||||
{
|
||||
public:
|
||||
explicit ClassicSpriteFactorySFML(const std::shared_ptr<sf::RenderTarget>& render_target);
|
||||
virtual std::shared_ptr<ClassicSprite> create(Type type) const override;
|
||||
|
||||
private:
|
||||
const std::shared_ptr<sf::RenderTarget> _render_target;
|
||||
};
|
@ -1,12 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
|
||||
class Game;
|
||||
class Editor;
|
||||
|
||||
namespace classic
|
||||
{
|
||||
std::unique_ptr<Game> initGame();
|
||||
std::unique_ptr<Editor> initEditor();
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include <SFML/Graphics/RenderWindow.hpp>
|
||||
|
||||
class Game;
|
||||
class Editor;
|
||||
|
||||
namespace classic
|
||||
{
|
||||
std::unique_ptr<Game> initGame(const std::shared_ptr<sf::RenderTarget>& render_target);
|
||||
std::unique_ptr<Editor> initEditor(const std::shared_ptr<sf::RenderTarget>& render_target);
|
||||
}
|
Loading…
Reference in New Issue