рдореБрд░рдмреНрдмрд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ (рд╡рд┐рд░рд╛рдо рдореЛрдб)

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдорд╛рд░реНрдорд▓реЗрдб рдЯреВрд▓ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рдЧреЗрдорд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереАред рдмреЗрд╢рдХ, рдЬрд┐рд╕ рд░реВрдк рдореЗрдВ рдпрд╣ рдЧрд┐рдЯрд╣рдм рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдбреЗрдореЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХреБрдЫ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рд╣реА рдЙрдкрдпреБрдХреНрдд рд╣реИред рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рдЧрдВрднреАрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдлрд╝реНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рд▓рдЪреАрд▓реЗ рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рд▓рд╛рдкрддрд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХреЗред

рдпрд╣ рдард╣рд░рд╛рд╡ рдореЛрдб рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдЦреЗрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреАред рдЬрдм рдПрдХ рдард╣рд░рд╛рд╡ рд╕рдХреНрд░рд┐рдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреВрд░реЗ рдЦреЗрд▓ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЬрдм рдЗрд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реА рд╕реНрдерд╛рди рд╕реЗ рдЬрд╛рд░реА рд░рдЦреЗрдВ рдЬрд╣рд╛рдВ рдпрд╣ рд░реБрдХрд╛ рдерд╛ред

рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рд╕рднреА рдШрдЯрдирд╛рдУрдВ (рдЕрдкрдбреЗрдЯ рд╡рд┐рдзрд┐) рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдмрдВрдж рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдПрдиреАрдореЗрд╢рди рдХреЛ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рд░реЛрдХ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рддрдВрддреНрд░ рдХреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡рд╕реНрддреБ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдПрдиреАрдореЗрд╢рди рдХреЛ рд░реЛрдХ рджреЗрдЧреА рдпрд╛ рдирд╣реАрдВред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдо рдард╣рд░рд╛рд╡ рдореЛрдб рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмрдЯрди рдХреЗ рд▓рд┐рдП рдИрд╡реЗрдВрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛ рд░реЛрдХ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХрднреА рднреА рдкреЙрдЬрд╝ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд▓ рдкрд╛рдПрдВрдЧреЗред

рдХрдо рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЙрди рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЙрд╕ рд╕рдордп рдПрдиреАрдореЗрд╢рди рдореЗрдВ рднрд╛рдЧ рд▓реЗрддреЗ рдереЗ, рдЬрдм рдЗрд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдлреНрд░реЗрдорд╡рд░реНрдХ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдПрдиреАрдореЗрд╢рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреА рдЧрдгрдирд╛ рдПрдиреАрдореЗрд╢рди рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рд╣реЛ рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рд╣рдо рдПрдХ рдард╣рд░рд╛рд╡ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдмрд┐рддрд╛рддреЗ рд╣реИрдВ, рддреЛ рдпреЗ рд╕рднреА рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдирд┐рд░рдВрддрд░рддрд╛ рджреЗрдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реЛ, рдПрдиреАрдореЗрд╢рди рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдЪрд▓реЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред IObject.update рд╡рд┐рдзрд┐ рдореЗрдВ isPaused рдлрд╝реНрд▓реИрдЧ рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рдкреЙрдЬрд╝ рдореЛрдб рд╕рдХреНрд░рд┐рдп рд╣реЛрдиреЗ рдкрд░ рд╕рд╣реА рдкрд░ рд╕реЗрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛:

IObject.h
class IObject { public: ... virtual void update(uint64 timestamp, bool isPaused) = 0; }; 


AbstractSpriteOwner рдПрдХ рд╕рдорд╛рди рдзреНрд╡рдЬ рдФрд░ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ рдЬрд┐рд╕реЗ рд╣рдо рдкреЙрдЬрд╝ рд╣реЛрдиреЗ рдкрд░ рдПрдирд┐рдореЗрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВрдЧреЗ:

AbstractSpriteOwner.h
 class AbstractSpriteOwner: public ISpriteOwner { public: ... virtual void update(uint64 timestamp, bool isPaused); virtual void correctPauseDelta(uint64 pauseDelta); }; 


CorrectPauseDelta рдкрджреНрдзрддрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рддреБрдЪреНрдЫ рд╣реИред рд╣рдо рдХреЗрд╡рд▓ рдиреЗрд╕реНрдЯреЗрдб рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕ рдХреЛ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рдард╣рд░рд╛рд╡ рдХреА рдЕрд╡рдзрд┐ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ:

AbstractSpriteOwner.cpp
 ... void AbstractSpriteOwner::correctPauseDelta(uint64 pauseDelta) { for (ZIter p = zOrder.begin(); p != zOrder.end(); ++p) { p->second->addPauseDelta(pauseDelta); } } 


AnimatedSprite рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╣рдо рд╡рд░реНрддрдорд╛рди рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╕рднреА рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╡рд┐рд░рд╛рдо рдЕрд╡рдзрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдпрджрд┐ рдХреЛрдИ рд╡рд┐рд░рд╛рдо рдореЛрдб рд╣реИ, рддреЛ рд╣рдо рдЕрдкрдбреЗрдЯ рд╡рд┐рдзрд┐ рд╕реЗ рдЬрд▓реНрджреА рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ:

