Fix Editor interface, replace some Game pointers with stack objects

This commit is contained in:
NaiJi ✨ 2021-11-02 20:03:27 +03:00
parent c097ac0da5
commit cfc8706c23
17 changed files with 70 additions and 80 deletions

View File

@ -7,9 +7,12 @@ struct BPMSection
int bpm = 0; int bpm = 0;
int fraction = 1; int fraction = 1;
microsec offset_start = 0; microsec offset_start = 0;
};
inline bool operator<(const BPMSection& right) struct BPMSectionCompt
{ {
return offset_start < right.offset_start; bool operator()(const BPMSection& lhs, const BPMSection& rhs) const noexcept
{
return lhs.offset_start < rhs.offset_start;
} }
}; };

View File

@ -10,15 +10,15 @@ public:
virtual ~Editor() = default; virtual ~Editor() = default;
virtual void input(PlayerInput&& inputdata) = 0; virtual void input(PlayerInput&& inputdata) = 0;
virtual void update() = 0; virtual void update(const sf::Time& dt) = 0;
virtual void draw() const = 0; virtual void draw() const = 0;
inline void setBPMSections(const std::set<BPMSection>& sections) inline void setBPMSections(const std::set<BPMSection, BPMSectionCompt>& sections) noexcept
{ {
_bpm_sections = sections; _bpm_sections = sections;
} }
inline void setBPMSections(std::set<BPMSection>&& sections) inline void setBPMSections(std::set<BPMSection, BPMSectionCompt>&& sections) noexcept
{ {
_bpm_sections = std::move(sections); _bpm_sections = std::move(sections);
} }
@ -33,7 +33,7 @@ public:
_bpm_sections.insert(std::move(section)); _bpm_sections.insert(std::move(section));
} }
void removeBPMSectionAt(const microsec& offset) /*void removeBPMSectionAt(const microsec& offset)
{ {
const auto section_it = std::find_if(_bpm_sections.rbegin(), _bpm_sections.rend(), const auto section_it = std::find_if(_bpm_sections.rbegin(), _bpm_sections.rend(),
[offset](const auto& section) [offset](const auto& section)
@ -43,13 +43,13 @@ public:
if (section_it != _bpm_sections.rend()) if (section_it != _bpm_sections.rend())
_bpm_sections.erase((section_it + 1).base()); _bpm_sections.erase((section_it + 1).base());
} }*/
inline void clearBPMSections() inline void clearBPMSections() noexcept
{ {
_bpm_sections.clear(); _bpm_sections.clear();
} }
protected: protected:
std::set<BPMSection> _bpm_sections; std::set<BPMSection, BPMSectionCompt> _bpm_sections;
}; };

View File

@ -44,7 +44,7 @@ protected:
struct NotePtrCompt struct NotePtrCompt
{ {
bool operator()(const Note* lhs, const Note* rhs) const bool operator()(const Note* lhs, const Note* rhs) const noexcept
{ {
return lhs->offset() < rhs->offset(); return lhs->offset() < rhs->offset();
} }

View File

@ -7,5 +7,5 @@
std::unique_ptr<Game> classic::init(sf::RenderWindow& game_window) std::unique_ptr<Game> classic::init(sf::RenderWindow& game_window)
{ {
return std::make_unique<ClassicGame>(std::make_unique<ClassicGraphicsManager>(game_window), std::make_unique<Music>()); return std::make_unique<ClassicGame>(std::make_unique<ClassicGraphicsManager>(game_window));
} }

View File

@ -1,6 +0,0 @@
#include "classiceditor.h"
ClassicEditor::ClassicEditor(std::shared_ptr<ClassicGraphicsManager>&& manager)
{
}

View File

@ -8,6 +8,6 @@ public:
explicit ClassicEditor(); explicit ClassicEditor();
virtual void input(PlayerInput&& inputdata) = 0; virtual void input(PlayerInput&& inputdata) = 0;
virtual void update() = 0; virtual void update(const sf::Time& dt) = 0;
virtual void draw() const = 0; virtual void draw() const = 0;
}; };

