forked from NaiJi/project-kyoku
Implement scrolling in Editor
This commit is contained in:
parent
5e3ddccac0
commit
ebf736a0bb
|
@ -4,4 +4,7 @@
|
||||||
build
|
build
|
||||||
SFML*
|
SFML*
|
||||||
*.user
|
*.user
|
||||||
|
*CMakeFiles*
|
||||||
|
*Makefile
|
||||||
|
*.cmake*
|
||||||
|
*.cbp
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -28,4 +28,5 @@ private:
|
||||||
|
|
||||||
Type _selected_type;
|
Type _selected_type;
|
||||||
microsec _current_time;
|
microsec _current_time;
|
||||||
|
microsec _scroll_step;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue