{"id":165667,"date":"2013-01-13T21:21:03","date_gmt":"2013-01-13T17:21:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=165667"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=165667","title":{"rendered":"<span class=\"post_title\">\u041c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u043e\u0442\u0432\u0430\u0436\u043d\u044b\u0439 \u0430\u0440\u043a\u0430\u043d\u043e\u0438\u0434 (\u0447\u0430\u0441\u0442\u044c 1)<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u043c\u0443 \u043c\u043d\u043e\u0439 \u0440\u0430\u043d\u0435\u0435 <a href=\"http:\/\/habrahabr.ru\/post\/161681\/\">framework-\u0443<\/a> \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 \u0434\u0432\u0438\u0436\u043a\u043e\u043c. \u0412 \u043d\u0435\u043c \u043d\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0438\u0437\u0438\u043a\u0438, \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0435\u0433\u0438\u0431\u043a\u0438\u0439 \u0438 \u043d\u0435 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 Iw2D \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0438. \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0432\u0441\u0435 \u0447\u0442\u043e \u043e\u043d \u0443\u043c\u0435\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u2014 \u044d\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 2D \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432, \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u043c\u043e\u0435 \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u043c\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0430\u043c\u0438. \u0427\u0442\u043e\u0431\u044b \u043a\u0430\u043a-\u0442\u043e \u0440\u0430\u0441\u0442\u0438 \u043d\u0430\u0434 \u0441\u043e\u0431\u043e\u0439, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0441\u0432\u0430\u0438\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e, \u043d\u0435 \u0438\u043c\u0435\u044f \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0446\u0435\u043b\u0438, \u0441\u043a\u0443\u0447\u043d\u043e \u0438 \u043d\u0435\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e.<\/p>\n<p>  \u041c\u044b \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043f\u0435\u0440\u0435\u0434 \u0441\u043e\u0431\u043e\u0439 \u0446\u0435\u043b\u044c, \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0432\u0441\u0435\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u0438\u0433\u0440\u044b <a href=\"http:\/\/ru.wikipedia.org\/wiki\/Arkanoid\">Arcanoid<\/a>. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u043d\u044f\u0442\u044c <a href=\"http:\/\/habrahabr.ru\/post\/161681\/#comment_5548949\">\u0441\u043e\u0432\u0435\u0442\u0443<\/a> \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u043e\u0433\u043e <a href=\"http:\/\/habrahabr.ru\/users\/crmmaster\/\" class=\"user_link\">crmMaster<\/a> \u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e-\u0436\u0435 \u0442\u0430\u043a\u043e\u0435 IwGl \u0438 \u043a\u0430\u043a \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u041f\u0440\u0430\u0432\u0434\u0430 \u043d\u0430\u0442\u044f\u0433\u0438\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043d\u0430 \u043a\u0443\u0431 \u043c\u044b \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u043c. \u041d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043d\u0430\u0434\u043e \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e, \u0438 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u043f\u043e\u0443\u0447\u0438\u043c\u0441\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438.<br \/>  <a name=\"habracut\"><\/a><br \/>  \u0418\u0442\u0430\u043a, \u043e\u0431 Open GL \u043d\u0430\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e \u043e\u043d \u0443\u043c\u0435\u0435\u0442 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438. \u0422\u0430\u043a\u0436\u0435 \u043d\u0430\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043e\u043d \u0438\u0445 \u0443\u043c\u0435\u0435\u0442 \u0441 \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0439 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043d\u043e\u0439 \u0437\u0430\u043b\u0438\u0432\u043a\u043e\u0439, \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e. \u0423\u043c\u0435\u044f \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e.<\/p>\n<p>  \u041d\u0430\u0447\u043d\u0435\u043c, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e \u0441 mkb-\u0444\u0430\u0439\u043b\u0430:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">arcanoid.mkb<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#!\/usr\/bin\/env mkb options { } subprojects { \tiwgl }  includepath { \t.\/source\/Main \t.\/source\/Model } files { \t[Main] \t(source\/Main) \tMain.cpp \tMain.h \tQuads.cpp \tQuads.h        \tDesktop.cpp \tDesktop.h \tIO.cpp \tIO.h  \t[Model] \t(source\/Model) \tBricks.cpp \tBricks.h \tBall.cpp \tBall.h \tBoard.cpp \tBoard.h } assets { } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c, \u0447\u0442\u043e, \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0438, \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c IwGl, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u044b \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c. <\/p>\n<p>  \u041c\u043e\u0434\u0443\u043b\u044c Main, \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e, \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438 \u0434\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0432\u0441\u0435\u0445 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Main.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &quot;Main.h&quot;  #include &quot;s3e.h&quot; #include &quot;IwGL.h&quot;  #include &quot;Desktop.h&quot; #include &quot;IO.h&quot; #include &quot;Quads.h&quot; #include &quot;Board.h&quot;  Board board;  void init() {     desktop.init();     io.init();     quads.init();     board.init(); }  void release() {     io.release();     desktop.release(); }  int main() {     init(); {         while (!s3eDeviceCheckQuitRequest()) {             io.update(); \t\t    if (io.isKeyDown(s3eKeyAbsBSK) || io.isKeyDown(s3eKeyBack)) break; \t\t\tquads.update(); \t\t\tdesktop.update(); \t\t\tboard.update(); \t\t\tboard.refresh(); \t\t\tquads.refresh(); \t\t\tio.refresh(); \t\t\tdesktop.refresh();         }     }     release();     return 0; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0417\u0434\u0435\u0441\u044c \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0441\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u043c\u0430\u0440\u043c\u0435\u043b\u0430\u0434\u043d\u044b\u0439 \u043a\u043e\u0434, \u0440\u0430\u0441\u043a\u0438\u0434\u0430\u0432 \u0435\u0433\u043e \u043f\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c. \u0421\u0430\u043c\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u044c IO. \u0415\u0433\u043e \u0437\u0430\u0434\u0430\u0447\u0430, \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b. \u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u0440\u0430\u043d\u0435\u0435, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u00abBack\u00bb \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 Android.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">IO.h<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#ifndef _IO_H_ #define _IO_H_  class IO {     public:         void init() {}         void release() {}         void update();         void refresh() {} \t    bool isKeyDown(s3eKey key) const; };  extern IO io;  #endif\t\/\/ _IO_H_ <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">IO.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &quot;s3e.h&quot; #include &quot;IO.h&quot;  IO io;  void IO::update() { \ts3eKeyboardUpdate(); }  bool IO::isKeyDown(s3eKey key) const { \treturn (s3eKeyboardGetState(key) & S3E_KEY_STATE_DOWN) == S3E_KEY_STATE_DOWN; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041f\u043e\u043a\u043e\u043d\u0447\u0438\u0432 \u0441\u043e \u0441\u043a\u0443\u0447\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043c\u043e\u0434\u0443\u043b\u044e Desktop. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0440\u0438\u0441\u043e\u0432\u043a\u043e\u0439 \u043a\u0430\u0434\u0440\u043e\u0432 IwGl, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0435\u0440\u0435\u0440\u0430\u0441\u0447\u0435\u0442\u043e\u043c \u043d\u0435\u043a\u0438\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 (\u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c) \u0432 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u044d\u043a\u0440\u0430\u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. <\/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_  class Desktop {     private:         int width;         int height;         int vSize; \t\tint duration;     public:         void init();         void release();         void update();         void refresh();         int  getWidth() const {return width;}         int  getHeight() const {return height;}         void setVSize(int v) {vSize = v;}         int  toRSize(int x) const; };  extern Desktop desktop;  #endif\t\/\/ _DESKTOP_H_ <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Desktop.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &quot;IwGL.h&quot; #include &quot;s3e.h&quot;  #include &quot;Desktop.h&quot;  Desktop desktop;  void Desktop::init() {     IwGLInit();     glClearColor(0, 0, 0, 0);     width = IwGLGetInt(IW_GL_WIDTH);     height = IwGLGetInt(IW_GL_HEIGHT);     vSize = 0; \tduration = 1000 \/ 60; }  void Desktop::release() {     IwGLTerminate(); }  void Desktop::update() {     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     glMatrixMode(GL_PROJECTION);     glLoadIdentity();     glOrthof(0, (float)width, (float)height, 0, -10.0f, 10.0f);     glViewport(0, 0, width, height); }  void Desktop::refresh() {     IwGLSwapBuffers();     s3eDeviceYield(duration);    }  int Desktop::toRSize(int x) const {     if (vSize == 0) return x;     return (x * width) \/ vSize; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041d\u0430 \u043a\u043e\u0434 \u043f\u0435\u0440\u0435\u0440\u0430\u0441\u0447\u0435\u0442\u0430 \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, \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. \u041e\u043d \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043d\u0430\u043c \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f. <\/p>\n<p>  \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e \u043a\u0430\u043a \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u043a\u0430\u0434\u0440\u0430 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 update. \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0432 \u0441\u043a\u0440\u044b\u0442\u043e\u043c \u0431\u0443\u0444\u0435\u0440\u0435, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u043e\u0432 \u0432\u044b\u0437\u043e\u0432\u043e\u043c IwGLSwapBuffers. \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u044d\u043a\u0440\u0430\u043d\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043a\u0430\u043c\u0435\u0440\u044b \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f 2D \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 update (\u0441\u043a\u0430\u0436\u0443 \u0441\u0440\u0430\u0437\u0443, \u0447\u0442\u043e \u0432\u0435\u0441\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u044f \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 IwGL\/IwGLVirtualRes). \u0418\u0437 \u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u044f\u0441\u043d\u043e, \u0447\u0442\u043e \u043c\u0435\u0442\u043e\u0434 update \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u044e\u0431\u044b\u0445 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432, \u0430 refresh \u043f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438, \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u044d\u043a\u0440\u0430\u043d\u0430.<\/p>\n<p>  \u0412\u0442\u043e\u0440\u044b\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u043c, \u043f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u043c \u043c\u043d\u043e\u0439 \u0432 IwGLVirtualRes \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u043e\u0441\u043e\u0431 \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0432\u044b\u0432\u043e\u0434\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432. \u042d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u044c Quads.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Quads.h<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#ifndef _QUADS_H_ #define _QUADS_H_  #define MAX_QUADS 2000  class Quads {     private:         int16  Verts[MAX_QUADS * 4 * 2];         uint16 Inds[MAX_QUADS * 6];         uint32 Cols[MAX_QUADS * 4];         int    outQuad;     public:         void init();         void update() {outQuad = 0;}         void refresh();         int16* getQuadPoints();         uint32* getQuadCols(); };  extern Quads quads;  #endif\t\/\/ _QUADS_H_ <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Quads.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &quot;IwGL.h&quot; #include &quot;s3e.h&quot;  #include &quot;Quads.h&quot;  Quads quads;  void Quads::init() {     uint16* inds = Inds;     for (int n = 0; n &lt; MAX_QUADS; n++)     {         uint16 baseInd = n*4;         \/\/Triangle 1         *inds++ = baseInd;         *inds++ = baseInd+1;         *inds++ = baseInd+2;         \/\/Triangle 2         *inds++ = baseInd;         *inds++ = baseInd+2;         *inds++ = baseInd+3;     }     glVertexPointer(2, GL_SHORT, 0, Verts);     glEnableClientState(GL_VERTEX_ARRAY);     glColorPointer(4, GL_UNSIGNED_BYTE, 0, Cols);     glEnableClientState(GL_COLOR_ARRAY); }  void Quads::refresh() {     glDrawElements(GL_TRIANGLES, outQuad*6, GL_UNSIGNED_SHORT, Inds); }  int16* Quads::getQuadPoints() {     if (outQuad &gt;= MAX_QUADS) return NULL;     return Verts + 2 * 4 * outQuad; }  uint32* Quads::getQuadCols() {     if (outQuad &gt;= MAX_QUADS) return NULL;     return Cols + 4 * outQuad++; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041b\u044e\u0431\u043e\u0439 \u044d\u043a\u0440\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0439 \u043f\u0440\u043e\u0440\u0438\u0441\u043e\u0432\u043a\u0438, \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u0443 \u043c\u043e\u0434\u0443\u043b\u044f Quads \u043d\u0430\u0431\u043e\u0440 \u043f\u0430\u0440 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0438\u0432 \u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u041f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438, Quads \u043e\u0434\u043d\u0438\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u043c glDrawElements \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442 \u0432\u0441\u0435 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u044c Bricks \u0441\u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Bricks.h<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#ifndef _BRICKS_H_ #define _BRICKS_H_  #include &quot;IwGL.h&quot; #include &quot;s3e.h&quot; #include &quot;Desktop.h&quot;  #define BRICK_COLOR_1      0xffffff00 #define BRICK_COLOR_2      0xff50ff00 #define BRICK_HALF_WIDTH   20 #define BRICK_HALF_HEIGHT  10  #include &lt;vector&gt;  using namespace std;  class Bricks {     private:         struct SBrick {             SBrick(int x, int y): x(x),                                            y(y),                                            hw(BRICK_HALF_WIDTH),                                            hh(BRICK_HALF_HEIGHT),                                            ic(BRICK_COLOR_1),                                            oc(BRICK_COLOR_2) {} \t\t\tSBrick(const SBrick& p): x(p.x),                                            y(p.y),                                            hw(p.hw),                                            hh(p.hh),                                            ic(p.ic),                                            oc(p.oc) {}             int x, y, hw, hh, ic, oc;         };         vector&lt;SBrick&gt; bricks;     public:         Bricks(): bricks() {}         void refresh();         void clear(){bricks.clear();}         void add(SBrick& b);      typedef vector&lt;SBrick&gt;::iterator BIter; };  #endif\t\/\/ _BRICKS_H_ <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Bricks.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &quot;Bricks.h&quot; #include &quot;Quads.h&quot;  void Bricks::refresh() {     for (BIter p = bricks.begin(); p != bricks.end(); ++p) {             CIwGLPoint point(p-&gt;x, p-&gt;y);             point = IwGLTransform(point);              int16* quadPoints = quads.getQuadPoints();             uint32* quadCols = quads.getQuadCols();             if ((quadPoints == NULL) || (quadCols == NULL)) break;              *quadPoints++ = point.x - p-&gt;hw;             *quadPoints++ = point.y + p-&gt;hh;             *quadCols++   = p-&gt;ic;              *quadPoints++ = point.x + p-&gt;hw;             *quadPoints++ = point.y + p-&gt;hh;             *quadCols++   = p-&gt;oc;              *quadPoints++ = point.x + p-&gt;hw;             *quadPoints++ = point.y - p-&gt;hh;             *quadCols++   = p-&gt;ic;              *quadPoints++ = point.x - p-&gt;hw;             *quadPoints++ = point.y - p-&gt;hh;             *quadCols++   = p-&gt;oc;     } }  void Bricks::add(SBrick& b) {  \tbricks.push_back(b); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u0432\u0430 \u0446\u0432\u0435\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u0441 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043d\u043e\u0439 \u0437\u0430\u043b\u0438\u0432\u043a\u043e\u0439.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u0441 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430\u043c\u0438, \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430. \u041d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438, \u0438\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0448\u0430\u0440 (\u043d\u0443 \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u0435 \u0448\u0430\u0440, \u0430 \u043a\u0440\u0443\u0433\u043b\u044f\u0448\u043e\u043a, \u0441 \u0441\u0438\u043c\u043f\u0430\u0442\u0438\u0447\u043d\u043e\u0439 \u0433\u0440\u0430\u0434\u0438\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043b\u0438\u0432\u043a\u043e\u0439, \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0435\u0439 \u0431\u043b\u0438\u043a).<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Ball.h<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#ifndef _BALL_H_ #define _BALL_H_  #include &lt;vector&gt; #include &quot;IwGL.h&quot; #include &quot;s3e.h&quot; #include &quot;Desktop.h&quot;  #define MAX_SEGMENTS       7 #define BALL_COLOR_1       0x00000000 #define BALL_COLOR_2       0xffffffff #define BALL_RADIUS        15  using namespace std;  class Ball {     private:         struct Offset {             Offset(int dx, int dy): dx(dx), dy(dy) {}             Offset(const Offset& p): dx(p.dx), dy(p.dy) {}             int dx, dy;         };         vector&lt;Offset&gt; offsets;         int     x;         int     y;     public:         void init();         void refresh(); \t\tvirtual void setXY(int X, int Y);      typedef vector&lt;Offset&gt;::iterator OIter; };  #endif\t\/\/ _BALL_H_ <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Ball.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &quot;Ball.h&quot; #include &quot;Quads.h&quot; #include &quot;Desktop.h&quot; #include &lt;math.h&gt;  #define PI 3.14159265f  void Ball::init(){     x = desktop.getWidth() \/ 2;     y = desktop.getHeight()\/ 2;      float delta = PI \/ (float)MAX_SEGMENTS;     float angle = delta \/ 2.0f;     float r = (float)desktop.toRSize(BALL_RADIUS);     for (int i = 0; i &lt; MAX_SEGMENTS; i++) {         offsets.push_back(Offset((int16)(cos(angle) * r), (int16)(sin(angle) * r)));         angle = angle + delta;         offsets.push_back(Offset((int16)(cos(angle) * r), (int16)(sin(angle) * r)));         angle = angle + delta;         offsets.push_back(Offset((int16)(cos(angle) * r), (int16)(sin(angle) * r)));     } }  void Ball::setXY(int X, int Y) { \tx = X; \ty = Y; }  void Ball::refresh() {     CIwGLPoint point(x, y);     point = IwGLTransform(point);     OIter o = offsets.begin();     int r = desktop.toRSize(BALL_RADIUS);     for (int i = 0; i &lt; MAX_SEGMENTS; i++) {              int16* quadPoints = quads.getQuadPoints();             uint32* quadCols = quads.getQuadCols();             if ((quadPoints == NULL) || (quadCols == NULL)) break;              *quadPoints++ = point.x + (r \/ 4);             *quadPoints++ = point.y + (r \/ 4);             *quadCols++   = BALL_COLOR_2;              *quadPoints++ = point.x + o-&gt;dx;             *quadPoints++ = point.y + o-&gt;dy;             *quadCols++   = BALL_COLOR_1;             o++;              *quadPoints++ = point.x + o-&gt;dx;             *quadPoints++ = point.y + o-&gt;dy;             *quadCols++   = BALL_COLOR_1;             o++;              *quadPoints++ = point.x + o-&gt;dx;             *quadPoints++ = point.y + o-&gt;dy;             *quadCols++   = BALL_COLOR_1;             o++;     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412\u0441\u043f\u043e\u043c\u043d\u0438\u0432 \u043a\u0443\u0440\u0441 \u0448\u043a\u043e\u043b\u044c\u043d\u043e\u0439 \u0442\u0440\u0438\u0433\u043e\u043d\u043e\u043c\u0435\u0442\u0440\u0438\u0438, \u0440\u0430\u0437\u043e\u0431\u044c\u0435\u043c \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u043b\u0438\u043a, \u0441\u0434\u0432\u0438\u043d\u0435\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0432\u0441\u0435\u0445 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u043f\u0440\u0430\u0432\u043e \u0438 \u0432\u043d\u0438\u0437 \u043e\u0442 \u0446\u0435\u043d\u0442\u0440\u0430 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438. \u041d\u0443 \u0438 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0432\u0441\u0435\u0439 \u044d\u0442\u043e\u0439 \u0442\u0440\u0438\u0433\u043e\u043d\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u043a\u0435, \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u043c \u0432\u0441\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e, \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 init.<\/p>\n<p>  \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u044f Board, \u043f\u043e\u043a\u0430 \u0447\u0442\u043e, \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Board.h<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#ifndef _BOARD_H_ #define _BOARD_H_  #include &quot;Bricks.h&quot; #include &quot;Ball.h&quot;  class Board {     private:         Bricks bricks;         Ball ball;     public:         void init();         void refresh();         void update() {} };  #endif\t\/\/ _BOARD_H_ <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Board.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &quot;Board.h&quot;  void Board::init() {     \/\/ DEBUG:     SBrick b(200, 80);     bricks.add(b);     \/\/      ball.init(); }  void Board::refresh() {     bricks.refresh();     ball.refresh(); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0432\u043d\u0435\u0441\u0442\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432 app.icf:  <\/p>\n<pre><code class=\"cpp\">[S3E] SysGlesVersion=1 DispFixRot=FixedPortrait DataDirIsRAM=1 <\/code><\/pre>\n<p>  \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/4.bp.blogspot.com\/-Fv4Ky8rwOjo\/UPL4v8vkxRI\/AAAAAAAAAOY\/zcn6mA7dDOk\/s1600\/0001.PNG\" alt=\"image\"\/><\/p>\n<p>  \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f \u0438\u0437 <a href=\"http:\/\/ru.wikipedia.org\/wiki\/YAML\">YAML<\/a>-\u0444\u0430\u0439\u043b\u0430.<\/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\/165667\/\"> http:\/\/habrahabr.ru\/post\/165667\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u043c\u0443 \u043c\u043d\u043e\u0439 \u0440\u0430\u043d\u0435\u0435 <a href=\"http:\/\/habrahabr.ru\/post\/161681\/\">framework-\u0443<\/a> \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 \u0434\u0432\u0438\u0436\u043a\u043e\u043c. \u0412 \u043d\u0435\u043c \u043d\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0438\u0437\u0438\u043a\u0438, \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0435\u0433\u0438\u0431\u043a\u0438\u0439 \u0438 \u043d\u0435 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 Iw2D \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0438. \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0432\u0441\u0435 \u0447\u0442\u043e \u043e\u043d \u0443\u043c\u0435\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u2014 \u044d\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 2D \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432, \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u043c\u043e\u0435 \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u043c\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0430\u043c\u0438. \u0427\u0442\u043e\u0431\u044b \u043a\u0430\u043a-\u0442\u043e \u0440\u0430\u0441\u0442\u0438 \u043d\u0430\u0434 \u0441\u043e\u0431\u043e\u0439, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0441\u0432\u0430\u0438\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e, \u043d\u0435 \u0438\u043c\u0435\u044f \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0446\u0435\u043b\u0438, \u0441\u043a\u0443\u0447\u043d\u043e \u0438 \u043d\u0435\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e.<\/p>\n<p>  \u041c\u044b \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043f\u0435\u0440\u0435\u0434 \u0441\u043e\u0431\u043e\u0439 \u0446\u0435\u043b\u044c, \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0432\u0441\u0435\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u0438\u0433\u0440\u044b <a href=\"http:\/\/ru.wikipedia.org\/wiki\/Arkanoid\">Arcanoid<\/a>. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u043d\u044f\u0442\u044c <a href=\"http:\/\/habrahabr.ru\/post\/161681\/#comment_5548949\">\u0441\u043e\u0432\u0435\u0442\u0443<\/a> \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u043e\u0433\u043e <a href=\"http:\/\/habrahabr.ru\/users\/crmmaster\/\" class=\"user_link\">crmMaster<\/a> \u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e-\u0436\u0435 \u0442\u0430\u043a\u043e\u0435 IwGl \u0438 \u043a\u0430\u043a \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u041f\u0440\u0430\u0432\u0434\u0430 \u043d\u0430\u0442\u044f\u0433\u0438\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043d\u0430 \u043a\u0443\u0431 \u043c\u044b \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u043c. \u041d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043d\u0430\u0434\u043e \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e, \u0438 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u043f\u043e\u0443\u0447\u0438\u043c\u0441\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\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-165667","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/165667","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=165667"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/165667\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=165667"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=165667"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=165667"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}