Adjust game process to new game context

This commit is contained in:
NaiJi ✨ 2022-05-22 06:11:41 +03:00
parent 45132ff82a
commit c24ecc0acc
10 changed files with 49 additions and 40 deletions

View File

@ -34,14 +34,9 @@ void ClassicArrowNote::input(kku::GameEvent&& input)
_context->input(this, std::move(input)); _context->input(this, std::move(input));
} }
void ClassicArrowNote::setGraphics(const std::shared_ptr<const ClassicGraphicsManager>& graphics_manager, kku::TimeRange&& range) const
{
}
void ClassicArrowNote::draw(const std::shared_ptr<const ClassicGraphicsManager>& graphics_manager) const void ClassicArrowNote::draw(const std::shared_ptr<const ClassicGraphicsManager>& graphics_manager) const
{ {
graphics_manager->draw(this); graphics_manager->draw(_elements);
} }
bool ClassicArrowNote::isHold() const bool ClassicArrowNote::isHold() const
@ -49,7 +44,7 @@ bool ClassicArrowNote::isHold() const
return _is_holding; return _is_holding;
} }
const std::vector<ArrowElement>& ClassicArrowNote::getElements() const std::vector<ArrowElement>& ClassicArrowNote::getElements()
{ {
return _elements; return _elements;
} }

View File

@ -35,11 +35,10 @@ public:
virtual bool isActive(const kku::microsec& offset) const override; virtual bool isActive(const kku::microsec& offset) const override;
virtual void update(const kku::microsec &music_offset) override; virtual void update(const kku::microsec &music_offset) override;
virtual void input(kku::GameEvent&& input) override; virtual void input(kku::GameEvent&& input) override;
virtual void setGraphics(const std::shared_ptr<const ClassicGraphicsManager>& graphics_manager, kku::TimeRange&& range) const override;
virtual void draw(const std::shared_ptr<const ClassicGraphicsManager> &graphics_manager) const override; virtual void draw(const std::shared_ptr<const ClassicGraphicsManager> &graphics_manager) const override;
bool isHold() const; bool isHold() const;
const std::vector<ArrowElement>& getElements() const; std::vector<ArrowElement>& getElements();
Grade calculatePrecision(const kku::microsec& offset) const; Grade calculatePrecision(const kku::microsec& offset) const;
bool isPressedAs(kku::SystemEvent::Key::Code key) const; bool isPressedAs(kku::SystemEvent::Key::Code key) const;

View File

@ -3,6 +3,7 @@
#include "classicmapcreator.h" #include "classicmapcreator.h"
#include "gamecontext.h" #include "gamecontext.h"
#include "holdmanager.h" #include "holdmanager.h"
#include "graphics/classicgraphicsmanager.h"
ClassicGame::ClassicGame(const std::shared_ptr<kku::Timeline<ClassicNote>>& timeline, ClassicGame::ClassicGame(const std::shared_ptr<kku::Timeline<ClassicNote>>& timeline,
const std::shared_ptr<GameContext>& context) : const std::shared_ptr<GameContext>& context) :
@ -60,9 +61,10 @@ void ClassicGame::update(kku::UpdateData&& updatedata)
}*/ }*/
_timeline->update(updatedata.timestamp); _timeline->update(updatedata.timestamp);
_context->getGraphicsManager()->update(updatedata.timestamp);
} }
void ClassicGame::display() const void ClassicGame::display() const
{ {
_context->display(); _context->getGraphicsManager()->display();
} }

View File