AnimatedSprite.cpp
 ... void AnimatedSprite::addPauseDelta(uint64 pauseDelta) { for (CIter p = currentMessages.begin(); p != currentMessages.end(); ++p) { p->timestamp += pauseDelta; } } void AnimatedSprite::update(uint64 timestamp, bool isPaused) { if (isPaused && isPausable()) return; ... } 


ThePausable Method рдХреЛ DefaultScreenObject рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЗрд╕рдХреЗ рд╡рдВрд╢рдЬ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдПрдиреАрдореЗрд╢рди рдЕрдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

AbstractScreenObject.h
 class AbstractScreenObject: public IScreenObject { public: ... virtual void addPauseDelta(uint64 pauseDelta) {} virtual bool isPausable() const {return true;} }; 


рдХрдореНрдкреЛрдЬрд╝рд┐рдЯрд╕рд╛рдЗрдЯ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдПрдХ рдУрд░, рдпрд╣ рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕ рдХрд╛ рдПрдХ рдХрдВрдЯреЗрдирд░ рд╣реИ, рдЬрдмрдХрд┐ рджреВрд╕рд░реА рддрд░рдл, рдпрд╣ рд╕реНрд╡рдпрдВ рдПрдирд┐рдореЗрдЯреНрд░рд╕рд╛рдЗрдЯ рдХрд╛ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рд╣реИ рдФрд░ рдПрдиреАрдореЗрд╢рди рдирд┐рдпрдореЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ:

CompositeSprite.cpp
 ... void CompositeSprite::addPauseDelta(uint64 pauseDelta) { AbstractSpriteOwner::correctPauseDelta(pauseDelta); AnimatedSprite::addPauseDelta(pauseDelta); } void CompositeSprite::update(uint64 timestamp, bool isPaused) { AnimatedSprite::update(timestamp, isPaused); AbstractSpriteOwner::update(timestamp, isPaused); } 


рдПрдиреАрдореЗрд╢рди рдХреЛ рд░реЛрдХрдиреЗ рдФрд░ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рдо рд╕реАрди рдХреНрд▓рд╛рд╕ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

Scene.h
 class Scene: public AbstractSpriteOwner { protected: ... bool IsPaused; uint64 pauseTimestamp; public: ... virtual void update(uint64 timestamp, bool isPaused); bool isPaused() const {return IsPaused;} void suspend(); void resume(); }; 


Scene.cpp
 ... void Scene::update(uint64 timestamp, bool) { if (IsPaused && (pauseTimestamp == 0)) { pauseTimestamp = pauseTimestamp; } if (!IsPaused && (pauseTimestamp != 0)) { uint64 pauseDelta = timestamp - pauseTimestamp; if (pauseDelta > 0) { correctPauseDelta(pauseDelta); } pauseTimestamp = 0; } ... AbstractSpriteOwner::update(timestamp, IsPaused); } bool Scene::sendMessage(int id, int x, int y) { if (AbstractSpriteOwner::sendMessage(id, x, y)) { return true; } if (IsPaused) return false; if (background != NULL) { return background->sendMessage(id, x, y); } return false; } void Scene::suspend() { desktop.suspend(); IsPaused = true; } void Scene::resume() { desktop.resume(); IsPaused = false; } 


рдпрд╣ рдбреЗрд╕реНрдХрдЯреЙрдк рдХреНрд▓рд╛рд╕ рдореЗрдВ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдореНрдпреВрдЬрд╝рд┐рдХ рдкреЙрдЬрд╝ рдХреЛрдб рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ:

Desktop.h
 class Desktop { private: ... bool isMusicStarted; public: Desktop(): touches(), names(), currentScene(NULL), isMusicStarted(false) {} ... void startMusic(const char* res); void stopMusic(); void suspend(); void resume(); }; 


Desktop.cpp
 ... void Desktop::startMusic(const char* res) { if (s3eAudioIsCodecSupported(S3E_AUDIO_CODEC_MP3) && s3eAudioIsCodecSupported(S3E_AUDIO_CODEC_PCM)) s3eAudioPlay(res, 0); isMusicStarted = true; } void Desktop::stopMusic() { isMusicStarted = false; s3eAudioStop(); } void Desktop::suspend() { if (isMusicStarted) { s3eAudioPause(); } } void Desktop::resume() { if (isMusicStarted) { s3eAudioResume(); } } 


рдЕрдм, Scene.suspend рд╡рд┐рдзрд┐ рд╕рднреА рдЧреЗрдо рд╕реНрдкреНрд░рд╛рдЗрдЯ рдФрд░ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕рдВрдЧреАрдд рдХреЗ рдПрдиреАрдореЗрд╢рди рдХреЛ рд░реЛрдХ рд╕рдХрддреА рд╣реИ, рдФрд░ Scene.resume рд╡рд┐рдзрд┐ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╣реА рд╕реНрдерд╛рди рд╕реЗ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреА рд╣реИред

Source: https://habr.com/ru/post/In164179/


All Articles