View File

@ -2,14 +2,10 @@
#include "classicnote.h" #include "classicnote.h"
#include "classicmapcreator.h" #include "classicmapcreator.h"
#include "holdmanager.h" #include "holdmanager.h"
#include "context.h"
#include "tools/music.h"
ClassicGame::ClassicGame(std::shared_ptr<ClassicGraphicsManager>&& manager, std::unique_ptr<Music>&& music) : ClassicGame::ClassicGame(std::shared_ptr<ClassicGraphicsManager>&& manager) :
_graphics_manager(std::move(manager)), _graphics_manager(std::move(manager)),
_hold_manager(std::make_shared<HoldManager>(_graphics_manager)), _hold_manager(std::make_unique<HoldManager>(_graphics_manager))
_music(std::move(music)),
_is_paused(false)
{ {
_slap_buffer.loadFromFile("Tick.ogg"); _slap_buffer.loadFromFile("Tick.ogg");
_slap.setBuffer(_slap_buffer); _slap.setBuffer(_slap_buffer);
@ -59,19 +55,19 @@ ClassicGame::~ClassicGame()
void ClassicGame::run() void ClassicGame::run()
{ {
const auto context = std::make_shared<Context>(Context{_graphics_manager, _hold_manager}); _context.hold_manager = _hold_manager;
_context.graphics_manager = _graphics_manager;
ClassicMapCreator creator(context); auto beatmap = classic::createBeatmap("aa", _context);
auto beatmap = creator.createBeatmap("aa"); _music.openFromFile("METEOR.flac");
_music->openFromFile("METEOR.flac"); _music.setVolume(10);
_music->setVolume(10); _music.play();
_music->play();
_timeline.setNotes(beatmap.notes, beatmap.visibility_offset); _timeline.setNotes(beatmap.notes, beatmap.visibility_offset);
} }
void ClassicGame::input(PlayerInput&& inputdata) void ClassicGame::input(PlayerInput&& inputdata)
{ {
inputdata.timestamp = _music->fetchOffset(); inputdata.timestamp = _music.fetchOffset();
switch (inputdata.event.type) switch (inputdata.event.type)
{ {
@ -83,16 +79,14 @@ void ClassicGame::input(PlayerInput&& inputdata)
{ {
if (inputdata.event.key.code == sf::Keyboard::Space) if (inputdata.event.key.code == sf::Keyboard::Space)
{ {
if (!_is_paused) if (_music.isPaused())
{ {
_is_paused = true; _music.play();
_music->pause();
return; return;
} }
else else
{ {
_is_paused = false; _music.pause();
_music->play();
return; return;
} }
} }
@ -119,7 +113,7 @@ void ClassicGame::input(PlayerInput&& inputdata)
void ClassicGame::update() void ClassicGame::update()
{ {
_timeline.update(_music->fetchOffset()); _timeline.update(_music.fetchOffset());
_timeline.fetchVisibleNotes(); _timeline.fetchVisibleNotes();
} }

View File

@ -8,18 +8,19 @@
#include "core/game.h" #include "core/game.h"
#include "core/timeline.h" #include "core/timeline.h"
#include "tools/music.h"
#include "context.h"
#include "classicnote.h" #include "classicnote.h"
#include "classicactions.h" #include "classicactions.h"
class Music;
class ClassicGraphicsManager; class ClassicGraphicsManager;
class HoldManager; class HoldManager;
class ClassicGame final : public Game class ClassicGame final : public Game
{ {
public: public:
explicit ClassicGame(std::shared_ptr<ClassicGraphicsManager>&& manager, std::unique_ptr<Music>&& music); explicit ClassicGame(std::shared_ptr<ClassicGraphicsManager>&& manager);
virtual ~ClassicGame() override; virtual ~ClassicGame() override;
virtual void run() override; virtual void run() override;
@ -40,7 +41,6 @@ private:
sf::SoundBuffer _slap_buffer; sf::SoundBuffer _slap_buffer;
sf::Sound _slap; sf::Sound _slap;
std::unique_ptr<Music> _music; Music _music;
Context _context;
bool _is_paused;
}; };

View File

@ -6,11 +6,7 @@
#include "classicdyinganimationscenario.h" #include "classicdyinganimationscenario.h"
// //
ClassicMapCreator::ClassicMapCreator(const std::shared_ptr<Context> &context) : auto classic::createBeatmap(const std::string& filepath, const Context &context) -> Beatmap
_context(context)
{}
Beatmap ClassicMapCreator::createBeatmap(const std::string& filepath) const
{ {
(void) filepath; (void) filepath;
@ -40,7 +36,7 @@ Beatmap ClassicMapCreator::createBeatmap(const std::string& filepath) const
init.initializer.intervals = input_intervals; init.initializer.intervals = input_intervals;
init.initializer.perfect_offset = bpm_iterator; init.initializer.perfect_offset = bpm_iterator;
init.hold = false; init.hold = false;
init.initializer.context = _context; init.initializer.context = &context;
element.element.coordinates = {x, 390.}; element.element.coordinates = {x, 390.};
element.element.falling_curve_interpolation = {}; element.element.falling_curve_interpolation = {};

View File

@ -5,7 +5,8 @@
#include "tools/mathutils.h" #include "tools/mathutils.h"
#include "classicnote.h" #include "classicnote.h"
struct Context; namespace classic
{
struct Beatmap struct Beatmap
{ {
@ -13,13 +14,7 @@ struct Beatmap
microsec visibility_offset; microsec visibility_offset;
}; };
class ClassicMapCreator Beatmap createBeatmap(const std::string& filepath, const Context& context);
{
public:
explicit ClassicMapCreator(const std::shared_ptr<Context>& context);
Beatmap createBeatmap(const std::string& filepath) const; }
private:
const std::shared_ptr<Context> _context;
};

View File

@ -45,5 +45,5 @@ protected:
const PrecisionEvaluator<Grade> _evaluator; const PrecisionEvaluator<Grade> _evaluator;
State _state; State _state;
std::shared_ptr<Context> _context; const Context *_context;
}; };

View File

@ -8,7 +8,7 @@
struct NoteInitializer struct NoteInitializer
{ {
std::shared_ptr<Context> context; const Context *context;
std::vector<microsec> intervals; std::vector<microsec> intervals;
microsec perfect_offset = 0; microsec perfect_offset = 0;
}; };

View File

@ -17,8 +17,6 @@ Application::Application() :
{ {
_font_holder.load(Fonts::Id::GUI, "SourceCodePro-Regular.ttf"); _font_holder.load(Fonts::Id::GUI, "SourceCodePro-Regular.ttf");
_game = classic::init(_game_window);
_game_window.setFramerateLimit(60); _game_window.setFramerateLimit(60);
_game_window.setKeyRepeatEnabled(false); _game_window.setKeyRepeatEnabled(false);
_game_window.setMouseCursorGrabbed(false); _game_window.setMouseCursorGrabbed(false);
@ -33,7 +31,7 @@ Application::Application() :
EditorState::Callbacks editor_callbacks = {[&](){ popState(); }}; EditorState::Callbacks editor_callbacks = {[&](){ popState(); }};
const auto main_menu = std::make_shared<MainMenu>(_game_window, std::move(callbacks), _font_holder); const auto main_menu = std::make_shared<MainMenu>(_game_window, std::move(callbacks), _font_holder);
const auto game_state = std::make_shared<GameState>(_game_window, _game, GameState::Callbacks()); const auto game_state = std::make_shared<GameState>(_game_window, classic::init(_game_window), GameState::Callbacks());
const auto editor = std::make_shared<EditorState>(_game_window, std::move(editor_callbacks), std::make_unique<Music>(), _font_holder); const auto editor = std::make_shared<EditorState>(_game_window, std::move(editor_callbacks), std::make_unique<Music>(), _font_holder);
_states[GUIState::Tag::MAIN_MENU] = main_menu; _states[GUIState::Tag::MAIN_MENU] = main_menu;

View File

@ -1,5 +1,4 @@
#ifndef APPLICATION_H #pragma once
#define APPLICATION_H
#include <vector> #include <vector>
#include <memory> #include <memory>
@ -14,12 +13,13 @@
#include "core/game.h" #include "core/game.h"
#include "state.h" #include "state.h"
#include "tools/music.h"
#include "tools/resourceholder.h" #include "tools/resourceholder.h"
class Application class Application
{ {
public: public:
Application(); explicit Application();
void run(); void run();
void input(); void input();
void update(const sf::Time& dt); void update(const sf::Time& dt);
@ -30,7 +30,7 @@ private:
std::vector<std::shared_ptr<GUIState>> _state_stack; std::vector<std::shared_ptr<GUIState>> _state_stack;
sf::RenderWindow _game_window; sf::RenderWindow _game_window;
std::shared_ptr<Game> _game; Music _music;
void exec(); void exec();
void pushState(GUIState::Tag new_state); void pushState(GUIState::Tag new_state);
@ -38,5 +38,3 @@ private:
FontHolder _font_holder; FontHolder _font_holder;
}; };
#endif // APPLICATION_H

View File

@ -1,4 +1,5 @@
#include "editorwidget.h" #include "editorwidget.h"
#include "core/editor.h"
EditorWidget::EditorWidget(const std::shared_ptr<Editor>& editor) : EditorWidget::EditorWidget(const std::shared_ptr<Editor>& editor) :
_editor(editor) _editor(editor)
@ -6,45 +7,49 @@ EditorWidget::EditorWidget(const std::shared_ptr<Editor>& editor) :
void EditorWidget::input(const sf::Event& event) void EditorWidget::input(const sf::Event& event)
{ {
_editor->input(PlayerInput{0, event});
} }
void EditorWidget::update(const sf::Time& dt) void EditorWidget::update(const sf::Time& dt)
{ {
_editor->update(dt);
} }
void EditorWidget::draw(sf::RenderTarget& target, sf::RenderStates states) const void EditorWidget::draw(sf::RenderTarget& target, sf::RenderStates states) const
{ {
// !!!!!!!!!!!!!!!!!
(void)target; (void)states;
_editor->draw();
} }
void EditorWidget::move(const sf::Vector2f& delta) void EditorWidget::move(const sf::Vector2f& delta)
{ {
(void)delta;
// delegate to children
} }
bool EditorWidget::isUnderMouse(int mouse_x, int mouse_y) const bool EditorWidget::isUnderMouse(int mouse_x, int mouse_y) const
{ {
return _parent->isUnderMouse(mouse_x, mouse_y);
} }
void EditorWidget::setRect(const sf::FloatRect& rect) void EditorWidget::setRect(const sf::FloatRect& rect)
{ {
(void)rect;
// basically useless beacuse editor widget fills the entire screen
} }
sf::FloatRect EditorWidget::rect() const sf::FloatRect EditorWidget::rect() const
{ {
return {};
} }
void EditorWidget::setPosition(const sf::Vector2f& position) void EditorWidget::setPosition(const sf::Vector2f& position)
{ {
(void)position;
} }
sf::Vector2f EditorWidget::position() const sf::Vector2f EditorWidget::position() const
{ {
return {};
} }

View File

@ -16,6 +16,8 @@ public:
void pause(); void pause();
void stop(); void stop();
bool isPaused() const;
void setVolume(int volume); void setVolume(int volume);
void setOffset(const microsec& offset); void setOffset(const microsec& offset);

View File

@ -27,6 +27,11 @@ void Music::stop()
_music.stop(); _music.stop();
} }
bool Music::isPaused() const
{
return (_music.getStatus() == sf::Music::Paused);
}
void Music::setVolume(int volume) void Music::setVolume(int volume)
{ {
_music.setVolume(volume); _music.setVolume(volume);