forked from NaiJi/project-kyoku
Implement selection for editor notes
parent
c576686752
commit
4ec11560f1
@ -1,17 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <SFML/Graphics/RenderWindow.hpp>
|
||||
#include <memory>
|
||||
|
||||
#include "shared/classicmode/classicfactory.h"
|
||||
|
||||
class ClassicFactorySFML : public ClassicFactory
|
||||
{
|
||||
public:
|
||||
explicit ClassicFactorySFML(sf::RenderTarget * const render_target);
|
||||
virtual std::unique_ptr<kku::Game> getGame() const override;
|
||||
virtual std::unique_ptr<kku::Editor> getEditor() const override;
|
||||
|
||||
private:
|
||||
sf::RenderTarget * const _render_target;
|
||||
};
|
@ -1,66 +0,0 @@
|
||||
#include "classicspritesfml.h"
|
||||
|
||||
ClassicSpriteSFML::ClassicSpriteSFML(sf::RenderTarget * const render_target,
|
||||
const sf::RectangleShape& shape) :
|
||||
_prototype(shape),
|
||||
_shape(shape),
|
||||
_trail(shape),
|
||||
_render_target(render_target)
|
||||
{}
|
||||
|
||||
void ClassicSpriteSFML::reset()
|
||||
{
|
||||
_shape.setPosition(0, 0);
|
||||
_trail.setPosition(0, 0);
|
||||
|
||||
_shape = _prototype;
|
||||
_trail = _prototype;
|
||||
}
|
||||
|
||||
void ClassicSpriteSFML::setPosition(const kku::Point& position)
|
||||
{
|
||||
_shape.setPosition(position.x, position.y);
|
||||
}
|
||||
|
||||
void ClassicSpriteSFML::setTrailPosition(const kku::Point &position)
|
||||
{
|
||||
_trail.setPosition(position.x, position.y);
|
||||
}
|
||||
|
||||
kku::Point ClassicSpriteSFML::getPosition() const
|
||||
{
|
||||
return kku::Point{ _shape.getPosition().x, _shape.getPosition().y };
|
||||
}
|
||||
|
||||
kku::Point ClassicSpriteSFML::getTrailPosition() const
|
||||
{
|
||||
return kku::Point{ _trail.getPosition().x, _trail.getPosition().y };
|
||||
}
|
||||
|
||||
void ClassicSpriteSFML::setColor(const kku::Color& color)
|
||||
{
|
||||
_shape.setFillColor(sf::Color{ color.red, color.green, color.blue, color.alpha });
|
||||
}
|
||||
|
||||
void ClassicSpriteSFML::setTrailColor(const kku::Color& color)
|
||||
{
|
||||
_trail.setFillColor(sf::Color{ color.red, color.green, color.blue, color.alpha });
|
||||
}
|
||||
|
||||
kku::Color ClassicSpriteSFML::getColor() const
|
||||
{
|
||||
const auto color = _shape.getFillColor();
|
||||
return kku::Color{ color.r, color.g, color.b, color.a };
|
||||
}
|
||||
|
||||
kku::Color ClassicSpriteSFML::getTrailColor() const
|
||||
{
|
||||
const auto color = _trail.getFillColor();
|
||||
return kku::Color{ color.r, color.g, color.b, color.a };
|
||||
}
|
||||
|
||||
void ClassicSpriteSFML::display() const
|
||||
{
|
||||
_render_target->draw(_shape);
|
||||
_render_target->draw(_trail);
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "graphics/classicsprite.h"
|
||||
|
||||
#include <SFML/Graphics/RectangleShape.hpp>
|
||||
#include <SFML/Graphics/RenderTarget.hpp>
|
||||
|
||||
class ClassicSpriteSFML : public ClassicSprite
|
||||
{
|
||||
public:
|
||||
explicit ClassicSpriteSFML(sf::RenderTarget * const render_target,
|
||||
const sf::RectangleShape& shape);
|
||||
|
||||
virtual void reset() override;
|
||||
virtual void display() const override;
|
||||
|
||||
virtual void setPosition(const kku::Point &position) override;
|
||||
virtual void setTrailPosition(const kku::Point &position) override;
|
||||
virtual kku::Point getPosition() const override;
|
||||
virtual kku::Point getTrailPosition() const override;
|
||||
|
||||
virtual void setColor(const kku::Color& color) override;
|
||||
virtual void setTrailColor(const kku::Color& color) override;
|
||||
virtual kku::Color getColor() const override;
|
||||
virtual kku::Color getTrailColor() const override;
|
||||
|
||||
private:
|
||||
sf::RectangleShape _prototype;
|
||||
|
||||
sf::RectangleShape _shape;
|
||||
sf::RectangleShape _trail;
|
||||
|
||||
sf::RenderTarget * const _render_target;
|
||||
};
|
@ -1,35 +0,0 @@
|
||||
#include "spritefactorysfml.h"
|
||||
#include "classicspritesfml.h"
|
||||
|
||||
ClassicSpriteFactorySFML::ClassicSpriteFactorySFML(sf::RenderTarget * const 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<ClassicSpriteSFML>(_render_target, sprite);
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "graphics/classicspritefactory.h"
|
||||
|
||||
#include <SFML/Graphics/RenderTarget.hpp>
|
||||
|
||||
class ClassicSpriteFactorySFML : public ClassicSpriteFactory
|
||||
{
|
||||
public:
|
||||
explicit ClassicSpriteFactorySFML(sf::RenderTarget * const render_target);
|
||||
virtual std::shared_ptr<ClassicSprite> create(Type type) const override;
|
||||
|
||||
private:
|
||||
sf::RenderTarget * const _render_target;
|
||||
};
|
@ -1,34 +1,31 @@
|
||||
#include "classicfactorysfml.h"
|
||||
#include "spritefactorysfml.h"
|
||||
#include "classicmode/classicfactory.h"
|
||||
|
||||
#include "graphics/classicscenegraphicsmanager.h"
|
||||
#include "core/timeline.h"
|
||||
#include "graphics/classicgraphicsfactory.h"
|
||||
|
||||
#include "core/timeline.h"
|
||||
#include "game/classicgame.h"
|
||||
#include "editor/classiceditor.h"
|
||||
|
||||
ClassicFactorySFML::ClassicFactorySFML(sf::RenderTarget * const render_target) :
|
||||
_render_target(render_target)
|
||||
{}
|
||||
|
||||
std::unique_ptr<kku::Game> ClassicFactorySFML::getGame() const
|
||||
std::unique_ptr<kku::Game> classic::getGame(const std::shared_ptr<kku::CoreFactory>& core_factory)
|
||||
{
|
||||
// read offset from beatmap metadata
|
||||
const kku::microsec visibility_offset = 1648648;
|
||||
|
||||
const auto factory = std::make_shared<ClassicSpriteFactorySFML>(_render_target);
|
||||
const auto factory = std::make_shared<ClassicGraphicsFactory>(core_factory);
|
||||
const auto timeline = std::make_shared<kku::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<kku::Editor> ClassicFactorySFML::getEditor() const
|
||||
std::unique_ptr<kku::Editor> classic::getEditor(const std::shared_ptr<kku::CoreFactory>& core_factory)
|
||||
{
|
||||
// read offset from beatmap metadata
|
||||
const kku::microsec visibility_offset = 1648648;
|
||||
|
||||
const auto factory = std::make_shared<ClassicSpriteFactorySFML>(_render_target);
|
||||
const auto factory = std::make_shared<ClassicGraphicsFactory>(core_factory);
|
||||
const auto timeline = std::make_shared<kku::Timeline<ClassicNote>>();
|
||||
const auto graphics_manager = std::make_shared<ClassicSceneGraphicsManager>(timeline, factory, visibility_offset);
|
||||
|
@ -0,0 +1,85 @@
|
||||
#include "classicmocknote.h"
|
||||
#include "graphics/classicscenegraphicsmanager.h"
|
||||
#include "graphics/animations/classicanimationscenario.h"
|
||||
#include "holdmanager.h"
|
||||
|
||||
ClassicMockNote::ClassicMockNote(ArrowNoteInitializer&& init) :
|
||||
ClassicNote(std::move(init.initializer))
|
||||
{
|
||||
_elements.resize(init.elements.size());
|
||||
|
||||
for (std::size_t i = 0; i < _elements.size(); ++i)
|
||||
{
|
||||
_elements[i].position = init.elements[i].element.position;
|
||||
_elements[i].type = init.elements[i].element.type;
|
||||
}
|
||||
}
|
||||
|
||||
bool ClassicMockNote::isActive(const kku::microsec &offset) const
|
||||
{
|
||||
(void)offset;
|
||||
return _state != State::DEAD
|
||||
&& _state != State::NONE;
|
||||
}
|
||||
|
||||
void ClassicMockNote::input(kku::GameEvent&& input)
|
||||
{
|
||||
switch (input.event.type)
|
||||
{
|
||||
|
||||
default:
|
||||
break;
|
||||
|
||||
case kku::SystemEvent::Type::MousePress:
|
||||
{
|
||||
const auto position = std::get<kku::SystemEvent::Mouse>(input.event.data).position;
|
||||
for (auto& element : _elements)
|
||||
{
|
||||
if (element.sprite->getRectangle()->contains(position))
|
||||
{
|
||||
element.selected = !element.selected;
|
||||
element.selection->toggle(element.selected);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void ClassicMockNote::update(const kku::microsec& music_offset)
|
||||
{
|
||||
switch (_state)
|
||||
{
|
||||
default: return;
|
||||
break;
|
||||
|
||||
case State::FLYING:
|
||||
if (music_offset >= getPerfectOffset())
|
||||
{
|
||||
_state = State::DYING;
|
||||
for (auto& element : _elements)
|
||||
element.animations[_state]->launch(element.sprite, music_offset, getPerfectOffset());
|
||||
}
|
||||
break;
|
||||
|
||||
case State::DYING:
|
||||
if (_elements[0].animations[_state]->isDone())
|
||||
_state = State::DEAD;
|
||||
break;
|
||||
}
|
||||
|
||||
for (auto& element : _elements)
|
||||
if (element.animations[_state])
|
||||
element.animations[_state]->update(music_offset);
|
||||
}
|
||||
|
||||
void ClassicMockNote::display(const ClassicGraphicsManager * const manager) const
|
||||
{
|
||||
manager->display(_elements);
|
||||
}
|
||||
|
||||
void ClassicMockNote::setGraphics(ClassicGraphicsManager * const manager, kku::TimeRange&& range)
|
||||
{
|
||||
manager->setGraphics(_elements, std::move(range));
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
#pragma once
|
||||
|
||||
#include "arrowelement.h"
|
||||
#include "classicnote.h"
|
||||
|
||||
#include "mockelement.h"
|
||||
#include "initializers/arrownoteinitializer.h"
|
||||
|
||||
class ClassicMockNote : public ClassicNote
|
||||
{
|
||||
public:
|
||||
explicit ClassicMockNote(ArrowNoteInitializer&& init);
|
||||
virtual ~ClassicMockNote() = default;
|
||||
|
||||
virtual bool isActive(const kku::microsec& offset) const override;
|
||||
virtual void update(const kku::microsec &music_offset) override;
|
||||
virtual void input(kku::GameEvent&& input) override;
|
||||
|
||||
virtual void display(const ClassicGraphicsManager * const manager) const override;
|
||||
virtual void setGraphics(ClassicGraphicsManager * const manager, kku::TimeRange&& range) override;
|
||||
|
||||
private:
|
||||
std::vector<MockElement> _elements;
|
||||
bool _is_selected;
|
||||
};
|
||||
|
||||
using MockElements = std::vector<MockElement>;
|
@ -0,0 +1,32 @@
|
||||
#pragma once
|
||||
|
||||
#include "classicmode/classicactions.h"
|
||||
|
||||
#include "core/gameevent.h"
|
||||
#include "core/point.h"
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include <array>
|
||||
|
||||
class ClassicAnimationScenario;
|
||||
class ClassicSprite;
|
||||
class ClassicSelection;
|
||||
|
||||
struct MockElement
|
||||
{
|
||||
std::shared_ptr<ClassicSprite> sprite;
|
||||
std::shared_ptr<ClassicSelection> selection;
|
||||
bool selected;
|
||||
|
||||
std::array<std::shared_ptr<ClassicAnimationScenario>, 5> animations;
|
||||
|
||||
kku::Point position;
|
||||
std::vector<kku::Point> falling_curve_interpolation;
|
||||
|
||||
Type type = Type::NONE;
|
||||
|
||||
// Each note may consist of several buttons.
|
||||
// For example, ↑ → or ↓ → ←
|
||||
// Note Element represents this idea.
|
||||
};
|
@ -0,0 +1,56 @@
|
||||
#include "classicgraphicsfactory.h"
|
||||
|
||||
ClassicGraphicsFactory::ClassicGraphicsFactory(const std::shared_ptr<kku::CoreFactory>& core_factory) :
|
||||
_core_factory(core_factory)
|
||||
{}
|
||||
|
||||
|
||||
|
||||
auto ClassicGraphicsFactory::generate(Type type) const -> SpriteData
|
||||
{
|
||||
auto shape = _core_factory->getRectangle();
|
||||
auto trail = _core_factory->getRectangle();
|
||||
shape->setRect(kku::Area<float>{0.f, 0.f, 20.f, 20.f});
|
||||
trail->setRect(kku::Area<float>{0.f, 0.f, 20.f, 20.f});
|
||||
|
||||
kku::Color color;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case Type::UP:
|
||||
color = kku::Color{255, 0, 0, 255};
|
||||
break;
|
||||
|
||||
case Type::DOWN:
|
||||
color = kku::Color{0, 255, 0, 255};
|
||||
break;
|
||||
|
||||
case Type::LEFT:
|
||||
color = kku::Color{0, 0, 255, 255};
|
||||
break;
|
||||
|
||||
case Type::RIGHT:
|
||||
color = kku::Color{255, 0, 255, 255};
|
||||
break;
|
||||
|
||||
default: // yellow
|
||||
color = kku::Color{255, 239, 0, 255};
|
||||
}
|
||||
|
||||
shape->setColor(color);
|
||||
trail->setColor(color);
|
||||
|
||||
return SpriteData{shape, trail, color};
|
||||
}
|
||||
|
||||
std::shared_ptr<ClassicSprite> ClassicGraphicsFactory::createSprite(Type type) const
|
||||
{
|
||||
const auto data = generate(type);
|
||||
return std::make_shared<ClassicSprite>(ClassicSprite::Init{data.shape, data.trail, data.color});
|
||||
}
|
||||
|
||||
std::shared_ptr<ClassicSelection> ClassicGraphicsFactory::createSelection() const
|
||||
{
|
||||
const auto shape = _core_factory->getRectangle();
|
||||
return std::make_shared<ClassicSelection>(ClassicSelection::Init{shape, kku::Color{51, 153, 255, 0}});
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "classicmode/classicactions.h"
|
||||
#include "graphics/classicsprite.h"
|
||||
#include "graphics/classicselection.h"
|
||||
#include "core/rectangle.h"
|
||||
#include "core/corefactory.h"
|
||||
|
||||
class ClassicGraphicsFactory
|
||||
{
|
||||
public:
|
||||
explicit ClassicGraphicsFactory(const std::shared_ptr<kku::CoreFactory>& core_factory);
|
||||
|
||||
std::shared_ptr<ClassicSprite> createSprite(Type type) const;
|
||||
std::shared_ptr<ClassicSelection> createSelection() const;
|
||||
|
||||
private:
|
||||
const std::shared_ptr<kku::CoreFactory> _core_factory;
|
||||
|
||||
struct SpriteData
|
||||
{
|
||||
std::shared_ptr<kku::Rectangle> shape;
|
||||
std::shared_ptr<kku::Rectangle> trail;
|
||||
kku::Color color;
|
||||
};
|
||||
|
||||
SpriteData generate(Type type) const;
|
||||
};
|
@ -0,0 +1,34 @@
|
||||
#include "classicselection.h"
|
||||
#include "classicsprite.h"
|
||||
|
||||
ClassicSelection::ClassicSelection(ClassicSelection::Init&& init) :
|
||||
_fill_color(init.color),
|
||||
_shape(init.shape)
|
||||
{
|
||||
_shape->setColor(init.color);
|
||||
}
|
||||
|
||||
void ClassicSelection::reset()
|
||||
{
|
||||
_shape->setPosition(kku::Point{0, 0});
|
||||
_shape->setColor(kku::Color{0, 0, 0, 0});
|
||||
}
|
||||
|
||||
void ClassicSelection::display() const
|
||||
{
|
||||
_shape->display();
|
||||
}
|
||||
|
||||
void ClassicSelection::adjustTo(const std::shared_ptr<ClassicSprite>& sprite)
|
||||
{
|
||||
_shape->setRect(sprite->getRectangle()->getRect());
|
||||
}
|
||||
|
||||
void ClassicSelection::toggle(bool selected)
|
||||
{
|
||||
_fill_color.alpha = selected
|
||||
? 120
|
||||
: 0;
|
||||
|
||||
_shape->setColor(_fill_color);
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
#pragma once
|
||||
|
||||
#include "core/sprite.h"
|
||||
#include "core/color.h"
|
||||
#include "core/rectangle.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
class ClassicSprite;
|
||||
|
||||
class ClassicSelection : public kku::Sprite
|
||||
{
|
||||
public:
|
||||
|
||||
struct Init
|
||||
{
|
||||
std::shared_ptr<kku::Rectangle> shape;
|
||||
kku::Color color;
|
||||
};
|
||||
|
||||
explicit ClassicSelection(ClassicSelection::Init&& init);
|
||||
virtual void reset() override;
|
||||
virtual void display() const override;
|
||||
|
||||
void adjustTo(const std::shared_ptr<ClassicSprite>& sprite);
|
||||
void toggle(bool selected);
|
||||
|
||||
protected:
|
||||
kku::Color _fill_color;
|
||||
std::shared_ptr<kku::Rectangle> _shape;
|
||||
};
|
@ -0,0 +1,70 @@
|
||||
#include "classicsprite.h"
|
||||
|
||||
ClassicSprite::ClassicSprite(ClassicSprite::Init&& init) :
|
||||
_reset_color(init.color),
|
||||
_shape(init.shape),
|
||||
_trail(init.trail)
|
||||
{
|
||||
_shape->setColor(init.color);
|
||||
_trail->setColor(init.color);
|
||||
}
|
||||
|
||||
void ClassicSprite::reset()
|
||||
{
|
||||
_shape->setPosition(kku::Point{0, 0});
|
||||
_trail->setPosition(kku::Point{0, 0});
|
||||
|
||||
_shape->setColor(_reset_color);
|
||||
_trail->setColor(_reset_color);
|
||||
}
|
||||
|
||||
void ClassicSprite::setPosition(const kku::Point& position)
|
||||
{
|
||||
_shape->setPosition(position);
|
||||
}
|
||||
|
||||
void ClassicSprite::setTrailPosition(const kku::Point &position)
|
||||
{
|
||||
_trail->setPosition(position);
|
||||
}
|
||||
|
||||
kku::Point ClassicSprite::getPosition() const
|
||||
{
|
||||
return _shape->getPosition();
|
||||
}
|
||||
|
||||
kku::Point ClassicSprite::getTrailPosition() const
|
||||
{
|
||||
return _trail->getPosition();
|
||||
}
|
||||
|
||||
void ClassicSprite::setColor(const kku::Color& color)
|
||||
{
|
||||
_shape->setColor(color);
|
||||
}
|
||||
|
||||
void ClassicSprite::setTrailColor(const kku::Color& color)
|
||||
{
|
||||
_trail->setColor(color);
|
||||
}
|
||||
|
||||
kku::Color ClassicSprite::getColor() const
|
||||
{
|
||||
return _shape->getColor();
|
||||
}
|
||||
|
||||
kku::Color ClassicSprite::getTrailColor() const
|
||||
{
|
||||
return _trail->getColor();
|
||||
}
|
||||
|
||||
void ClassicSprite::display() const
|
||||
{
|
||||
_shape->display();
|
||||
_trail->display();
|
||||
}
|
||||
|
||||
std::shared_ptr<const kku::Rectangle> ClassicSprite::getRectangle() const
|
||||
{
|
||||
return _shape;
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "classicmode/classicactions.h"
|
||||
#include "graphics/classicsprite.h"
|
||||
|
||||
class ClassicSpriteFactory
|
||||
{
|
||||
public:
|
||||
virtual ~ClassicSpriteFactory() = default;
|
||||
virtual std::shared_ptr<ClassicSprite> create(Type type) const = 0;
|
||||
};
|
@ -1,112 +0,0 @@
|
||||
#include "classictimelinegraphicsmanager.h"
|
||||
#include "graphics/classicsprite.h"
|
||||
|
||||
#include "game/arrowelement.h"
|
||||
|
||||
#include "graphics/animations/classicflyinganimationscenario.h"
|
||||
#include "graphics/animations/classicdyinganimationscenario.h"
|
||||
|
||||
ClassicTimelineGraphicsManager::ClassicTimelineGraphicsManager(const std::shared_ptr<kku::Timeline<ClassicNote>>& timeline,
|
||||
const std::shared_ptr<ClassicSpriteFactory>& factory,
|
||||
const kku::microsec& visibility_offset) :
|
||||
ClassicGraphicsManager(factory, visibility_offset),
|
||||
_timeline(timeline),
|
||||
_display_offset(0)
|
||||
{
|
||||
_timeline->expire(_first);
|
||||
_timeline->expire(_last);
|
||||
|
||||
_sprites[Type::NONE] = nullptr;
|
||||
_sprites[Type::UP] = factory->getSprite(Type::UP);
|
||||
_sprites[Type::RIGHT] = factory->getSprite(Type::RIGHT);
|
||||
_sprites[Type::DOWN] = factory->getSprite(Type::DOWN);
|
||||
_sprites[Type::LEFT] = factory->getSprite(Type::LEFT);
|
||||
//_sprites[Type::SLIDER_RIGHT] = factory->getSprite(Type::SLIDER_RIGHT);
|
||||
//_sprites[Type::SLIDER_LEFT] = factory->getSprite(Type::SLIDER_LEFT);
|
||||
}
|
||||
|
||||
void ClassicTimelineGraphicsManager::display() const
|
||||
{
|
||||
if (nothingToDraw())
|
||||
return;
|
||||
|
||||
for (auto it = _first; it != _last; ++it)
|
||||
{
|
||||
const auto& note = (*it);
|
||||
note->display(this);
|
||||
}
|
||||
}
|
||||
|
||||
void ClassicTimelineGraphicsManager::update(const kku::microsec &offset)
|
||||
{
|
||||
_timeline->expire(_first);
|
||||
_timeline->expire(_last);
|
||||
|
||||
fetchLastNote(offset);
|
||||
fetchFirstNote(offset);
|
||||
|
||||
_display_offset = offset;
|
||||
}
|
||||
|
||||
void ClassicTimelineGraphicsManager::display(const std::vector<ArrowElement>& elements) const
|
||||
{
|
||||
for (std::size_t i = 0; i < elements.size(); ++i)
|
||||
{
|
||||
auto sprite = *_sprites.at(elements.at(i).type)
|
||||
|
||||
if (i >= 1)
|
||||
{
|
||||
//const auto& neighbor_sprite = elements[i - 1].sprite;
|
||||
|
||||
//const auto c1 = neighbor_sprite->trailPosition();
|
||||
//const auto c2 = sprite->trailPosition();
|
||||
|
||||
//_render_target->draw(makeLine(c1, c2));
|
||||
}
|
||||
|
||||
sprite->setPosition(kku::Position{});
|
||||
sprite->display();
|
||||
}
|
||||
}
|
||||
|
||||
void ClassicTimelineGraphicsManager::fetchFirstNote(const kku::microsec& offset)
|
||||
{
|
||||
if (nothingToDraw())
|
||||
return;
|
||||
|
||||
Iterator note_iterator = _first;
|
||||
while (!_timeline->isExpired(note_iterator) && isVisiblyClose(note_iterator, offset))
|
||||
{
|
||||
--note_iterator;
|
||||
}
|
||||
|
||||
_first = note_iterator;
|
||||
}
|
||||
|
||||
void ClassicTimelineGraphicsManager::fetchLastNote(const kku::microsec& offset)
|
||||
{
|
||||
Iterator note_iterator = _timeline->getTopNote();
|
||||
while (!_timeline->isExpired(note_iterator) && isVisiblyClose(note_iterator, offset))
|
||||
{
|
||||
if (nothingToDraw())
|
||||
_first = note_iterator;
|
||||
|
||||
++note_iterator;
|
||||
}
|
||||
|
||||
_last = note_iterator;
|
||||
}
|
||||
|
||||
bool ClassicTimelineGraphicsManager::nothingToDraw() const noexcept
|
||||
{
|
||||
return _timeline->isExpired(_first)
|
||||
|| _timeline->isExpired(_last);
|
||||
}
|
||||
|
||||
bool ClassicTimelineGraphicsManager::isVisiblyClose(const Iterator& iterator, const kku::microsec& music_offset) const noexcept
|
||||
{
|
||||
const auto& perfect_offset = (*iterator)->getPerfectOffset();
|
||||
|
||||
return ((perfect_offset - _visibility_offset) <= music_offset)
|
||||
|| ((perfect_offset + (_visibility_offset / 4.)) >= music_offset);
|
||||
}
|
@ -1,37 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "game/classicnote.h"
|
||||
#include "graphics/classicgraphicsmanager.h"
|
||||
#include "core/timeline.h"
|
||||
|
||||
class ClassicSprite;
|
||||
|
||||
class ClassicTimelineGraphicsManager : public ClassicGraphicsManager
|
||||
{
|
||||
public:
|
||||
explicit ClassicTimelineGraphicsManager(const std::shared_ptr<kku::Timeline<ClassicNote>>& timeline,
|
||||
const std::shared_ptr<ClassicSpriteFactory>& factory,
|
||||
const kku::microsec& visibility_offset);
|
||||
|
||||
virtual void display() const override;
|
||||
virtual void update(const kku::microsec& offset) override;
|
||||
|
||||
virtual void display(const std::vector<ArrowElement>& elements) const override;
|
||||
|
||||
protected:
|
||||
using Iterator = kku::Timeline<ClassicNote>::Iterator;
|
||||
|
||||
Iterator _first;
|
||||
Iterator _last;
|
||||
|
||||
const std::shared_ptr<kku::Timeline<ClassicNote>> _timeline;
|
||||
kku::microsec _display_offset;
|
||||
|
||||
mutable std::map<std::shared_ptr<ClassicSprite>, Type::COUNT> _sprites;
|
||||
|
||||
inline bool nothingToDraw() const noexcept;
|
||||
inline bool isVisiblyClose(const Iterator& iterator, const kku::microsec& music_offset) const noexcept;
|
||||
|
||||
void fetchFirstNote(const kku::microsec& offset);
|
||||
void fetchLastNote(const kku::microsec& offset);
|
||||
};
|
@ -1,9 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
|
||||
class ClassicNotePainter
|
||||
{
|
||||
virtual ~ClassicNotePainter() = default;
|
||||
};
|
Loading…
Reference in New Issue