@ -66,6 +66,11 @@ void GameContext::update(ClassicArrowNote *note, const kku::microsec& music_offs
default: return; default: return;
break; break;
case ClassicArrowNote::State::INITIAL:
note->setState(ClassicArrowNote::State::FLYING);
_graphics_manager->update(music_offset, note);
break;
case ClassicArrowNote::State::FLYING: case ClassicArrowNote::State::FLYING:
if (!note->isActive(music_offset) && music_offset > note->getPerfectOffset()) if (!note->isActive(music_offset) && music_offset > note->getPerfectOffset())
{ {
@ -91,7 +96,7 @@ std::shared_ptr<HoldManager> GameContext::getHoldManager() const
return _hold_manager; return _hold_manager;
} }
void GameContext::display() const std::shared_ptr<ClassicGraphicsManager> GameContext::getGraphicsManager() const
{ {
_graphics_manager->display(); return _graphics_manager;
} }

View File

@ -14,9 +14,9 @@ public:
virtual void input(ClassicArrowNote *note, kku::GameEvent&& input) const override; virtual void input(ClassicArrowNote *note, kku::GameEvent&& input) const override;
virtual void update(ClassicArrowNote *note, const kku::microsec &music_offset) const override; virtual void update(ClassicArrowNote *note, const kku::microsec &music_offset) const override;
virtual void display() const override;
std::shared_ptr<HoldManager> getHoldManager() const; std::shared_ptr<HoldManager> getHoldManager() const;
std::shared_ptr<ClassicGraphicsManager> getGraphicsManager() const;
private: private:
const std::shared_ptr<HoldManager> _hold_manager; const std::shared_ptr<HoldManager> _hold_manager;

View File

@ -4,8 +4,10 @@
#include "core/gameevent.h" #include "core/gameevent.h"
#include <memory> #include <memory>
#include <vector>
class ClassicArrowNote; class ClassicArrowNote;
class ArrowElement;
// class ClassicSliderNote; // class ClassicSliderNote;
class ClassicGraphicsManager : public std::enable_shared_from_this<ClassicGraphicsManager> class ClassicGraphicsManager : public std::enable_shared_from_this<ClassicGraphicsManager>
@ -18,10 +20,12 @@ public:
virtual void input(kku::GameEvent&& input) = 0; virtual void input(kku::GameEvent&& input) = 0;
virtual void display() const = 0; virtual void display() const = 0;
virtual void update(const kku::microsec& offset) = 0;
virtual void update(const kku::microsec& offset, ClassicArrowNote* note) = 0; virtual void update(const kku::microsec& offset, ClassicArrowNote* note) = 0;
// virtual void update(const kku::microsec& offset, ClassicSliderNote* note) = 0; // virtual void update(const kku::microsec& offset, ClassicSliderNote* note) = 0;
virtual void draw(const ClassicArrowNote* note) const = 0; virtual void draw(const std::vector<ArrowElement>& elements) const = 0;
// virtual void draw(ClassicSliderNote* note) const = 0; // virtual void draw(ClassicSliderNote* note) const = 0;
protected: protected:

View File

@ -37,19 +37,23 @@ void ClassicSceneGraphicsManager::display() const
} }
} }
void ClassicSceneGraphicsManager::update(const kku::microsec& offset, ClassicArrowNote* note) void ClassicSceneGraphicsManager::update(const kku::microsec &offset)
{ {
//TODO
(void)note;
fetchLastNote(offset); fetchLastNote(offset);
fetchFirstNote(offset); fetchFirstNote(offset);
updateVisibleNotes(offset); updateVisibleNotes(offset);
} }
void ClassicSceneGraphicsManager::draw(const ClassicArrowNote* note) const void ClassicSceneGraphicsManager::update(const kku::microsec& offset, ClassicArrowNote* note)
{
bool hasGraphics = (note->getElements()[0].sprite != nullptr);
if (isVisiblyClose(note, offset) && (!hasGraphics))
setGraphics(note->getElements(), kku::TimeRange{note->getPerfectOffset() - _visibility_offset, note->getPerfectOffset()});
}
void ClassicSceneGraphicsManager::draw(const std::vector<ArrowElement>& elements) const
{ {
auto& elements = note->getElements();
for (std::size_t i = 0; i < elements.size(); ++i) for (std::size_t i = 0; i < elements.size(); ++i)
{ {
const auto& sprite = elements[i].sprite; const auto& sprite = elements[i].sprite;
@ -89,9 +93,9 @@ bool ClassicSceneGraphicsManager::nothingToDraw() const noexcept
|| _timeline->isExpired(_last); || _timeline->isExpired(_last);
} }
bool ClassicSceneGraphicsManager::isVisiblyClose(const Iterator& iterator, const kku::microsec& music_offset) const noexcept bool ClassicSceneGraphicsManager::isVisiblyClose(const ClassicNote * const note, const kku::microsec& music_offset) const noexcept
{ {
return ((*iterator)->getPerfectOffset() - _visibility_offset) <= music_offset; return (note->getPerfectOffset() - _visibility_offset) <= music_offset;
} }
void ClassicSceneGraphicsManager::fetchFirstNote(const kku::microsec& offset) void ClassicSceneGraphicsManager::fetchFirstNote(const kku::microsec& offset)
@ -102,7 +106,7 @@ void ClassicSceneGraphicsManager::fetchFirstNote(const kku::microsec& offset)
if (offset < (*_first)->getPerfectOffset()) if (offset < (*_first)->getPerfectOffset())
{ {
Iterator note_iterator = _first; Iterator note_iterator = _first;
while (note_iterator != _timeline->begin() && isVisiblyClose(note_iterator, offset)) while (note_iterator != _timeline->begin() && isVisiblyClose(*note_iterator, offset))
{ {
--note_iterator; --note_iterator;
} }
@ -110,12 +114,13 @@ void ClassicSceneGraphicsManager::fetchFirstNote(const kku::microsec& offset)
_first = note_iterator; _first = note_iterator;
auto note = *_first; auto note = *_first;
if (note->getState() != ClassicNote::State::FLYING const auto state = note->getState();
&& note->getState() != ClassicNote::State::DYING if (state != ClassicNote::State::FLYING
&& state != ClassicNote::State::DYING
&& state != ClassicNote::State::INITIAL
&& offset <= note->getPerfectOffset()) && offset <= note->getPerfectOffset())
{ {
note->setState(ClassicNote::State::FLYING); note->setState(ClassicNote::State::INITIAL);
note->setGraphics(shared_from_this(), kku::TimeRange{note->getPerfectOffset() - _visibility_offset, note->getPerfectOffset()});
} }
} }
else else
@ -138,19 +143,19 @@ void ClassicSceneGraphicsManager::fetchFirstNote(const kku::microsec& offset)
void ClassicSceneGraphicsManager::fetchLastNote(const kku::microsec& offset) void ClassicSceneGraphicsManager::fetchLastNote(const kku::microsec& offset)
{ {
Iterator note_iterator = _timeline->getTopNote(); Iterator note_iterator = _timeline->getTopNote();
while (!_timeline->isExpired(note_iterator) && isVisiblyClose(note_iterator, offset)) while (!_timeline->isExpired(note_iterator) && isVisiblyClose(*note_iterator, offset))
{ {
if (nothingToDraw()) if (nothingToDraw())
_first = note_iterator; _first = note_iterator;
auto note = *note_iterator; auto note = *note_iterator;
const auto state = note->getState();
if (note->getState() != ClassicNote::State::FLYING if (state != ClassicNote::State::FLYING
&& note->getState() != ClassicNote::State::DYING && state != ClassicNote::State::DYING
&& state != ClassicNote::State::INITIAL
&& offset <= note->getPerfectOffset()) && offset <= note->getPerfectOffset())
{ {
note->setState(ClassicNote::State::FLYING); note->setState(ClassicNote::State::INITIAL);
note->setGraphics(shared_from_this(), kku::TimeRange{note->getPerfectOffset() - _visibility_offset, note->getPerfectOffset()});
} }
++note_iterator; ++note_iterator;

View File

@ -20,9 +20,10 @@ public:
virtual void input(kku::GameEvent&& input) override; virtual void input(kku::GameEvent&& input) override;
virtual void display() const override; virtual void display() const override;
virtual void update(const kku::microsec& offset) override;
virtual void update(const kku::microsec& offset, ClassicArrowNote* note) override; virtual void update(const kku::microsec& offset, ClassicArrowNote* note) override;
virtual void draw(const ClassicArrowNote* note) const override; virtual void draw(const std::vector<ArrowElement>& elements) const override;
virtual void setGraphics(std::vector<ArrowElement>& elements, kku::TimeRange&& range); virtual void setGraphics(std::vector<ArrowElement>& elements, kku::TimeRange&& range);
protected: protected:
@ -37,7 +38,7 @@ protected:
const std::shared_ptr<kku::Timeline<ClassicNote>> _timeline; const std::shared_ptr<kku::Timeline<ClassicNote>> _timeline;
inline bool nothingToDraw() const noexcept; inline bool nothingToDraw() const noexcept;
inline bool isVisiblyClose(const Iterator& iterator, const kku::microsec& music_offset) const noexcept; inline bool isVisiblyClose(const ClassicNote * const note, const kku::microsec& music_offset) const noexcept;
void fetchFirstNote(const kku::microsec& offset); void fetchFirstNote(const kku::microsec& offset);
void fetchLastNote(const kku::microsec& offset); void fetchLastNote(const kku::microsec& offset);
void updateVisibleNotes(const kku::microsec& offset); void updateVisibleNotes(const kku::microsec& offset);

View File

@ -13,9 +13,10 @@ public:
{ {
NONE = 0, NONE = 0,
FLYING = 1, INITIAL = 1,
DYING = 2, FLYING = 2,
DEAD = 3 DYING = 3,
DEAD = 4
}; };
explicit ClassicNote(const kku::microsec& perfect_offset); explicit ClassicNote(const kku::microsec& perfect_offset);
@ -24,8 +25,6 @@ public:
virtual bool isActive(const kku::microsec& offset) const override = 0; virtual bool isActive(const kku::microsec& offset) const override = 0;
virtual void update(const kku::microsec &music_offset) override = 0; virtual void update(const kku::microsec &music_offset) override = 0;
virtual void input(kku::GameEvent&& input) override = 0; virtual void input(kku::GameEvent&& input) override = 0;
virtual void setGraphics(const std::shared_ptr<const ClassicGraphicsManager>& graphics_manager, kku::TimeRange&& range) const = 0;
virtual void draw(const std::shared_ptr<const ClassicGraphicsManager>& graphics_manager) const = 0; virtual void draw(const std::shared_ptr<const ClassicGraphicsManager>& graphics_manager) const = 0;
void setState(State state) noexcept; void setState(State state) noexcept;

View File

@ -12,5 +12,4 @@ public:
virtual void input(ClassicArrowNote *note, kku::GameEvent&& input) const = 0; virtual void input(ClassicArrowNote *note, kku::GameEvent&& input) const = 0;
virtual void update(ClassicArrowNote *note, const kku::microsec &music_offset) const = 0; virtual void update(ClassicArrowNote *note, const kku::microsec &music_offset) const = 0;
virtual void display() const = 0;
}; };