forked from NaiJi/project-kyoku
Implement scrolling in Editor
This commit is contained in:
parent
5e3ddccac0
commit
ebf736a0bb
|
@ -4,4 +4,7 @@
|
|||
build
|
||||
SFML*
|
||||
*.user
|
||||
|
||||
*CMakeFiles*
|
||||
*Makefile
|
||||
*.cmake*
|
||||
*.cbp
|
||||
|
|
|
@ -36,7 +36,7 @@ public:
|
|||
|
||||
void insertNote(TNote* note)
|
||||
{
|
||||
_timeline.insert(_top_note, note);
|
||||
_top_note = _timeline.insert(note).first;
|
||||
update(_current_offset);
|
||||
}
|
||||
|
||||
|
@ -61,6 +61,7 @@ public:
|
|||
if (isExpired(_top_note))
|
||||
return;
|
||||
|
||||
checkTopNote(_current_offset);
|
||||
checkCurrentActiveNote();
|
||||
checkForNextActiveNote();
|
||||
updateVisibleSprites(_current_offset);
|
||||
|
@ -86,7 +87,7 @@ public:
|
|||
return;
|
||||
|
||||
Iterator note_iterator = _top_note;
|
||||
while (isVisiblyClose(note_iterator, music_offset))
|
||||
while (!isExpired(note_iterator) && isVisiblyClose(note_iterator, music_offset))
|
||||
{
|
||||
if (nothingToDraw())
|
||||
_first_visible_note = note_iterator;
|
||||
|
@ -173,6 +174,15 @@ private:
|
|||
}
|
||||
}
|
||||
|
||||
void checkTopNote(const microsec& offset)
|
||||
{
|
||||
if (isExpired(_top_note) || !isExpired(_active_note))
|
||||
return;
|
||||
|
||||
while ((*_top_note)->offset() < offset)
|
||||
++_top_note;
|
||||
}
|
||||
|
||||
void checkForNextActiveNote()
|
||||
{
|
||||
if (!isExpired(_active_note))
|
||||
|
|
|
@ -3,10 +3,34 @@
|
|||
ClassicEditor::ClassicEditor(std::shared_ptr<ClassicGraphicsManager>&& manager) :
|
||||
_graphics_manager(manager),
|
||||
_selected_type(Type::UP),
|
||||
_current_time(0)
|
||||
_current_time(0),
|
||||
_scroll_step(500000)
|
||||
{
|
||||
_context.graphics_manager = _graphics_manager;
|
||||
_timeline.setNotes({}, 1648648);
|
||||
|
||||
int basic_offset = 500000 * 6;
|
||||
|
||||
std::set<MockClassicNote*, NotePtrCompt> _set = {};
|
||||
|
||||
for (int i = 1; i < 5; ++i)
|
||||
{
|
||||
NoteInitializer init;
|
||||
init.context = &_context;
|
||||
init.intervals = {};
|
||||
init.perfect_offset = basic_offset + (500000 * i);
|
||||
|
||||
ElementInitializer elem_init;
|
||||
elem_init.type = _selected_type;
|
||||
elem_init.coordinates = Coordinates{ 700 - (i * 120), 550 };
|
||||
elem_init.falling_curve_interpolation = {};
|
||||
|
||||
MockArrowNoteInitializer mock_init;
|
||||
mock_init.elements = {elem_init};
|
||||
mock_init.initializer = init;
|
||||
_set.insert(new MockClassicNote(std::move(mock_init)));
|
||||
}
|
||||
|
||||
_timeline.setNotes(_set, 1648648);
|
||||
}
|
||||
|
||||
void ClassicEditor::input(PlayerInput&& inputdata)
|
||||
|
|
|
@ -28,4 +28,5 @@ private:
|
|||
|
||||
Type _selected_type;
|
||||
microsec _current_time;
|
||||
microsec _scroll_step;
|
||||
};
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
#include "graphics/classicdyinganimationscenario.h"
|
||||
//
|
||||
|
||||
#include <iostream>
|
||||
|
||||
// A LOT OF CODE DUPLICATES game/arrowclassicnote, DO SOMETHING D:<
|
||||
|
||||
MockClassicNote::MockClassicNote(MockArrowNoteInitializer&& init) :
|
||||
|
@ -49,6 +51,8 @@ void MockClassicNote::putToGame(const microsec &music_offset)
|
|||
{
|
||||
_state = State::FLYING;
|
||||
|
||||
std::cout << "Put to game " << this << ": " << music_offset << '\n';
|
||||
|
||||
for (auto& element : _elements)
|
||||
{
|
||||
element.sprite = _context->graphics_manager->getSprite(element.type);
|
||||
|
@ -67,11 +71,6 @@ void MockClassicNote::update(const microsec &music_offset)
|
|||
|
||||
case State::FLYING:
|
||||
if (music_offset > offset())
|
||||
_state = State::DYING;
|
||||
break;
|
||||
|
||||
case State::DYING:
|
||||
if (_elements[0].animations[_state]->isDone())
|
||||
_state = State::DEAD;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -156,6 +156,9 @@ void EditorState::enter()
|
|||
|
||||
callbacks.onInput = [&editor, &music](const sf::Event& event)
|
||||
{
|
||||
if (event.type == sf::Event::MouseWheelScrolled)
|
||||
music.moveOffset(event.mouseWheelScroll.delta > 0 ? 500000 : -500000);
|
||||
else
|
||||
editor->input(PlayerInput{music.fetchOffset(), event});
|
||||
};
|
||||
|
||||
|
@ -167,9 +170,9 @@ void EditorState::enter()
|
|||
auto editor_widget = std::make_shared<EditorWidget>(std::move(callbacks));
|
||||
|
||||
_group = std::make_shared<Group>();
|
||||
_group->addChild(editor_widget);
|
||||
_group->addChild(menu_bar);
|
||||
_group->addChild(bpm_widget);
|
||||
_group->addChild(editor_widget);
|
||||
}
|
||||
|
||||
void EditorState::leave()
|
||||
|
@ -177,4 +180,3 @@ void EditorState::leave()
|
|||
_group.reset();
|
||||
_bpm_calculator.reset();
|
||||
}
|
||||
|
||||
|
|
|
@ -21,7 +21,9 @@ public:
|
|||
void setVolume(int volume);
|
||||
|
||||
void setOffset(const microsec& offset);
|
||||
void moveOffset(const microsec& delta);
|
||||
microsec fetchOffset();
|
||||
microsec getDuration() const;
|
||||
|
||||
private:
|
||||
sf::Music _music;
|
||||
|
|
|
@ -61,3 +61,27 @@ microsec Music::fetchOffset()
|
|||
|
||||
return _absolute_offset;
|
||||
}
|
||||
|
||||
void Music::moveOffset(const microsec& delta)
|
||||
{
|
||||
const auto offset = fetchOffset();
|
||||
const auto result = offset + delta;
|
||||
if (result < 0)
|
||||
{
|
||||
setOffset(0);
|
||||
}
|
||||
else if (result > getDuration())
|
||||
{
|
||||
setOffset(_music.getDuration().asMicroseconds());
|
||||
pause();
|
||||
}
|
||||
else
|
||||
{
|
||||
setOffset(result);
|
||||
}
|
||||
}
|
||||
|
||||
microsec Music::getDuration() const
|
||||
{
|
||||
return _music.getDuration().asMicroseconds();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue