{"id":161681,"date":"2012-12-06T20:03:03","date_gmt":"2012-12-06T16:03:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=161681"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=161681","title":{"rendered":"<span class=\"post_title\">Framework \u0432 \u041c\u0430\u0440\u043c\u0435\u043b\u0430\u0434\u0435 (\u0447\u0430\u0441\u0442\u044c 1)<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t\u0412 \u044d\u0442\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0441\u0442\u0430\u0442\u0435\u0439 \u044f \u043e\u043f\u0438\u0448\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e Framework-\u0430, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f 2D-\u0438\u0433\u0440, \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"http:\/\/www.madewithmarmalade.com\/\">Marmalade<\/a>. Marmalade \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 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 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0445, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435, \u043f\u043e\u0434 Android \u0438 iOS. \u0420\u0430\u0431\u043e\u0442\u0430 \u0432 Marmalade \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u0430, \u0430 \u0435\u0433\u043e \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u043d\u043e \u0441\u0430\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u043e\u0441\u0438\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e Framework-\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0436\u0438\u0437\u043d\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0435\u043c\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443.<br \/>  <a name=\"habracut\"><\/a> <br \/>  \u0427\u0442\u043e\u0431\u044b \u043b\u0443\u0447\u0448\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0435\u0431\u0435, \u0447\u0442\u043e \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c, \u043d\u0430\u0447\u043d\u0435\u043c \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439. \u0418\u0442\u0430\u043a, \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u043d\u0430\u043c\u0438 Framework \u0434\u043e\u043b\u0436\u0435\u043d:<\/p>\n<ul>\n<li>\u0411\u044b\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0438, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f (\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434)<\/li>\n<li>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e 2D-\u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0443\u044e \u0438\u0445 \u043f\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435, \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438<\/li>\n<li>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432<\/li>\n<li>\u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f touchPad-\u0430 (\u0441 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 MultiTouch) \u0438 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b<\/li>\n<li>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u043d\u0438\u0435\u043c \u0444\u043e\u043d\u043e\u0432\u043e\u0439 \u043c\u0443\u0437\u044b\u043a\u0438 \u0438 \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u043c\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0430\u043c\u0438 (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0441 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0437\u0432\u0443\u043a\u043e\u0432 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e)<\/li>\n<\/ul>\n<p>  \u0421\u0430\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d \u0432 \u044d\u0442\u043e\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445. \u041d\u0438\u0436\u0435, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/1.bp.blogspot.com\/-J9TiuNeW83E\/UEcvxD4yEcI\/AAAAAAAAAGY\/5eaHHUalDQU\/s640\/MF.PNG\" alt=\"image\"\/><\/p>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0438 \u043a\u043b\u0430\u0441\u0441\u044b:<\/p>\n<ul>\n<li>IObject \u2014 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/li>\n<li>IScreenObject \u2014 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u043c\u0435\u044e\u0449\u0435\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u043d\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435<\/li>\n<li>ISprite \u2014 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u043f\u0440\u0430\u0439\u0442\u0430, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0435\u0441\u0443\u0440\u0441<\/li>\n<li>IAnimatedSprite \u2014 \u0438\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, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/li>\n<li>ISpriteOwner \u2014 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 (\u0441\u0446\u0435\u043d\u044b \u0438\u043b\u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0433\u043e \u0441\u043f\u0440\u0430\u0439\u0442\u0430)<\/li>\n<li>IAbstractSpriteOwner \u2014 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0435\u0433\u043e, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u043f\u043e \u044d\u043a\u0440\u0430\u043d\u0443, \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0442.\u043f.<\/li>\n<li>Sprite \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0440\u0430\u0439\u0442\u0430<\/li>\n<li>Background \u2014 \u0444\u043e\u043d\u043e\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435<\/li>\n<li>AnimatedSprite \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0440\u0430\u0439\u0442\u0430, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 (\u0441\u043a\u0440\u044b\u0442\u044c\/\u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442, \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u0438.\u0442.\u043f.)<\/li>\n<li>CompositeSprite \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0433\u043e \u0441\u043f\u0440\u0430\u0439\u0442\u0430<\/li>\n<\/ul>\n<p>  \u041d\u0430\u0447\u043d\u0435\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f mkb-\u0444\u0430\u0439\u043b\u0430, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u0441\u043e\u0431\u043e\u0439 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 Marmalade \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442 C++ \u043f\u0440\u043e\u0435\u043a\u0442.<\/p>\n<p>  <b><u>mf.mkb:<\/u><\/b><\/p>\n<pre><code class=\"cmake\">#!\/usr\/bin\/env mkb options { }  subprojects {     iw2d }  includepath {     .\/source\/Main     .\/source\/Common     .\/source\/Scene } files {     [Main]     (source\/Main)     Main.cpp     Main.h     Desktop.cpp     Desktop.h      [Common]     (source\/Common)     IObject.h     IScreenObject.h     ISprite.h     ISpriteOwner.h     AbstractScreenObject.h     AbstractScreenObject.cpp     AbstractSpriteOwner.h     AbstractSpriteOwner.cpp      [Scene]     (source\/Scene)     Scene.cpp     Scene.h     Background.cpp     Background.h     Sprite.cpp     Sprite.h      [Data]     (data)  }  assets {     (data)     background.png     sprite.png      (data-ram\/data-gles1, data) } <\/code><\/pre>\n<p>  \u041d\u0430 \u043f\u0443\u0441\u0442\u044b\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044b \u043f\u043e\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f (\u043e\u043d\u0438 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u043d\u0430\u043c \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c). \u0412 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 subprojects \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u0434\u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c (\u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430 iw2d Marmalade, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 2D-\u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439). \u0412 includepath, \u043a\u0430\u043a \u044d\u0442\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0438\u043c\u0435\u043d\u0430 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 h-\u0444\u0430\u0439\u043b\u044b. \u0412 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 files \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b (\u0438\u043c\u044f \u0432 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0445 \u0441\u043a\u043e\u0431\u043a\u0430\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0438\u043c\u044f \u043f\u0430\u043f\u043a\u0438 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 MSVC, \u0430 \u043f\u0443\u0442\u044c \u0432 \u043a\u0440\u0443\u0433\u043b\u044b\u0445 \u0441\u043a\u043e\u0431\u043a\u0430\u0445 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0433\u0434\u0435 \u044d\u0442\u0430 \u043f\u0430\u043f\u043a\u0430 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0438\u0441\u043a\u0435). \u0412 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 assets \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c.<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435, \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043a\u0438 h- \u0438 cpp-\u0444\u0430\u0439\u043b\u043e\u0432, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0432 \u0438\u0445 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u0430\u043f\u043a\u0430\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c MKB-\u0444\u0430\u0439\u043b \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u043e\u0442\u043a\u0440\u043e\u0435\u0442\u0441\u044f Microsoft Visual Studio, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/1.bp.blogspot.com\/-dslS3ZQMrqg\/UE2Q3s9t3-I\/AAAAAAAAAGs\/wMalpLKw_SY\/s1600\/10-09-2012+11-03-17.png\" alt=\"image\"\/><\/p>\n<p>  \u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u0432 Main.cpp:<\/p>\n<p>  <b><u>Main.cpp:<\/u><\/b><\/p>\n<pre><code class=\"cpp\">#include &quot;Main.h&quot;  #include &quot;s3e.h&quot; #include &quot;Iw2D.h&quot; #include &quot;IwGx.h&quot;  #include &quot;Desktop.h&quot; #include &quot;Scene.h&quot; #include &quot;Background.h&quot; #include &quot;Sprite.h&quot;  void init() {     \/\/ Initialise Mamrlade graphics system and Iw2D module     IwGxInit();     Iw2DInit();      \/\/ Set the default background clear colour     IwGxSetColClear(0x0, 0x0, 0x0, 0);      desktop.init(); }  void release() {     desktop.release();      Iw2DTerminate();     IwGxTerminate(); }  int main() {     init();    {          Scene scene;         new Background(&scene, &quot;background.png&quot;, 1);         new Sprite(&scene, &quot;sprite.png&quot;, 122, 100, 2);         desktop.setScene(&scene);          int32 duration = 1000 \/ 25;         \/\/ Main Game Loop         while (!s3eDeviceCheckQuitRequest()) {             \/\/ Update keyboard system             s3eKeyboardUpdate();             if ((s3eKeyboardGetState(s3eKeyAbsBSK) & S3E_KEY_STATE_DOWN)                  == S3E_KEY_STATE_DOWN) break;             \/\/ Update             desktop.update(s3eTimerGetMs());             \/\/ Clear the screen             IwGxClear(IW_GX_COLOUR_BUFFER_F | IW_GX_DEPTH_BUFFER_F);             \/\/ Refresh             desktop.refresh();             \/\/ Show the surface             Iw2DSurfaceShow();             \/\/ Yield to the opearting system             s3eDeviceYield(duration);         }     }     release();     return 0; } <\/code><\/pre>\n<p>  \u042d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 Marmalade. \u0412 init \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0434\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0446\u0435\u043d\u0430 \u0438 \u0435\u0435 \u043d\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 desktop \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0446\u0435\u043d\u044b (\u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043d\u043e\u043c \u0431\u043b\u043e\u043a\u0435, \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 scene \u0434\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 release).<\/p>\n<p>  \u0412 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e \u043a\u043d\u043e\u043f\u043a\u0438 \u00abs3eKeyAbsBSK\u00bb (\u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u043e\u0439 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445), \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c desktop, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0435\u043c\u0443 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 timestamp, \u043e\u0447\u0438\u0449\u0430\u0435\u043c \u044d\u043a\u0440\u0430\u043d, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u043a\u0443 desktop, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u043c Iw2DSurfaceShow, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0432\u044b\u0437\u043e\u0432\u043e\u043c s3eDeviceYield. \u041f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430, \u043e\u0447\u0438\u0449\u0430\u0435\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 release.<\/p>\n<p>  \u041a\u043b\u0430\u0441\u0441 Desktop \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442 \u043d\u0430\u043c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u044d\u043a\u0440\u0430\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430:<\/p>\n<p>  <b><u>Desktop.h:<\/u><\/b><\/p>\n<pre><code class=\"cpp\">#ifndef _DESKTOP_H_ #define _DESKTOP_H_  #include &quot;Scene.h&quot;  class Desktop {     private:         int width, height;         Scene* currentScene;     public:         void init();         void release() {}         void update(uint64 timestamp);         void refresh();         int getWidth() const {return width;}         int getHeight() const {return height;}         Scene* getScene() {return currentScene;}         void setScene(Scene* scene); };         extern Desktop desktop;  #endif    \/\/ _DESKTOP_H_ <\/code><\/pre>\n<p>  \u0420\u0430\u0437\u043c\u0435\u0440\u044b \u044d\u043a\u0440\u0430\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u0432 Iw2DGetSurfaceWidth \u0438 Iw2DGetSurfaceHeight.<\/p>\n<p>  <b><u>Desktop.cpp:<\/u><\/b><\/p>\n<pre><code class=\"cpp\">#include &quot;Desktop.h&quot; #include &quot;Iw2D.h&quot;  Desktop desktop;  void Desktop::init() {     width = Iw2DGetSurfaceWidth();     height = Iw2DGetSurfaceHeight();     setScene(NULL); }  void Desktop::setScene(Scene* scene) {     if (scene != NULL) {         scene-&gt;init();     }     currentScene = scene; }  void Desktop::update(uint64 timestamp) {     if (currentScene != NULL) {         currentScene-&gt;update(timestamp);     } }  void Desktop::refresh() {     if (currentScene != NULL) {         currentScene-&gt;refresh();     } } <\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0439 \u043d\u0430\u043c\u0438 \u0440\u0430\u043d\u0435\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439.<\/p>\n<p>  <b><u>IObject.h:<\/u><\/b><\/p>\n<pre><code class=\"cpp\">#ifndef _IOBJECT_H_ #define _IOBJECT_H_  #include &quot;s3e.h&quot;  class IObject {     public:         virtual ~IObject() {}           virtual bool isBuzy() = 0;         virtual int  getState() = 0;         virtual bool sendMessage(int msg, uint64 timestamp = 0,                                   void* data = NULL) = 0;         virtual bool sendMessage(int msg, int x, int y) = 0;         virtual void update(uint64 timestamp) = 0;         virtual void refresh() = 0; };  #endif    \/\/ _IOBJECT_H_ <\/code><\/pre>\n<p>  <b><u>IScreenObject.h:<\/u><\/b><\/p>\n<pre><code class=\"cpp\">#ifndef _ISCREENOBJECT_H_ #define _ISCREENOBJECT_H_  #include &quot;s3e.h&quot;  #include &quot;IObject.h&quot;  class IScreenObject: public IObject {     public:         virtual int  getXPos()    = 0;         virtual int  getYPos()    = 0;         virtual int  getWidth()   = 0;         virtual int  getHeight()  = 0; };  #endif    \/\/ _ISCREENOBJECT_H_ <\/code><\/pre>\n<p>  <b><u>ISprite.h:<\/u><\/b><\/p>\n<pre><code class=\"cpp\">#ifndef _ISPRITE_H_ #define _ISPRITE_H_  #include &quot;Locale.h&quot;  #include &quot;Iw2D.h&quot; #include &quot;IwGx.h&quot;  class ISprite {     public:         virtual void addImage(const char* res, int state = 0) = 0;         virtual CIw2DImage* getImage(int state = 0)           = 0; };  #endif    \/\/ _ISPRITE_H_  ISpriteOwner.h:  #ifndef _ISPRITEOWNER_H_ #define _ISPRITEOWNER_H_  #include &quot;IObject.h&quot; #include &quot;AbstractScreenObject.h&quot;  class ISpriteOwner: public IObject {     public:         virtual void addSprite(AbstractScreenObject* sprite, int zOrder) = 0;         virtual bool setZOrder(AbstractScreenObject* sprite, int z)      = 0;         virtual int  getDesktopWidth()                                   = 0;         virtual int  getDesktopHeight()                                  = 0;         virtual int  getXSize(int xSize)                                 = 0;         virtual int  getYSize(int ySize)                                 = 0;         virtual int  getXPos(int x)                                      = 0;         virtual int  getYPos(int y)                                      = 0; };  #endif    \/\/ _ISPRITEOWNER_H_ <\/code><\/pre>\n<p>  \u0412\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 AbstractScreenObject \u0431\u0443\u0434\u0435\u043c \u0432\u0435\u0441\u0442\u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0441\u0441\u044b\u043b\u043e\u043a \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043f\u0440\u0430\u0439\u0442\u0430:<\/p>\n<p>  <b><u>AbstractScreenObject.h:<\/u><\/b><\/p>\n<pre><code class=\"cpp\">#ifndef _ABSTRACTSCREENOBJECT_H_ #define _ABSTRACTSCREENOBJECT_H_  #include &lt;string&gt; #include &quot;Iw2D.h&quot;  #include &quot;IScreenObject.h&quot;  using namespace std;  class AbstractScreenObject: public IScreenObject {     private:         static int idCounter;         int id;         int usageCounter;     protected:         virtual bool init();         CIw2DAlphaMode alpha;         int xPos, yPos, angle;         int xDelta, yDelta;         bool isVisible;         bool isInitialized;     public:         AbstractScreenObject(int x, int y);         virtual ~AbstractScreenObject() {}           int getId() const {return id;}         void incrementUsage();         bool decrementUsage();         virtual int  getXPos()      {return xPos + xDelta;}         virtual int  getYPos()      {return yPos + yDelta;}         virtual int  getWidth()     {return 0;}          virtual int  getHeight()    {return 0;}         virtual bool isBackground() {return false;}         virtual bool isBuzy()       {return false;}         int  getAngle() const {return angle;}         void move(int x = 0, int y = 0);         void setXY(int x = 0, int y = 0);         void clearXY();         void setAngle(int a) {angle = a;}         void setAlpha(CIw2DAlphaMode a) {alpha = a;}         bool setState(int state) {return false;} };  #endif    \/\/ _ABSTRACTSCREENOBJECT_H_ <\/code><\/pre>\n<p>  <b><u>AbstractScreenObject.cpp:<\/u><\/b><\/p>\n<pre><code class=\"cpp\">#include &quot;AbstractScreenObject.h&quot; #include &quot;Desktop.h&quot;  int AbstractScreenObject::idCounter = 0;  AbstractScreenObject::AbstractScreenObject(int x, int y):       xPos(x), alpha(IW_2D_ALPHA_NONE),yPos(y), angle(0),       xDelta(0), yDelta(0), isVisible(true), isInitialized(false), usageCounter(0) {     id = ++idCounter; }  bool AbstractScreenObject::init() {     bool r = !isInitialized;     isInitialized = true;     return r; }  void AbstractScreenObject::incrementUsage() {     usageCounter++; }  bool AbstractScreenObject::decrementUsage() {     usageCounter--;     return (usageCounter == 0); }  void AbstractScreenObject::move(int x, int y) {     xDelta += x;     yDelta += y; }  void AbstractScreenObject::setXY(int x, int y) {     xPos = x;     yPos = y; }  void AbstractScreenObject::clearXY() {     xDelta = 0;     yDelta = 0; } <\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432.<\/p>\n<p>  <b><u>Sprite.h:<\/u><\/b><\/p>\n<pre><code class=\"cpp\">#ifndef _SPRITE_H_ #define _SPRITE_H_  #include &quot;AbstractScreenObject.h&quot; #include &quot;ISprite.h&quot; #include &quot;ISpriteOwner.h&quot; #include &quot;Locale.h&quot;  class Sprite: public AbstractScreenObject             , public ISprite {     protected:         ISpriteOwner* owner;         CIw2DImage* img;     public:         Sprite(ISpriteOwner* owner, int x, int y , int zOrder = 0);         Sprite(ISpriteOwner* owner, const char* res, int x, int y, int zOrder = 0);         virtual ~Sprite();         virtual bool sendMessage(int msg, uint64 timestamp = 0, void* data = NULL);         virtual bool sendMessage(int msg, int x, int y) {return false;}         virtual void update(uint64 timestamp) {}         virtual void refresh();         virtual void addImage(const char*res, int state = 0);         virtual CIw2DImage* getImage(int id = 0);         virtual int  getState()  {return 0;}         virtual int  getWidth();         virtual int  getHeight(); };  #endif    \/\/ _SPRITE_H_ <\/code><\/pre>\n<p>  <b><u>Sprite.cpp:<\/u><\/b><\/p>\n<pre><code class=\"cpp\">#include &quot;Sprite.h&quot; #include &quot;Locale.h&quot;  Sprite::Sprite(ISpriteOwner* owner, int x, int y, int zOrder):                                       AbstractScreenObject(x, y)                                     , owner(owner)                                     , img(NULL) {     owner-&gt;addSprite((AbstractScreenObject*)this, zOrder); }  Sprite::Sprite(ISpriteOwner* owner, const char* res, int x, int y, int zOrder):                                       AbstractScreenObject(x, y)                                     , owner(owner)                                     , img(NULL) {     addImage(res, 0);     owner-&gt;addSprite((AbstractScreenObject*)this, zOrder); }  Sprite::~Sprite() {     if (img != NULL) {         delete img;     } }  bool Sprite::sendMessage(int msg, uint64 timestamp, void* data) {     return owner-&gt;sendMessage(msg, timestamp, data); }  void Sprite::addImage(const char*res, int state) {     img = Iw2DCreateImage(res); }  CIw2DImage* Sprite::getImage(int id) {     return img; }  int Sprite::getWidth() {     CIw2DImage* img = getImage(getState());     if (img != NULL) {         return img-&gt;GetWidth();     } else {         return 0;     } }  int Sprite::getHeight() {     CIw2DImage* img = getImage(getState());     if (img != NULL) {         return img-&gt;GetHeight();     } else {         return 0;     } }  void Sprite::refresh() {     init();     CIw2DImage* img = getImage(getState());     if (isVisible && (img != NULL)) {         CIwMat2D m;         m.SetRot(getAngle());         m.ScaleRot(IW_GEOM_ONE);         m.SetTrans(CIwSVec2(owner-&gt;getXSize(owner-&gt;getXPos(getXPos())),                           owner-&gt;getYSize(owner-&gt;getYPos(getYPos()))));         Iw2DSetTransformMatrix(m);         Iw2DSetAlphaMode(alpha);         Iw2DDrawImage(img, CIwSVec2(0, 0), CIwSVec2(owner-&gt;getXSize(getWidth()),                          owner-&gt;getYSize(getHeight())));     } } <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u044b addImage (\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0430 \u0438\u0437 \u0440\u0435\u0441\u0443\u0440\u0441\u0430) \u0438 refresh (\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u0430 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435). \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c, \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u044b\u0437\u043e\u0432\u043e\u0432 SetRot, ScaleRot, SetTrans \u043b\u0443\u0447\u0448\u0435 \u043d\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0432 \u044d\u0442\u0438 \u0432\u044b\u0437\u043e\u0432\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0435\u0433\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442.<\/p>\n<p>  \u0412 \u0432\u044b\u0437\u043e\u0432\u0430\u0445 SetTrans \u0438 Iw2DrawImage, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u044b getXSize \u0438 getYSize \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432 \u044d\u043a\u0440\u0430\u043d\u043d\u044b\u0435. \u0427\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435, \u043c\u044b \u0438\u0445 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c. \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0432\u0430\u0436\u043d\u043e\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 ScaleRot \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u0440\u0435\u0442\u044c\u0435\u0433\u043e (\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430) Iw2DrawImage. \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0430\u0444\u0438\u043d\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435, \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0442\u043e \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043c\u0430\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043f\u043e \u043e\u0441\u044f\u043c X \u0438 Y (\u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u043e\u043c\u0443 aspect ratio).<\/p>\n<p>  \u041a\u043b\u0430\u0441\u0441 Background \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u043c Sprite \u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 refresh. \u042d\u043a\u0440\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435\u043c, \u0430 \u0431\u0435\u0440\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438\u0437 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 desktop<\/p>\n<p>  <b><u>Background.h:<\/u><\/b><\/p>\n<pre><code class=\"cpp\">#ifndef _BACKGROUND_H_ #define _BACKGROUND_H_  #include &quot;Sprite.h&quot; #include &quot;Locale.h&quot;  class Background: public Sprite {     public:         Background(ISpriteOwner* owner, const char* res, int zOrder);         virtual bool isBackground() {return true;}         virtual void refresh(); };  #endif    \/\/ _BACKGROUND_H_ <\/code><\/pre>\n<p>  <b><u>Background.cpp:<\/u><\/b><\/p>\n<pre><code class=\"cpp\">#include &quot;Background.h&quot;  Background::Background(ISpriteOwner* owner, const char* res, int zOrder):                        Sprite(owner, res, 0, 0, zOrder) {}  void Background::refresh() {     CIwMat2D m;     m.SetRot(0);     m.ScaleRot(IW_GEOM_ONE);     m.SetTrans(CIwSVec2(0, 0));     Iw2DSetTransformMatrix(m);     Iw2DSetAlphaMode(alpha);     Iw2DDrawImage(img, CIwSVec2(0, 0),      CIwSVec2(owner-&gt;getDesktopWidth(), owner-&gt;getDesktopHeight())); } <\/code><\/pre>\n<p>  AbstractSpriteOwner \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 \u0438 \u0432\u0435\u0434\u0435\u0442 Z-\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u0445 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435.<\/p>\n<p>  <b><u>AbstractSpriteOwner.h:<\/u><\/b><\/p>\n<pre><code class=\"cpp\">#ifndef _ABSTRACTSPRITEOWNER_H_ #define _ABSTRACTSPRITEOWNER_H_  #include &lt;map&gt;  #include &quot;IObject.h&quot; #include &quot;ISpriteOwner.h&quot; #include &quot;AbstractScreenObject.h&quot;  using namespace std;  class AbstractSpriteOwner: public ISpriteOwner {     protected:         multimap&lt;int, AbstractScreenObject*&gt; zOrder;     public:         AbstractSpriteOwner();         virtual ~AbstractSpriteOwner();         virtual void addSprite(AbstractScreenObject* sprite, int z);         virtual bool setZOrder(AbstractScreenObject* sprite, int z);         virtual int  getDesktopWidth();         virtual int  getDesktopHeight();         virtual int  getState() {return 0;}         virtual void update(uint64 timestamp);         virtual void refresh();         virtual bool sendMessage(int msg, uint64 timestamp = 0,                       void* data = NULL) {return false;}         virtual bool sendMessage(int msg, int x, int y);      typedef multimap&lt;int, AbstractScreenObject*&gt;::iterator ZIter;     typedef multimap&lt;int, AbstractScreenObject*&gt;::reverse_iterator RIter;     typedef pair&lt;int, AbstractScreenObject*&gt; ZPair; };  #endif    \/\/ _ABSTRACTSPRITEOWNER_H_ <\/code><\/pre>\n<p>  <b><u>AbstractSpriteOwner.cpp:<\/u><\/b><\/p>\n<pre><code class=\"cpp\">#include &quot;AbstractSpriteOwner.h&quot; #include &quot;Desktop.h&quot; #include &quot;ISprite.h&quot;  AbstractSpriteOwner::AbstractSpriteOwner(): zOrder() {}  AbstractSpriteOwner::~AbstractSpriteOwner() {     for (ZIter p = zOrder.begin(); p != zOrder.end(); ++p) {         if (p-&gt;second-&gt;decrementUsage()) {             delete p-&gt;second;         }     } }  void AbstractSpriteOwner::addSprite(AbstractScreenObject* sprite, int z) {     sprite-&gt;incrementUsage();     zOrder.insert(ZPair(z, sprite)); }  bool AbstractSpriteOwner::setZOrder(AbstractScreenObject* sprite, int z) {     for (ZIter p = zOrder.begin(); p != zOrder.end(); ++p) {         if (p-&gt;second == sprite) {             zOrder.erase(p);             zOrder.insert(ZPair(z, sprite));             return true;         }     }     return false; }  int AbstractSpriteOwner::getDesktopWidth() {     return desktop.getWidth(); }  int AbstractSpriteOwner::getDesktopHeight() {     return desktop.getHeight(); }  void AbstractSpriteOwner::update(uint64 timestamp) {     for (ZIter p = zOrder.begin(); p != zOrder.end(); ++p) {         p-&gt;second-&gt;update(timestamp);     } }  void AbstractSpriteOwner::refresh() {     for (ZIter p = zOrder.begin(); p != zOrder.end(); ++p) {         p-&gt;second-&gt;refresh();     } }  bool AbstractSpriteOwner::sendMessage(int msg, int x, int y) {     for (RIter p = zOrder.rbegin(); p != zOrder.rend(); ++p) {         if (p-&gt;second-&gt;isBackground()) continue;         if (p-&gt;second-&gt;sendMessage(msg, x, y)) {             return true;         }     }     return false; } <\/code><\/pre>\n<p>  \u041d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u043c AbstractSpriteOwner \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f Scene:<\/p>\n<p>  <b><u>Scene.h:<\/u><\/b><\/p>\n<pre><code class=\"cpp\">#ifndef _SCENE_H_ #define _SCENE_H_  #include &quot;s3eKeyboard.h&quot;  #include &quot;AbstractSpriteOwner.h&quot; #include &quot;AbstractScreenObject.h&quot;  using namespace std;  class Scene: public AbstractSpriteOwner {     private:         AbstractScreenObject* background;         bool isInitialized;     public:         Scene();         virtual bool init();         int getXSize(int xSize);         int getYSize(int ySize);         virtual int getXPos(int x) {return x;}         virtual int getYPos(int y) {return y;}         virtual void refresh();         virtual void update(uint64 timestamp);         virtual bool isBuzy() {return false;}         virtual bool sendMessage(int id, int x, int y); };  #endif    \/\/ _SCENE_H_ <\/code><\/pre>\n<p>  <b><u>Scene.cpp:<\/u><\/b><\/p>\n<pre><code class=\"cpp\">#include &quot;Scene.h&quot; #include &quot;Desktop.h&quot;  Scene::Scene(): AbstractSpriteOwner()               , isInitialized(false)               , background(NULL) {}  bool Scene::init() {     bool r = !isInitialized;     isInitialized = true;     return r; }  int Scene::getXSize(int xSize) {     if (background != NULL) {         return (getDesktopWidth() * xSize) \/ background-&gt;getWidth();     }     return xSize; }  int Scene::getYSize(int ySize) {     if (background != NULL) {         return (getDesktopHeight() * ySize) \/ background-&gt;getHeight();     }     return ySize; }  void Scene::refresh() {     init();     if (background == NULL) {         for (ZIter p = zOrder.begin(); p != zOrder.end(); ++p) {             if (p-&gt;second-&gt;isBackground()) {                 background = p-&gt;second;                 break;             }         }     }     AbstractSpriteOwner::refresh(); }  void Scene::update(uint64 timestamp) {     AbstractSpriteOwner::update(timestamp); }  bool Scene::sendMessage(int id, int x, int y) {     if (AbstractSpriteOwner::sendMessage(id, x, y)) {         return true;     }     if (background != NULL) {         return background-&gt;sendMessage(id, x, y);     }     return false; } <\/code><\/pre>\n<p>  \u0412\u0441\u0435 \u0433\u043e\u0442\u043e\u0432\u043e. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u2026 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/1.bp.blogspot.com\/-oOxI7t6B1JM\/UE2i8NSTp6I\/AAAAAAAAAHA\/4lrTSp1JjaE\/s1600\/10-09-2012+12-20-35.png\" alt=\"image\"\/><\/p>\n<p>  \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c, \u043d\u0430 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0440\u0430\u0439\u043d\u0435 \u0446\u0435\u043d\u043d\u044b\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u043c \u0438 \u0432 Marmalade, \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f. \u0412\u043d\u0435\u0441\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0444\u0430\u0439\u043b \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a app.icf (\u0437\u0430\u043e\u0434\u043d\u043e \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u0430\u043b\u044c\u0431\u043e\u043c\u043d\u0443\u044e \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u044d\u043a\u0440\u0430\u043d\u0430):<\/p>\n<pre><code class=\"cpp\">[S3E] DispFixRot=FixedLandscape MemSize=70000000 MemSizeDebug=70000000 <\/code><\/pre>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u043d\u0430\u0448\u0438 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0435 \u043c\u044b\u0442\u0430\u0440\u0441\u0442\u0432\u0430 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437, \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0441\u043f\u0440\u0430\u0439\u0442, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0432\u0435\u0440\u0445 \u0444\u043e\u043d\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438.      \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\/161681\/\"> http:\/\/habrahabr.ru\/post\/161681\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t\u0412 \u044d\u0442\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0441\u0442\u0430\u0442\u0435\u0439 \u044f \u043e\u043f\u0438\u0448\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e Framework-\u0430, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f 2D-\u0438\u0433\u0440, \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"http:\/\/www.madewithmarmalade.com\/\">Marmalade<\/a>. Marmalade \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 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 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0445, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435, \u043f\u043e\u0434 Android \u0438 iOS. \u0420\u0430\u0431\u043e\u0442\u0430 \u0432 Marmalade \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u0430, \u0430 \u0435\u0433\u043e \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u043d\u043e \u0441\u0430\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u043e\u0441\u0438\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e Framework-\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0436\u0438\u0437\u043d\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0435\u043c\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443.  <\/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-161681","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/161681","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=161681"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/161681\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=161681"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=161681"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=161681"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}