{"id":162511,"date":"2012-12-13T20:41:03","date_gmt":"2012-12-13T16:41:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=162511"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=162511","title":{"rendered":"<span class=\"post_title\">Framework \u0432 \u041c\u0430\u0440\u043c\u0435\u043b\u0430\u0434\u0435 (\u0447\u0430\u0441\u0442\u044c 4)<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t\u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"http:\/\/habrahabr.ru\/post\/161681\/\">\u0446\u0438\u043a\u043b\u0430<\/a>, \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 Marmalade Framework, \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435 \u0441\u043f\u0440\u0430\u0439\u0442\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<br \/>  <a name=\"habracut\"><\/a> <br \/>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 Framework, \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043b\u044e\u0431\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f (\u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435), \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u0430\u043a\u043e\u0433\u043e \u043b\u0438\u0431\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f. \u041d\u0430\u0431\u043e\u0440 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 Desktop.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Desktop.h<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#ifndef _DESKTOP_H_ #define _DESKTOP_H_  #include &lt;set&gt; #include &quot;s3eKeyboard.h&quot; #include &quot;Scene.h&quot;  using namespace std;  enum EMessageType {     emtNothing                                                      = 0x00,      emtHide                                                         = 0x01,     emtShadow                                                       = 0x02,     emtShow                                                         = 0x03,     emtSwitch                                                       = 0x04,     emtInit                                                         = 0x05,     emtFix                                                          = 0x08,      emtStartAnimation                                               = 0x06,     emtStopAnimation                                                = 0x07,     emtActivate                                                     = 0x09,      emtSystemMessage                                                = 0x0F,      emtTouchEvent                                                   = 0x10,     emtTouchIdMask                                                  = 0x03,     emtTouchMask                                                    = 0x78,     emtMultiTouch                                                   = 0x14,     emtTouchOut                                                     = 0x18,     emtTouchDown                                                    = 0x30,     emtTouchUp                                                      = 0x50,     emtTouchOutUp                                                   = 0x58,     emtTouchMove                                                    = 0x70,     emtSingleTouchDown                                              = 0x30,     emtSingleTouchUp                                                = 0x50,     emtSingleTouchMove                                              = 0x70,     emtMultiTouchDown                                               = 0x34,     emtMultiTouchUp                                                 = 0x54,     emtMultiTouchMove                                               = 0x74,      emtKeyEvent                                                     = 0x80,     emtKeyAction                                                    = 0x82,     emtKeyDown                                                      = 0x81,     emtKeyPressed                                                   = 0x83,     emtKeyReleased                                                  = 0x82 }; ...<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041a\u0430\u043a \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0434\u0430\u043b\u0435\u0435, \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043b\u0435\u0433\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u044f \u043c\u043e\u0434\u0443\u043b\u044c Desktop. \u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 EMessageType \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u043a\u043e\u0434\u044b \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432\u043c\u0435\u0441\u0442\u0435. \u0417\u0430\u0434\u0430\u0447\u0435\u0439 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0440\u0430\u0439\u0442\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u044f\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0440\u0430\u0439\u0442\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u0435\u0433\u043e \u0434\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">IAnimatedSprite.h<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#ifndef _IANIMATEDSPRITE_H_ #define _IANIMATEDSPRITE_H_  #include &lt;string&gt;  #include &quot;Desktop.h&quot;  using namespace std;  class IAnimatedSprite {     public:       virtual bool isValidMessage(int msg)                                     = 0;       virtual void doMessage(int msg, void* data = NULL, uint64 timestamp = 0) = 0; };  #endif    \/\/ _IANIMATEDSPRITE_H_ <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041c\u0435\u0442\u043e\u0434 isValidMessage \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u043c\u043e\u0436\u0435\u0442 \u043b\u0438 \u0441\u043f\u0440\u0430\u0439\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 (\u0435\u0441\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043e \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u043c, \u043e\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u043c\u0443 \u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443 \u2014 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u043c\u0443 \u0441\u043f\u0440\u0430\u0439\u0442\u0443 \u0438\u043b\u0438 \u0441\u0446\u0435\u043d\u0435), \u0430 \u043c\u0435\u0442\u043e\u0434 doMessage \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443. \u041f\u043e\u043c\u0438\u043c\u043e \u043a\u043e\u0434\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u2014 msg, \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u2014 data \u0438 \u043c\u0435\u0442\u043a\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u2014 timestamp, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u0443\u044e \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0446\u0438\u043a\u043b\u0430 \u0432 Main.cpp.<\/p>\n<p>  \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f AnimatedSprite \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">AnimatedSprite.h<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#ifndef _ANIMATEDSPRITE_H_ #define _ANIMATEDSPRITE_H_  #include &lt;map&gt; #include &lt;vector&gt;  #include &quot;Sprite.h&quot; #include &quot;IAnimatedSprite.h&quot; #include &quot;AnimateMessage.h&quot; #include &quot;ResourceManager.h&quot;  #define REFRESH_CNT 2  using namespace std;  class AnimatedSprite: public Sprite,                       public IAnimatedSprite {     protected:         struct Message {             Message(int id, uint64 timestamp, void* data = NULL):                       id(id), timestamp(timestamp), data(data) {}             Message(const Message& m):                       id(m.id), timestamp(m.timestamp), data(m.data) {}             int id;             void* data;             uint64 timestamp;         };         struct CurrentMessage {             CurrentMessage(AnimateMessage* message, uint64 timestamp):                      message(message), timestamp(timestamp),                       lastTimeDelta(0), isEmpty(false) {}             CurrentMessage(const CurrentMessage& m):                       message(m.message), timestamp(m.timestamp),                      lastTimeDelta(m.lastTimeDelta), isEmpty(m.isEmpty) {}             AnimateMessage* message;             uint64 timestamp;             uint64 lastTimeDelta;             bool isEmpty;         };         int state;         map&lt;int, ResourceHolder*&gt; images;         map&lt;int, AnimateMessage*&gt; rules;         uint64 lastTimestamp;         vector&lt;Message&gt; messages;         vector&lt;CurrentMessage&gt; currentMessages;         bool isAnimated;         int refreshCnt;     public:         AnimatedSprite(ISpriteOwner* scene, int x, int y, int zOrder = 0);         AnimatedSprite(ISpriteOwner* scene, const char* res, int x,                         int y, int zOrder = 0, int loc = elNothing);        ~AnimatedSprite();         void clearMessageRules() {rules.clear();}         void addMessageRule(int msg, AnimateMessage* rule);         virtual void addImage(const char*res, int id = 0, int loc = 0);         virtual CIw2DImage* getImage(int id = 0);         virtual int  getState();         virtual bool setState(int newState);         virtual void update(uint64 timestamp);         virtual void refresh();         virtual bool sendMessage(int msg, uint64 timestamp = 0, void* data = NULL);         virtual bool isBuzy() {return false;}         virtual bool isValidMessage(int msg) {return (msg &lt;= emtSystemMessage);}         virtual void doMessage(int msg, void* data = NULL, uint64 timestamp = 0);         virtual void unload();      typedef map&lt;int,  ResourceHolder*&gt;::iterator IIter;     typedef pair&lt;int, ResourceHolder*&gt; IPair;     typedef map&lt;int,  AnimateMessage*&gt;::iterator RIter;     typedef pair&lt;int, AnimateMessage*&gt; RPair;     typedef vector&lt;Message&gt;::iterator MIter;     typedef vector&lt;CurrentMessage&gt;::iterator CIter; };  #endif    \/\/ _ANIMATEDSPRITE_H_ <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">AnimatedSprite.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &quot;AnimatedSprite.h&quot; #include &quot;Desktop.h&quot; #include &quot;Locale.h&quot;  AnimatedSprite::AnimatedSprite(ISpriteOwner* scene, int x, int y,                                 int zOrder): Sprite(scene, x, y, zOrder)                                             , state(0)                                             , images()                                             , lastTimestamp(0)                                             , messages()                                             , currentMessages()                                             , isAnimated(false)                                             , refreshCnt(REFRESH_CNT)                                             , rules() {}  AnimatedSprite::AnimatedSprite(ISpriteOwner* scene, const char* res, int x, int y,                                int zOrder, int loc): Sprite(scene, x, y, zOrder)                                             , state(0)                                             , images()                                             , lastTimestamp(0)                                             , messages()                                             , currentMessages()                                             , isAnimated(false)                                             , refreshCnt(REFRESH_CNT)                                             , rules() {     AnimatedSprite::addImage(res, 0, loc); }  AnimatedSprite::~AnimatedSprite() {     for (RIter p = rules.begin(); p != rules.end(); ++p) {         delete p-&gt;second;     } }  void AnimatedSprite::unload() {     for (IIter p = images.begin(); p != images.end(); ++p) {         p-&gt;second-&gt;unload();     } }  void AnimatedSprite::addMessageRule(int msg, AnimateMessage* rule) {     RIter p = rules.find(msg);     if (p != rules.end()) {         return;     }     rules.insert(RPair(msg, rule)); }  void AnimatedSprite::addImage(const char*res, int id, int loc) {     ResourceHolder* img = rm.load(res, loc);     images.insert(IPair(id, img)); }  bool AnimatedSprite::setState(int newState) {     IIter p = images.find(newState);     if (p == images.end()) {         return false;     }     state = newState;     return true; }         CIw2DImage* AnimatedSprite::getImage(int id) {     IIter p = images.find(id);     if (p == images.end()) {         return NULL;     }     return p-&gt;second-&gt;getData(); }  int AnimatedSprite::getState() {     return state; }  void AnimatedSprite::doMessage(int msg, void* data, uint64 timestamp) {     init();     int s = getState();     switch (msg) {         case emtStartAnimation:             isAnimated = true;             break;         case emtStopAnimation:             isAnimated = false;             break;         case emtSwitch:             s++;             if (getImage(s) == NULL) {                 s = 0;             }             setState(s);             return;         case emtHide:             isVisible = false;             return;         case emtShadow:             isVisible = true;             alpha = IW_2D_ALPHA_HALF;             return;         case emtShow:             isVisible = true;             alpha = IW_2D_ALPHA_NONE;             return;     };     if (timestamp == 0) {         timestamp = s3eTimerGetMs();     }     RIter p = rules.find(msg);     if (p != rules.end()) {         for (CIter q = currentMessages.begin(); q != currentMessages.end(); ++q) {             if (q-&gt;isEmpty) {                 q-&gt;isEmpty       = false;                 q-&gt;message       = p-&gt;second;                 q-&gt;timestamp     = timestamp;                 q-&gt;lastTimeDelta = 0;                 return;             }         }         currentMessages.push_back(CurrentMessage(p-&gt;second, timestamp));     } }  bool AnimatedSprite::sendMessage(int msg, uint64 timestamp, void* data) {     if (!isValidMessage(msg)) {         return false;     }     if (timestamp &lt;= lastTimestamp) {         doMessage(msg, data);         return true;     }     messages.push_back(Message(msg, timestamp, data));     return true; }   void AnimatedSprite::update(uint64 timestamp) {     bool isEmpty = true;     for (MIter p = messages.begin(); p != messages.end(); ++p) {         if (p-&gt;timestamp &lt;= lastTimestamp) continue;         if (p-&gt;timestamp &lt;= timestamp) {             doMessage(p-&gt;id, p-&gt;data, p-&gt;timestamp);             continue;         }         isEmpty = false;     }     if (isEmpty) {         messages.clear();     }     isEmpty = true;     for (CIter p = currentMessages.begin(); p != currentMessages.end(); ++p) {         if (p-&gt;isEmpty) continue;         uint64 timeDelta = timestamp - p-&gt;timestamp;         if (!p-&gt;message-&gt;update(timeDelta, p-&gt;lastTimeDelta)) {             p-&gt;isEmpty = true;             continue;         }         p-&gt;lastTimeDelta = timeDelta;         isEmpty = false;     }     if (isEmpty) {         currentMessages.clear();     }     lastTimestamp = timestamp; }  void AnimatedSprite::refresh() {     if (isAnimated) {         if (--refreshCnt &lt;= 0) {             refreshCnt = REFRESH_CNT;             doMessage(emtSwitch);         }     }     Sprite::refresh(); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0441\u043f\u0440\u0430\u0439\u0442\u0430, \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044f \u0438\u0445 \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438. \u042d\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u0441\u043f\u0440\u0430\u0439\u0442\u0430. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432 doMessage.<\/p>\n<p>  \u0414\u0440\u0443\u0433\u0438\u043c \u0432\u0430\u0436\u043d\u044b\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c \u043d\u0430\u0448\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441\u0442\u0430\u043d\u0435\u0442 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0439 \u0441\u043f\u0440\u0430\u0439\u0442, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0445 \u0438 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445) \u043a\u0430\u043a \u0435\u0434\u0438\u043d\u044b\u043c \u0446\u0435\u043b\u044b\u043c. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u0430:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">CompositeSprite.h<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#ifndef _COMPOSITESPRITE_H_ #define _COMPOSITESPRITE_H_  #include &quot;AnimatedSprite.h&quot; #include &quot;AbstractSpriteOwner.h&quot; #include &quot;Scene.h&quot;  class CompositeSprite: public AnimatedSprite                      , public AbstractSpriteOwner {     protected:         ISpriteOwner* owner;        public:         CompositeSprite(ISpriteOwner* scene, int x, int y, int zOrder);         virtual int  getXSize(int xSize);         virtual int  getYSize(int ySize);         virtual int  getXPos(int x);         virtual int  getYPos(int y);         virtual bool setState(int newState);         virtual void refresh();         virtual void update(uint64 timestamp);         virtual bool isBuzy();         virtual bool sendMessage(int msg, uint64 timestamp = 0, void* data = NULL);         virtual bool sendMessage(int msg, int x, int y);         virtual void unload(); };  #endif    \/\/ _COMPOSITESPRITE_H_ <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">CompositeSprite.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &quot;CompositeSprite.h&quot;  CompositeSprite::CompositeSprite(ISpriteOwner* scene, int x, int y, int zOrder): AnimatedSprite(scene, x, y, zOrder), owner(scene), AbstractSpriteOwner() {}  int CompositeSprite::getXSize(int xSize) {     return owner-&gt;getXSize(xSize); }         int CompositeSprite::getYSize(int ySize) {     return owner-&gt;getYSize(ySize); }  int CompositeSprite::getXPos(int x) {     return AbstractScreenObject::getXPos() + owner-&gt;getXPos(x); }     int CompositeSprite::getYPos(int y) {     return AbstractScreenObject::getYPos() + owner-&gt;getYPos(y); }  void CompositeSprite::refresh() {     if (isVisible) {         init();         AbstractSpriteOwner::refresh();     } }  void CompositeSprite::update(uint64 timestamp) {     AnimatedSprite::update(timestamp);     AbstractSpriteOwner::update(timestamp); }  bool CompositeSprite::isBuzy() {     return AnimatedSprite::isBuzy(); }  bool CompositeSprite::sendMessage(int msg, uint64 timestamp, void* data) {     return AnimatedSprite::sendMessage(msg, timestamp, data) ||         owner-&gt;sendMessage(msg, timestamp, data); }  bool CompositeSprite::sendMessage(int msg, int x, int y) {     if (!isVisible) return false;     return AbstractSpriteOwner::sendMessage(msg, x, y); }  bool CompositeSprite::setState(int newState) {     state = newState;     return true; }  void CompositeSprite::unload() {     AbstractSpriteOwner::unload(); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u0443\u044e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438, \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0445\u0435\u043c\u043e\u0439:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/4.bp.blogspot.com\/-Z0d8jdBERss\/UHZyZ_LZFNI\/AAAAAAAAAII\/ITTHGGKBjSM\/s1600\/03.PNG\" alt=\"image\"\/><\/p>\n<p>  \u0412 AnimatedSprite \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439. \u0412 rules \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0445 \u043a\u043e\u0434\u043e\u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0443\u043a\u0440\u0443\u043f\u043d\u0435\u043d\u043d\u044b\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 AnimateMessage. \u0421\u043f\u0438\u0441\u043e\u043a currentMessages \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0430\u0432\u0438\u043b, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f (\u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0430\u0432\u0438\u043b), \u0432 messages \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p>  \u0412 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, AnimateMessage \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 AnimateAction, \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0434\u0430\u043d\u044b \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 (\u044d\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c, \u0434\u043b\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0445 \u0435\u0434\u0438\u043d\u043e\u043c\u043e\u043c\u0435\u043d\u0442\u043d\u043e). <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">AnimateMessage.h<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#ifndef _ANIMATEMESSAGE_H_ #define _ANIMATEMESSAGE_H_  #include &lt;set&gt; #include &quot;s3eTypes.h&quot;  #include &quot;AnimateAction.h&quot;  using namespace std;  class AnimateMessage {     private:         set&lt;AnimateAction*&gt; actions;     public:         AnimateMessage();        ~AnimateMessage();         bool update(uint64 newDelta, uint64 oldDelta);         void addAction(AnimateAction* action) {actions.insert(action);}      typedef set&lt;AnimateAction*&gt;::iterator AIter; };  #endif    \/\/ _ANIMATEMESSAGE_H_ <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">AnimateMessage.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &quot;AnimateMessage.h&quot;  AnimateMessage::AnimateMessage(): actions() {}  AnimateMessage::~AnimateMessage() {     for (AIter p = actions.begin(); p != actions.end(); ++p) {         delete *p;     } }  bool AnimateMessage::update(uint64 newDelta, uint64 oldDelta) {     bool r = false;     for (AIter p = actions.begin(); p != actions.end(); ++p) {         if ((*p)-&gt;isSheduled(oldDelta)) {             r = true;             (*p)-&gt;update(newDelta);         } else {             (*p)-&gt;clear();         }     }     return r; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041c\u0435\u0442\u043e\u0434 update \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u0432\u0430 timestamp-\u0430: \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0415\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430. \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 AnimateAction \u0438, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 update. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 AnimateAction \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435. \u0415\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d \u0445\u043e\u0442\u044f-\u0431\u044b \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430, \u043c\u0435\u0442\u043e\u0434 update \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 true.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">AnimateAction.h<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#ifndef _ANIMATEACTION_H_ #define _ANIMATEACTION_H_  #include &quot;s3eTypes.h&quot;  #include &quot;AbstractScreenObject.h&quot;  class AnimateAction {     private:         uint64 startDelta;         uint64 stopDelta;     protected:         AbstractScreenObject* sprite;         virtual void doAction(int timeDelta) = 0;         virtual int getTimeInterval() {return (int)(stopDelta - startDelta);}     public:         AnimateAction(AbstractScreenObject* sprite, uint64 startDelta,                        uint64 stopDelta);         virtual ~AnimateAction() {}         virtual bool isSheduled(uint64 timeDelta);         virtual void update(uint64 timeDelta);         virtual void clear() {} };  #endif    \/\/ _ANIMATEACTION_H_ <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">AnimateAction.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &quot;AnimateAction.h&quot;  AnimateAction::AnimateAction(AbstractScreenObject* sprite, uint64 startDelta,                              uint64   stopDelta): sprite(sprite)                                                 , startDelta(startDelta)                                                 , stopDelta(stopDelta) { }  bool AnimateAction::isSheduled(uint64 timeDelta) {     return timeDelta &lt; stopDelta; }  void AnimateAction::update(uint64 timeDelta) {     if (timeDelta &gt;= startDelta) {         uint64 delta = timeDelta - startDelta;         if (timeDelta &gt; stopDelta) {             delta = stopDelta - startDelta;         }         doAction((int)delta);     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041c\u0435\u0442\u043e\u0434 isSheduled \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 true, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043e\u0442\u043c\u0435\u0442\u043a\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043e\u0442\u043c\u0435\u0442\u043a\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043b\u0438 \u0440\u0430\u0432\u043d\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0432 \u043c\u0435\u0442\u043e\u0434 doAction \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0435\u0433\u043e \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f (\u043d\u043e \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u0449\u0435\u0439 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f). \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 \u043c\u0435\u0442\u043e\u0434 isSheduled \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 timestamp-\u0430, \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 doAction.<\/p>\n<p>  \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u044f \u043e\u0442 AnimateAction \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u0432 AnimateAction \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c MoveAction \u2014 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439 \u043f\u0440\u044f\u043c\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 SoundAction, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430, \u0447\u0435\u0440\u0435\u0437 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">MoveAction.h<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#ifndef _MOVEACTION_H_ #define _MOVEACTION_H_  #include &quot;AnimateAction.h&quot;  class MoveAction: public AnimateAction {     private:         int x, y;         int startX, startY;         bool isCleared;     protected:         virtual void doAction(int timeDelta);         virtual void clear() {isCleared = true;}     public:         MoveAction(AbstractScreenObject* sprite, uint64 startDelta,                     uint64 stopDelta, int x, int y);         MoveAction(AbstractScreenObject* sprite, uint64 delta, int x, int y); };  #endif    \/\/ _MOVEACTION_H_ <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">MoveAction.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &quot;MoveAction.h&quot;  MoveAction::MoveAction(AbstractScreenObject* sprite, uint64 startDelta,                         uint64 stopDelta,                        int x, int y): AnimateAction(sprite, startDelta, stopDelta)                        , x(x), y(y), isCleared(true) {}  MoveAction::MoveAction(AbstractScreenObject* sprite, uint64 delta,                        int x, int y): AnimateAction(sprite, delta, delta)                        , x(x), y(y), isCleared(true) {}  void MoveAction::doAction(int timeDelta) {     if (isCleared) {         startX = sprite-&gt;getXDelta();         startY = sprite-&gt;getYDelta();         isCleared = false;     }     int timeInterval = getTimeInterval();     if (timeInterval &lt;= 0) {         sprite-&gt;setDeltaXY(x, y);     } else if (timeDelta &gt; timeInterval) {         sprite-&gt;setDeltaXY(x, y);     } else {         int xInterval = x - startX;         int yInterval = y - startY;         int xDelta = (xInterval * timeDelta) \/ timeInterval;         int yDelta = (yInterval * timeDelta) \/ timeInterval;         sprite-&gt;setDeltaXY(startX + xDelta, startY + yDelta);     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">SoundAction.h<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#ifndef _SOUNDACTION_H_ #define _SOUNDACTION_H_  #include &lt;string&gt; #include &quot;IwSound.h&quot;  #include &quot;AnimateAction.h&quot; #include &quot;Locale.h&quot;  using namespace std;  class SoundAction: public AnimateAction {     private:         string res;         int loc;         bool checkSound();     protected:         virtual void doAction(int timeDelta);     public:         SoundAction(AbstractScreenObject* sprite, uint64 timeDelta, const char* r,                     int loc = elSound); };  #endif    \/\/ _SOUNDACTION_H_ <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">SoundAction.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &quot;SoundAction.h&quot; #include &quot;Desktop.h&quot;  SoundAction::SoundAction(AbstractScreenObject* sprite, uint64 timeDelta,          const char* r, int loc): AnimateAction(sprite, timeDelta, timeDelta)          , res(r), loc(loc) { }  void SoundAction::doAction(int timeDelta) {     CIwResGroup* resGroup;     const char* groupName = Locale::getGroupName(loc);     if (checkSound() &&(groupName != NULL)) {         resGroup = IwGetResManager()-&gt;GetGroupNamed(groupName);         CIwSoundSpec* SoundSpec = (CIwSoundSpec*)resGroup-&gt;GetResNamed(res.c_str(),                                   IW_SOUND_RESTYPE_SPEC);         CIwSoundInst* SoundInstance = SoundSpec-&gt;Play();     } }  bool SoundAction::checkSound() {     IObject* o = (IObject*)desktop.getName(&quot;soundon&quot;);     if (o != NULL) {         return (o-&gt;getState() != 0);     }     return false; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u043d\u0430\u0431\u043e\u0440 AnimateAction \u043c\u043e\u0436\u0435\u0442 \u043b\u0435\u0433\u043a\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c\u0441\u044f.<\/p>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0433\u043e Android-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u043a\u043d\u043e\u043f\u043a\u0438. \u041a\u043d\u043e\u043f\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043d\u0430\u0436\u0430\u0442\u0438\u0435, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Button.h<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#ifndef _BUTTON_H_ #define _BUTTON_H_  #include &quot;AnimatedSprite.h&quot; #include &quot;AbstractSpriteOwner.h&quot;  enum EButtonMessage {     ebmDown             = 0x0100,     ebmUp               = 0x0101,     ebmOutUp            = 0x0111,     ebmPressed          = 0x0102 };  class Button: public AnimatedSprite {     protected:         AnimateMessage* msgDown;         AnimateMessage* msgUp;         int message;         AbstractSpriteOwner* receiver;         void configure();     public:         Button(ISpriteOwner* scene, const char* res, int x, int y,                 int zOrder = 0, int loc = elNothing);         Button(ISpriteOwner* scene, int x, int y, int zOrder = 0);         virtual bool isValidMessage(int msg);         virtual bool sendMessage(int msg, uint64 timestamp = 0, void* data = NULL);         virtual void doMessage(int msg, void* data = NULL, uint64 timestamp = 0);         virtual bool isPausable() const {return false;}         void addReceiver(int m, AbstractSpriteOwner* r); };  #endif    \/\/ _BUTTON_H_ <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Button.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &quot;Button.h&quot; #include &quot;Desktop.h&quot; #include &quot;MoveAction.h&quot; #include &quot;SendMessageAction.h&quot; #include &quot;SoundAction.h&quot;  Button::Button(ISpriteOwner* scene, const char* res, int x, int y,               int zOrder, int loc): AnimatedSprite(scene, res, x, y, zOrder, loc),                                    receiver(NULL) {     Button::configure(); }  Button::Button(ISpriteOwner* scene, int x, int y, int zOrder):                 AnimatedSprite(scene, x, y, zOrder),                 receiver(NULL) {     Button::configure(); }  void Button::configure() {     msgDown = new AnimateMessage();     msgDown-&gt;addAction(new MoveAction(this, 0, 50, 10, 10));     msgDown-&gt;addAction(new SoundAction(this, 50, &quot;menubutton&quot;));     addMessageRule(ebmDown, msgDown);     msgUp = new AnimateMessage();     msgUp-&gt;addAction(new MoveAction(this, 100, 150, 0, 0));     addMessageRule(ebmOutUp, msgUp);     msgUp = new AnimateMessage();     msgUp-&gt;addAction(new MoveAction(this, 100, 150, 0, 0));     msgUp-&gt;addAction(new SendMessageAction(this, 100, ebmPressed));     msgUp-&gt;addAction(new SendMessageAction(this, 110, emtInit));     addMessageRule(ebmUp, msgUp); }  bool Button::isValidMessage(int msg) {     switch (msg) {         case emtTouchDown:         case   emtTouchUp:         case      ebmDown:         case        ebmUp:         case     ebmOutUp:         case   ebmPressed: return true;         default: return AnimatedSprite::isValidMessage(msg);     } }  void Button::doMessage(int msg, void* data, uint64 timestamp) {     if (msg == ebmPressed) {         if (receiver != NULL) {             receiver-&gt;sendMessage(message, 0, (IObject*)this);         }         return;     }     AnimatedSprite::doMessage(msg, data, timestamp); }  bool Button::sendMessage(int msg, uint64 timestamp, void* data) {     if ((msg & emtTouchEvent) != 0) {         switch (msg & emtTouchMask) {             case emtTouchDown:                 sendMessage(ebmDown, desktop.getCurrentTimestamp());                 break;             case emtTouchUp:                 sendMessage(ebmUp, desktop.getCurrentTimestamp());                 break;             case emtTouchOutUp:                 sendMessage(ebmOutUp, desktop.getCurrentTimestamp());                 break;         }         return true;     }     return AnimatedSprite::sendMessage(msg, timestamp, data); }  void Button::addReceiver(int m, AbstractSpriteOwner* r) {     message  = m;     receiver = r; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 sendMessage \u043c\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u0434\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439 Touchpad, \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0430. \u0412 configure \u0441 \u044d\u0442\u0438\u043c\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c\u0438 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f, \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438, \u043a\u043d\u043e\u043f\u043a\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u0430 10 \u0435\u0434\u0438\u043d\u0438\u0446 \u0432\u043d\u0438\u0437 \u0438 \u0432\u043f\u0440\u0430\u0432\u043e, \u043f\u0440\u0438 \u043e\u0442\u043f\u0443\u0441\u043a\u0430\u043d\u0438\u0438, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u043e. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043f\u0440\u0438 \u043e\u0442\u043f\u0443\u0441\u043a\u0430\u043d\u0438\u0438 \u0442\u043e\u0447\u043a\u0430 \u043a\u0430\u0441\u0430\u043d\u0438\u044f \u043d\u0435 \u0443\u0448\u043b\u0430 \u0441 \u043a\u043d\u043e\u043f\u043a\u0438, \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0435 ebmPressed, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a.<\/p>\n<p>  \u041f\u043e\u043c\u0438\u043c\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043a\u043d\u043e\u043f\u043e\u043a, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u043a\u043d\u043e\u043f\u043a\u0438-\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u0438, \u0441 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u043e\u0439. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u0430 \u043a\u043d\u043e\u043f\u043a\u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438, \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u0435\u0435 \u043e\u0442 Button:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">SwitchButton.h<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#ifndef _SWITCHBUTTON_H_ #define _SWITCHBUTTON_H_  #include &quot;Button.h&quot;  class SwitchButton: public Button {     protected:         void configure();     public:         SwitchButton(ISpriteOwner* scene, int x, int y, int zOrder = 0);         virtual bool sendMessage(int msg, uint64 timestamp = 0, void* data = NULL); };  #endif    \/\/ _SWITCHBUTTON_H_ <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">SwitchButton.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &quot;SwitchButton.h&quot; #include &quot;Desktop.h&quot; #include &quot;MoveAction.h&quot; #include &quot;SendMessageAction.h&quot; #include &quot;SoundAction.h&quot;  SwitchButton::SwitchButton(ISpriteOwner* scene, int x, int y, int zOrder):                             Button(scene, x, y, zOrder) {     SwitchButton::configure(); }  void SwitchButton::configure() {     msgUp-&gt;addAction(new SendMessageAction(this, 50, emtSwitch)); }  bool SwitchButton::sendMessage(int msg, uint64 timestamp, void* data) {     if (msg == emtSwitch) {         doMessage(msg, 0, timestamp);         if (receiver != NULL) {             receiver-&gt;sendMessage(message, 0, (IObject*)this);         }         return true;     }     return Button::sendMessage(msg, timestamp, data); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u043e\u0442\u043f\u0443\u0441\u043a\u0430\u043d\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f emtSwitch, \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e AnimatedSprite.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0435 \u0433\u043e\u0442\u043e\u0432\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u041a\u043b\u0430\u0441\u0441 Intro \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0434\u0432\u0430 \u044d\u043a\u0440\u0430\u043d\u0430 \u2014 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0439 \u0438 \u044d\u043a\u0440\u0430\u043d \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Intro.h<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#ifndef _INTRO_H_ #define _INTRO_H_  #include &quot;Scene.h&quot; #include &quot;CompositeSprite.h&quot;  enum EIntroMessage {         eimPlay              = 0x100,         eimSettings          = 0x101,         eimBack              = 0x102,         eimCheckMusic        = 0x103 };  enum EIntroStatus {         eisMain              = 0,         eisSettings          = 1 };  class Intro: public Scene {     private:         Sprite* background;         CompositeSprite* title;         CompositeSprite* menu;         CompositeSprite* settings;         int state;         void checkMusic();     protected:         virtual bool doKeyMessage(int msg, s3eKey key);         virtual int  getState() {return state;}         void setState(int s) {state = s;}     public:         Intro();         virtual bool init();         virtual bool sendMessage(int msg, uint64 timestamp = 0, void* data = NULL); };  extern Intro* introScene;  #endif    \/\/ _INTRO_H_ <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Intro.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &quot;Intro.h&quot; #include &quot;Background.h&quot; #include &quot;IntroTitle.h&quot; #include &quot;IntroMenu.h&quot; #include &quot;IntroSound.h&quot; #include &quot;Desktop.h&quot;  Intro* introScene = NULL;  Intro::Intro(): state(eisMain) {     introScene = this; }  bool Intro::init() {     if (!Scene::init()) return false;     regKey(s3eKeyBack);     regKey(s3eKeyAbsBSK); #if defined IW_DEBUG     regKey(s3eKeyLSK); #endif     background = new Background(this, &quot;background.png&quot;, 1);     title = new IntroTitle(this, 2);     menu = new IntroMenu(this, 3);     settings = new IntroSound(this, 4);     settings-&gt;doMessage(emtHide);     checkMusic();     return true; }  bool Intro::doKeyMessage(int msg, s3eKey key) {      if (msg == emtKeyPressed) {         switch (state) {             case eisSettings:                 sendMessage(eimBack);                 return true;         }     }     return false; }  bool Intro::sendMessage(int msg, uint64 timestamp, void* data) {     switch (msg) {         case eimPlay:             \/\/ TODO:             return true;         case eimSettings:             background-&gt;setAlpha(IW_2D_ALPHA_HALF);             title-&gt;doMessage(emtHide);             menu-&gt;doMessage(emtHide);             settings-&gt;doMessage(emtShow);             setState(eisSettings);             return true;         case eimBack:             background-&gt;setAlpha(IW_2D_ALPHA_NONE);             title-&gt;doMessage(emtShow);             menu-&gt;doMessage(emtShow);             settings-&gt;doMessage(emtHide);             setState(eisMain);             return true;         case emtInit:         case eimCheckMusic:             checkMusic();             return true;     }     return false; }  void Intro::checkMusic() {     bool f = false;     IObject* o = (IObject*)desktop.getName(&quot;musicon&quot;);     if (o == NULL) {         desktop.stopMusic();         return;     }     f = (o-&gt;getState() != 0);     if (f) {         desktop.startMusic(&quot;music.mp3&quot;);     } else {         desktop.stopMusic();     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041a\u043b\u0430\u0441\u0441 Intro \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0441\u0446\u0435\u043d\u0443, \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0449\u0443\u044e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e CompositeSprite. \u0412 sendMessage \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0445 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432, \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0432\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u0435\u043d\u044e, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u044b\u0445 \u043a\u0430\u043a \u043d\u0430\u0431\u043e\u0440 \u043a\u043d\u043e\u043f\u043e\u043a.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">IntroTitle.h<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#ifndef _INTROTITLE_H_ #define _INTROTITLE_H_  #include &lt;string.h&gt; #include &quot;CompositeSprite.h&quot;  class IntroTitle: public CompositeSprite {     public:      IntroTitle(Scene* scene, int zOrder): CompositeSprite(scene, 0, 0, zOrder) {}      virtual bool init();      virtual void refresh(); };  #endif    \/\/ _INTROTITLE_H_ <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">IntroTitle.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &quot;IntroTitle.h&quot; #include &quot;Sprite.h&quot;  bool IntroTitle::init() {     if (!AbstractScreenObject::init()) return false;     \/\/ Sprite settings     setXY(122, 100);     \/\/ Sprite components     new Sprite(this, &quot;sprite.png&quot;, 0, 0, 1);     return true; }  void IntroTitle::refresh() {     CompositeSprite::refresh(); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">IntroMenu.h<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#ifndef _INTROMENU_H_ #define _INTROMENU_H_  #include &quot;CompositeSprite.h&quot; #include &quot;Button.h&quot;  class IntroMenu: public CompositeSprite {     private:         Scene* scene;         Button* firstButton;         Button* secondButton;     public:         IntroMenu(Scene* scene, int zOrder): CompositeSprite(scene, 0, 0, zOrder),                                               scene(scene) {}         virtual bool init(); };  #endif    \/\/ _INTROMENU_H_ <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">IntroMenu.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &quot;IntroMenu.h&quot; #include &quot;Locale.h&quot; #include &quot;Intro.h&quot; #include &quot;Desktop.h&quot;  bool IntroMenu::init() {     if (!AbstractScreenObject::init()) return false;     setXY(297, 384);     firstButton = new Button(this, &quot;play&quot;, 0, 0, 1,                               Locale::getCurrentImageLocale());     firstButton-&gt;addReceiver(eimPlay, scene);     secondButton = new Button(this, &quot;setup&quot;, 0, 157, 2,                                Locale::getCurrentImageLocale());     secondButton-&gt;addReceiver(eimSettings, scene);     return true; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">IntroSound.h<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#ifndef _INTROSOUND_H_ #define _INTROSOUND_H_  #include &quot;CompositeSprite.h&quot;  class IntroSound: public CompositeSprite {     private:         Scene* scene;     public:        IntroSound(Scene* scene, int zOrder): CompositeSprite(scene, 0, 0, zOrder),                                               scene(scene) {}       virtual bool init(); };  #endif    \/\/ _INTROSOUND_H_ <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">IntroSound.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &quot;IntroSound.h&quot; #include &quot;SwitchButton.h&quot; #include &quot;Button.h&quot; #include &quot;Intro.h&quot; #include &quot;Locale.h&quot;  bool IntroSound::init() {     if (!AbstractScreenObject::init()) return false;     setXY(346, 227);     SwitchButton* s = new SwitchButton(this, 0, 0, 1);         s-&gt;addImage(&quot;musicoff&quot;, 0, Locale::getCurrentImageLocale());         s-&gt;addImage(&quot;musicon&quot;, 1, Locale::getCurrentImageLocale());         s-&gt;setName(&quot;musicon&quot;);         s-&gt;setState(1);     s-&gt;addReceiver(eimCheckMusic, scene);     s = new SwitchButton(this, 0, 157, 2);         s-&gt;addImage(&quot;soundoff&quot;, 0, Locale::getCurrentImageLocale());         s-&gt;addImage(&quot;soundon&quot;, 1, Locale::getCurrentImageLocale());         s-&gt;setName(&quot;soundon&quot;);         s-&gt;setState(1);     Button* b = new Button(this, &quot;back.png&quot;, -300, 350, 3,                             Locale::getCommonImageLocale());     b-&gt;addReceiver(eimBack, scene);     return true; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0438 \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u044e\u0442 \u043d\u0430 \u043d\u0430\u0436\u0430\u0442\u0438\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u044d\u043a\u0440\u0430\u043d\u0430\u043c\u0438.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u043d\u0430\u043c \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 Framework, \u043f\u043e\u043f\u0443\u0442\u043d\u043e \u0438\u0437\u0443\u0447\u0438\u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 Marmalade API \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0445 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e\u0433\u043e, \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u0447\u0438\u0442\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u043c \u0438\u0433\u0440\u043e\u0432\u044b\u043c Framework-\u043e\u043c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u043d\u0435\u043c \u043d\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0438\u0437\u0438\u043a\u0438), \u043d\u043e \u043b\u0435\u0436\u0430\u0449\u0430\u044f \u0432 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u0433\u0438\u0431\u043a\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0442\u0435\u043a\u0441\u0442\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 <a href=\"https:\/\/github.com\/GlukKazan\/mf\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<p>  \u041f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 Marmalade Framework \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 <a href=\"http:\/\/www.drmop.com\/index.php\/marmalade-sdk-tutorials\/\">\u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b<\/a>.      \t   \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/162511\/\"> http:\/\/habrahabr.ru\/post\/162511\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t\u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"http:\/\/habrahabr.ru\/post\/161681\/\">\u0446\u0438\u043a\u043b\u0430<\/a>, \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 Marmalade Framework, \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435 \u0441\u043f\u0440\u0430\u0439\u0442\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-162511","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/162511","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=162511"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/162511\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=162511"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=162511"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=162511"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}