forked from NaiJi/project-kyoku
Finish test basic implementation for ClassEditor
parent
0b1acd7697
commit
43e09a6db1
@ -1,21 +1,65 @@
|
||||
#include "classiceditor.h"
|
||||
|
||||
ClassicEditor::ClassicEditor(std::shared_ptr<ClassicGraphicsManager>&& manager)
|
||||
ClassicEditor::ClassicEditor(std::shared_ptr<ClassicGraphicsManager>&& manager) :
|
||||
_graphics_manager(manager),
|
||||
_selected_type(Type::UP)
|
||||
{
|
||||
|
||||
_context.graphics_manager = _graphics_manager;
|
||||
}
|
||||
|
||||
void ClassicEditor::input(PlayerInput&& inputdata)
|
||||
{
|
||||
const auto& event = inputdata.event;
|
||||
const auto offset = _music.fetchOffset();
|
||||
|
||||
switch (event.type)
|
||||
{
|
||||
|
||||
default:
|
||||
break;
|
||||
|
||||
case sf::Event::MouseButtonPressed:
|
||||
{
|
||||
const auto note = _timeline.getNoteBy(offset);
|
||||
if (_timeline.isExpired(note))
|
||||
{
|
||||
NoteInitializer init;
|
||||
init.context = &_context;
|
||||
init.intervals = {};
|
||||
init.perfect_offset = offset;
|
||||
|
||||
ElementInitializer elem_init;
|
||||
elem_init.type = _selected_type;
|
||||
elem_init.coordinates = Coordinates{ event.mouseButton.x, event.mouseButton.y };
|
||||
elem_init.falling_curve_interpolation = {};
|
||||
|
||||
MockArrowNoteInitializer mock_init;
|
||||
mock_init.elements = {elem_init};
|
||||
mock_init.initializer = init;
|
||||
|
||||
_timeline.insertNote(new MockClassicNote(std::move(mock_init)));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void ClassicEditor::update(const sf::Time& dt)
|
||||
{
|
||||
(void)dt;
|
||||
// TODO!!!
|
||||
|
||||
_timeline.update(_music.fetchOffset());
|
||||
_timeline.fetchVisibleNotes();
|
||||
}
|
||||
|
||||
void ClassicEditor::draw() const
|
||||
{
|
||||
_timeline.drawVisibleNotes();
|
||||
}
|
||||
|
||||
void ClassicEditor::selectNoteType(Type type) noexcept
|
||||
{
|
||||
_selected_type = type;
|
||||
}
|
||||
|
@ -1,7 +1,93 @@
|
||||
#include "mockclassicnote.h"
|
||||
#include "graphics/classicgraphicsmanager.h"
|
||||
|
||||
// Replace with interface by dependency injection
|
||||
#include "graphics/classicflyinganimationscenario.h"
|
||||
#include "graphics/classicdyinganimationscenario.h"
|
||||
//
|
||||
|
||||
// A LOT OF CODE DUPLICATES game/arrowclassicnote, DO SOMETHING D:<
|
||||
|
||||
MockClassicNote::MockClassicNote(MockArrowNoteInitializer&& init) :
|
||||
Note(init.initializer)
|
||||
Note(init.initializer.perfect_offset),
|
||||
_state(State::NONE),
|
||||
_context(init.initializer.context)
|
||||
{
|
||||
_elements.resize(init.elements.size());
|
||||
|
||||
for (std::size_t i = 0; i < _elements.size(); ++i)
|
||||
{
|
||||
_elements[i].coordinates = init.elements[i].coordinates;
|
||||
_elements[i].type = init.elements[i].type;
|
||||
|
||||
// Animations will be injected into note.
|
||||
_elements[i].animations[State::NONE] = nullptr;
|
||||
_elements[i].animations[State::FLYING] = std::make_shared<ClassicFlyingAnimationScenario>();
|
||||
_elements[i].animations[State::DYING] = std::make_shared<ClassicDyingAnimationScenario>();
|
||||
_elements[i].animations[State::DEAD] = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
bool MockClassicNote::isActive() const
|
||||
{
|
||||
return _state != State::DEAD
|
||||
&& _state != State::NONE;
|
||||
}
|
||||
|
||||
bool MockClassicNote::isInGame() const
|
||||
{
|
||||
return _state == State::FLYING
|
||||
|| _state == State::DYING;
|
||||
}
|
||||
|
||||
bool MockClassicNote::shouldRemove() const
|
||||
{
|
||||
return _state == State::DEAD;
|
||||
}
|
||||
|
||||
void MockClassicNote::putToGame(const microsec &music_offset)
|
||||
{
|
||||
_state = State::FLYING;
|
||||
|
||||
for (auto& element : _elements)
|
||||
{
|
||||
element.sprite = _context->graphics_manager->getSprite(element.type);
|
||||
element.sprite->setCoordinates(element.coordinates);
|
||||
element.sprite->setTrailCoordinates(Coordinates(0.f, 9.f));
|
||||
element.animations[_state]->launch(element.sprite, music_offset, offset());
|
||||
}
|
||||
}
|
||||
|
||||
void MockClassicNote::update(const microsec &music_offset)
|
||||
{
|
||||
switch (_state)
|
||||
{
|
||||
default: return;
|
||||
break;
|
||||
|
||||
case State::FLYING:
|
||||
if (music_offset > offset())
|
||||
_state = State::DYING;
|
||||
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 MockClassicNote::draw() const
|
||||
{
|
||||
for (std::size_t i = 0; i < _elements.size(); ++i)
|
||||
{
|
||||
if (i >= 1)
|
||||
_context->graphics_manager->drawLine(_elements[i-1].sprite->trailCoordinates(), _elements[i].sprite->trailCoordinates());
|
||||
|
||||
_context->graphics_manager->draw(_elements[i].sprite);
|
||||
}
|
||||
}
|
||||
|
@ -1,12 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
#include "classicmode/elementinitializer.h"
|
||||
#include "classicmode/classicactions.h"
|
||||
|
||||
struct ArrowElementInitializer
|
||||
{
|
||||
ElementInitializer element;
|
||||
|
||||
Type type = Type::NONE;
|
||||
std::array<sf::Keyboard::Key, 2> keys;
|
||||
};
|
||||
|
@ -0,0 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
|
||||
class ClassicGraphicsManager;
|
||||
class HoldManager;
|
||||
|
||||
struct Context
|
||||
{
|
||||
std::shared_ptr<ClassicGraphicsManager> graphics_manager;
|
||||
std::shared_ptr<HoldManager> hold_manager;
|
||||
};
|
Loading…
Reference in New Issue