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));
}
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
{
graphics_manager->draw(this);
graphics_manager->draw(_elements);
}
bool ClassicArrowNote::isHold() const
@ -49,7 +44,7 @@ bool ClassicArrowNote::isHold() const
return _is_holding;
}
const std::vector<ArrowElement>& ClassicArrowNote::getElements() const
std::vector<ArrowElement>& ClassicArrowNote::getElements()
{
return _elements;
}

View File

@ -35,11 +35,10 @@ public:
virtual bool isActive(const kku::microsec& offset) const override;
virtual void update(const kku::microsec &music_offset) 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;
bool isHold() const;
const std::vector<ArrowElement>& getElements() const;
std::vector<ArrowElement>& getElements();
Grade calculatePrecision(const kku::microsec& offset) const;
bool isPressedAs(kku::SystemEvent::Key::Code key) const;

View File

@ -3,6 +3,7 @@
#include "classicmapcreator.h"
#include "gamecontext.h"
#include "holdmanager.h"
#include "graphics/classicgraphicsmanager.h"
ClassicGame::ClassicGame(const std::shared_ptr<kku::Timeline<ClassicNote>>& timeline,
const std::shared_ptr<GameContext>& context) :
@ -60,9 +61,10 @@ void ClassicGame::update(kku::UpdateData&& updatedata)
}*/
_timeline->update(updatedata.timestamp);
_context->getGraphicsManager()->update(updatedata.timestamp);
}
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;
break;
case ClassicArrowNote::State::INITIAL:
note->setState(ClassicArrowNote::State::FLYING);
_graphics_manager->update(music_offset, note);
break;
case ClassicArrowNote::State::FLYING:
if (!note->isActive(music_offset) && music_offset > note->getPerfectOffset())
{
@ -91,7 +96,7 @@ std::shared_ptr<HoldManager> GameContext::getHoldManager() const
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 update(ClassicArrowNote *note, const kku::microsec &music_offset) const override;
virtual void display() const override;
std::shared_ptr<HoldManager> getHoldManager() const;
std::shared_ptr<ClassicGraphicsManager> getGraphicsManager() const;
private:
const std::shared_ptr<HoldManager> _hold_manager;

View File

@ -4,8 +4,10 @@
#include "core/gameevent.h"
#include <memory>
#include <vector>
class ClassicArrowNote;
class ArrowElement;
// class ClassicSliderNote;
class ClassicGraphicsManager : public std::enable_shared_from_this<ClassicGraphicsManager>
@ -18,10 +20,12 @@ public:
virtual void input(kku::GameEvent&& input) = 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, 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;
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);
fetchFirstNote(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)
{
const auto& sprite = elements[i].sprite;
@ -89,9 +93,9 @@ bool ClassicSceneGraphicsManager::nothingToDraw() const noexcept
|| _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)
@ -102,7 +106,7 @@ void ClassicSceneGraphicsManager::fetchFirstNote(const kku::microsec& offset)
if (offset < (*_first)->getPerfectOffset())
{
Iterator note_iterator = _first;
while (note_iterator != _timeline->begin() && isVisiblyClose(note_iterator, offset))
while (note_iterator != _timeline->begin() && isVisiblyClose(*note_iterator, offset))
{
--note_iterator;
}
@ -110,12 +114,13 @@ void ClassicSceneGraphicsManager::fetchFirstNote(const kku::microsec& offset)
_first = note_iterator;
auto note = *_first;
if (note->getState() != ClassicNote::State::FLYING
&& note->getState() != ClassicNote::State::DYING
const auto state = note->getState();
if (state != ClassicNote::State::FLYING
&& state != ClassicNote::State::DYING
&& state != ClassicNote::State::INITIAL
&& offset <= note->getPerfectOffset())
{
note->setState(ClassicNote::State::FLYING);
note->setGraphics(shared_from_this(), kku::TimeRange{note->getPerfectOffset() - _visibility_offset, note->getPerfectOffset()});
note->setState(ClassicNote::State::INITIAL);
}
}
else
@ -138,19 +143,19 @@ void ClassicSceneGraphicsManager::fetchFirstNote(const kku::microsec& offset)
void ClassicSceneGraphicsManager::fetchLastNote(const kku::microsec& offset)
{
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())
_first = note_iterator;
auto note = *note_iterator;
if (note->getState() != ClassicNote::State::FLYING
&& note->getState() != ClassicNote::State::DYING
const auto state = note->getState();
if (state != ClassicNote::State::FLYING
&& state != ClassicNote::State::DYING
&& state != ClassicNote::State::INITIAL
&& offset <= note->getPerfectOffset())
{
note->setState(ClassicNote::State::FLYING);
note->setGraphics(shared_from_this(), kku::TimeRange{note->getPerfectOffset() - _visibility_offset, note->getPerfectOffset()});
note->setState(ClassicNote::State::INITIAL);
}
++note_iterator;

View File

@ -20,9 +20,10 @@ public:
virtual void input(kku::GameEvent&& input) 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 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);
protected:
@ -37,7 +38,7 @@ protected:
const std::shared_ptr<kku::Timeline<ClassicNote>> _timeline;
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 fetchLastNote(const kku::microsec& offset);
void updateVisibleNotes(const kku::microsec& offset);

View File

@ -13,9 +13,10 @@ public:
{
NONE = 0,
FLYING = 1,
DYING = 2,
DEAD = 3
INITIAL = 1,
FLYING = 2,
DYING = 3,
DEAD = 4
};
explicit ClassicNote(const kku::microsec& perfect_offset);
@ -24,8 +25,6 @@ public:
virtual bool isActive(const kku::microsec& offset) const override = 0;
virtual void update(const kku::microsec &music_offset) 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;
void setState(State state) noexcept;

View File

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