Implement scrolling in Editor

This commit is contained in:
NaiJi ✨ 2021-12-06 22:18:04 +03:00
parent 5e3ddccac0
commit ebf736a0bb
8 changed files with 78 additions and 13 deletions

5
.gitignore vendored
View File

@ -4,4 +4,7 @@
build build
SFML* SFML*
*.user *.user
*CMakeFiles*
*Makefile
*.cmake*
*.cbp

View File

@ -36,7 +36,7 @@ public:
void insertNote(TNote* note) void insertNote(TNote* note)
{ {
_timeline.insert(_top_note, note); _top_note = _timeline.insert(note).first;
update(_current_offset); update(_current_offset);
} }
@ -61,6 +61,7 @@ public:
if (isExpired(_top_note)) if (isExpired(_top_note))
return; return;
checkTopNote(_current_offset);
checkCurrentActiveNote(); checkCurrentActiveNote();
checkForNextActiveNote(); checkForNextActiveNote();
updateVisibleSprites(_current_offset); updateVisibleSprites(_current_offset);
@ -86,7 +87,7 @@ public:
return; return;
Iterator note_iterator = _top_note; Iterator note_iterator = _top_note;
while (isVisiblyClose(note_iterator, music_offset)) while (!isExpired(note_iterator) && isVisiblyClose(note_iterator, music_offset))
{ {
if (nothingToDraw()) if (nothingToDraw())
_first_visible_note = note_iterator; _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() void checkForNextActiveNote()
{ {
if (!isExpired(_active_note)) if (!isExpired(_active_note))

View File

@ -3,10 +3,34 @@
ClassicEditor::ClassicEditor(std::shared_ptr<ClassicGraphicsManager>&& manager) : ClassicEditor::ClassicEditor(std::shared_ptr<ClassicGraphicsManager>&& manager) :
_graphics_manager(manager), _graphics_manager(manager),
_selected_type(Type::UP), _selected_type(Type::UP),
_current_time(0) _current_time(0),
_scroll_step(500000)
{ {
_context.graphics_manager = _graphics_manager; _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) void ClassicEditor::input(PlayerInput&& inputdata)

View File

@ -28,4 +28,5 @@ private:
Type _selected_type; Type _selected_type;
microsec _current_time; microsec _current_time;
microsec _scroll_step;
}; };

View File

@ -6,6 +6,8 @@
#include "graphics/classicdyinganimationscenario.h" #include "graphics/classicdyinganimationscenario.h"
// //
#include <iostream>
// A LOT OF CODE DUPLICATES game/arrowclassicnote, DO SOMETHING D:< // A LOT OF CODE DUPLICATES game/arrowclassicnote, DO SOMETHING D:<
MockClassicNote::MockClassicNote(MockArrowNoteInitializer&& init) : MockClassicNote::MockClassicNote(MockArrowNoteInitializer&& init) :
@ -49,6 +51,8 @@ void MockClassicNote::putToGame(const microsec &music_offset)
{ {
_state = State::FLYING; _state = State::FLYING;
std::cout << "Put to game " << this << ": " << music_offset << '\n';
for (auto& element : _elements) for (auto& element : _elements)
{ {
element.sprite = _context->graphics_manager->getSprite(element.type); element.sprite = _context->graphics_manager->getSprite(element.type);
@ -67,11 +71,6 @@ void MockClassicNote::update(const microsec &music_offset)
case State::FLYING: case State::FLYING:
if (music_offset > offset()) if (music_offset > offset())
_state = State::DYING;
break;
case State::DYING:
if (_elements[0].animations[_state]->isDone())
_state = State::DEAD; _state = State::DEAD;
break; break;
} }

View File

@ -156,6 +156,9 @@ void EditorState::enter()
callbacks.onInput = [&editor, &music](const sf::Event& event) 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}); editor->input(PlayerInput{music.fetchOffset(), event});
}; };
@ -167,9 +170,9 @@ void EditorState::enter()
auto editor_widget = std::make_shared<EditorWidget>(std::move(callbacks)); auto editor_widget = std::make_shared<EditorWidget>(std::move(callbacks));
_group = std::make_shared<Group>(); _group = std::make_shared<Group>();
_group->addChild(editor_widget);
_group->addChild(menu_bar); _group->addChild(menu_bar);
_group->addChild(bpm_widget); _group->addChild(bpm_widget);
_group->addChild(editor_widget);
} }
void EditorState::leave() void EditorState::leave()
@ -177,4 +180,3 @@ void EditorState::leave()
_group.reset(); _group.reset();
_bpm_calculator.reset(); _bpm_calculator.reset();
} }

View File

@ -21,7 +21,9 @@ public:
void setVolume(int volume); void setVolume(int volume);
void setOffset(const microsec& offset); void setOffset(const microsec& offset);
void moveOffset(const microsec& delta);
microsec fetchOffset(); microsec fetchOffset();
microsec getDuration() const;
private: private:
sf::Music _music; sf::Music _music;

View File

@ -61,3 +61,27 @@ microsec Music::fetchOffset()
return _absolute_offset; 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();
}