{"id":199064,"date":"2013-10-28T18:15:03","date_gmt":"2013-10-28T14:15:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=199064"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=199064","title":{"rendered":"<span class=\"post_title\">\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u0440 \u0437\u0430 30 \u043c\u0438\u043d\u0443\u0442<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f C++, Box2D \u0438 SFML, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 2D \u043a\u0430\u0440\u0442 \u0434\u043b\u044f \u0438\u0433\u0440 <a href=\"http:\/\/habrahabr.ru\/post\/148653\/\">Tiled Map Editor<\/a><\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/601\/b21\/f51\/601b21f51d4be0d9d0f022c0d30a43ae.png\" alt=\"image\"\/><\/p>\n<p>  \u0412\u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 (\u043a\u0430\u0440\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0430\u0441\u044c 5 \u043c\u0438\u043d\u0443\u0442 + \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u044c\u0435\u043c\u043a\u0438 \u0438\u0433\u0440\u0430 \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u043b\u0430 + \u044d\u043a\u0440\u0430\u043d \u043d\u0435 \u0442\u0430\u043a \u0440\u0430\u0441\u0442\u044f\u043d\u0443\u0442 \u2014 \u0434\u0435\u0444\u0435\u043a\u0442 Bandicam \ud83d\ude42 )<br \/>  <iframe loading=\"lazy\" width=\"560\" height=\"349\" src=\"\/\/www.youtube.com\/embed\/0NUAUMjQigI?wmode=opaque\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n<p>  \u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0438 exe \u2014 \u0432\u043d\u0438\u0437\u0443 \u0441\u0442\u0430\u0442\u044c\u0438<\/p>\n<p>  <a name=\"habracut\"><\/a>  <\/p>\n<h4>\u0427\u0442\u043e, \u0433\u0434\u0435, \u043a\u043e\u0433\u0434\u0430?<\/h4>\n<h5>Box2D<\/h5>\n<p>  \u042d\u0442\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u0444\u0438\u0437\u0438\u043a\u0438 \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u0440\u0435 (\u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u0441 \u0431\u043b\u043e\u043a\u0430\u043c\u0438, \u0433\u0440\u0430\u0432\u0438\u0442\u0430\u0446\u0438\u044f). \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0435 \u0441\u0442\u043e\u0438\u043b\u043e \u0434\u043b\u044f \u043e\u0434\u043d\u0438\u0445 \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u043b\u043e\u043a\u043e\u0432 \u044e\u0437\u0430\u0442\u044c \u044d\u0442\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u043d\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0436\u0438\u0442\u044c \u043d\u0435 \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u0448\u044c \ud83d\ude09<br \/>  \u041f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e Box2D? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0430\u043c\u0430\u044f \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u0430\u044f \u0438 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0430\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430<\/p>\n<h5>SFML<\/h5>\n<p>  \u041f\u043e\u0447\u0435\u043c\u0443 SFML? \u0412\u043d\u0430\u0447\u0430\u043b\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 SDL, \u043d\u043e \u043e\u043d\u0430 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430 \u0432 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u0445 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 SFML, \u043c\u043d\u043e\u0433\u043e\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u043c\u0443. \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0430\u0432\u0442\u043e\u0440\u0443 SFML \u0437\u0430 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u043b\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f!<br \/>  \u0415\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0433\u0440\u0430\u0444\u0438\u043a\u0438<\/p>\n<h5>Tiled Map Editor<\/h5>\n<p>  \u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u0443\u0442 Tiled Map Editor?<br \/>  \u0412\u044b \u043a\u043e\u0433\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u044b \u0434\u043b\u044f \u0438\u0433\u0440? \u0421\u043f\u043e\u0440\u0438\u043c, \u0447\u0442\u043e \u0432\u0430\u0448\u0435\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u043e\u0439 \u0431\u044b\u043b\u043e \u0447\u0442\u043e-\u0442\u043e \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 \u0442\u0430\u043a\u043e\u0433\u043e.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"bash\">1111111 1000001 1001001 1000011 1000111 1111111 <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u042d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435! \u0413\u043e\u0440\u0430\u0437\u0434\u043e \u043b\u0443\u0447\u0448\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u043a\u0430\u0440\u0442, \u043d\u043e \u0437\u0430\u0434\u043d\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u043c\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0437\u0430 5 \u043c\u0438\u043d\u0443\u0442, \u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u0430\u044f \u0432\u044b\u0448\u0435 \u00ab\u043a\u0430\u0440\u0442\u0430\u00bb \u2014 \u0432\u043f\u043e\u043b\u043d\u0435.<\/p>\n<p>  Tiled Map Editor \u2014 \u043e\u0434\u0438\u043d \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u043a\u0430\u0440\u0442. \u041e\u043d \u0445\u043e\u0440\u043e\u0448 \u0442\u0435\u043c, \u0447\u0442\u043e \u043a\u0430\u0440\u0442\u0443, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u0432 \u044d\u0442\u043e\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 (\u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0442\u0430\u0439\u043b\u043e\u0432, \u0438\u0445 \u0441\u043b\u043e\u0435\u0432) \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 XML-\u043f\u043e\u0434\u043e\u0431\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 .tmx \u0438 \u043f\u043e\u0442\u043e\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430 C++ \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0435\u0435. \u041d\u043e \u043e\u0431\u043e \u0432\u0441\u0435\u043c \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443.<\/p>\n<h4>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b<\/h4>\n<p>  \u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c TME \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e <a href=\"http:\/\/www.mapeditor.org\/\">\u0441\u0430\u0439\u0442\u0430<\/a><br \/>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u043a\u0430\u0440\u0442\u0443 \u00ab\u0424\u0430\u0439\u043b-&gt;\u0421\u043e\u0437\u0434\u0430\u0442\u044c&#8230;\u00bb<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/dab\/377\/6e7\/dab3776e7a9c854bff8a878991fff56a.png\" alt=\"image\"\/><\/p>\n<p>  \u041e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043e\u0440\u0442\u043e\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 (\u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u0438\u0437\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u0440 \ud83d\ude42 ), \u0430 \u0444\u043e\u0440\u043c\u0430\u0442 \u0441\u043b\u043e\u044f XML, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 \u0444\u043e\u0440\u043c\u0430\u0442<br \/>  \u041a\u0441\u0442\u0430\u0442\u0438, \u043d\u0438 \u0444\u043e\u0440\u043c\u0430\u0442 \u0441\u043b\u043e\u044f, \u043d\u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0430\u0439\u043b\u043e\u0432 \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0435<\/p>\n<h5>\u0422\u0430\u0439\u043b\u044b<\/h5>\n<p>  \u0417\u0430\u0442\u0435\u043c \u0438\u0434\u0435\u043c \u0432 \u00ab\u041a\u0430\u0440\u0442\u0430-&gt;\u041d\u043e\u0432\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0442\u0430\u0439\u043b\u043e\u0432&#8230;\u00bb, \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043d\u0430\u0448 \u0442\u0430\u0439\u043b\u0441\u0435\u0442<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/3bf\/459\/069\/3bf4590693648204410863d265811961.png\" alt=\"image\"\/><\/p>\n<p>  \u0412 \u0438\u0442\u043e\u0433\u0435 \u0443 \u0432\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u0433\u043e<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/e91\/926\/20c\/e9192620c22ea1b81890d5b07beb7ba9.png\" alt=\"image\"\/><\/p>\n<p>  \u0412 \u0447\u0435\u043c \u0441\u043c\u044b\u0441\u043b \u0441\u043b\u043e\u0435\u0432 \u0442\u0430\u0439\u043b\u043e\u0432?<br \/>  \u041f\u043e\u0447\u0442\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0433\u0440\u0435 \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0439\u043d\u044b\u0435 \u043a\u0430\u0440\u0442\u044b. \u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u043b\u043e\u0439 \u2014 \u0437\u0435\u043c\u043b\u044f (\u043b\u0435\u0434, \u0447\u0435\u0440\u043d\u043e\u0437\u0435\u043c, etc), \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u043b\u043e\u0439 \u2014 \u0437\u0434\u0430\u043d\u0438\u044f (\u043a\u0430\u0437\u0430\u0440\u043c\u044b, \u0444\u043e\u0440\u0442, etc, \u043f\u0440\u0438\u0447\u0435\u043c \u0444\u043e\u043d \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u0435\u043d), \u0442\u0440\u0435\u0442\u0438\u0439 \u2014 \u0434\u0435\u0440\u0435\u0432\u044c\u044f (\u0435\u043b\u044c, \u043f\u0438\u0445\u0442\u0430, etc, \u0444\u043e\u043d \u0442\u043e\u0436\u0435 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u0435\u043d). \u0422\u043e \u0435\u0441\u0442\u044c \u0440\u0438\u0441\u0443\u0435\u0442\u0441\u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u043b\u043e\u0439, \u043f\u043e\u0432\u0435\u0440\u0445 \u043d\u0435\u0433\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u043b\u043e\u0439, \u0430 \u043f\u043e\u0442\u043e\u043c \u0443\u0436\u0435 \u0442\u0440\u0435\u0442\u0438\u0439.<\/p>\n<p>  \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043b\u043e\u0435\u0432 \u0437\u0430\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 4 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0430\u0445<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/538\/068\/9c4\/5380689c446222a47247643a8eb84ac9.png\" alt=\"image\"\/><br \/>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/434\/709\/919\/4347099196bdc1027eac74c06c448146.png\" alt=\"image\"\/><br \/>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/9b5\/6e1\/24f\/9b56e124fe8ec32ecb9b5eb12f1e8e3e.png\" alt=\"image\"\/><\/p>\n<p>  \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043b\u043e\u0435\u0432<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/dad\/944\/7cf\/dad9447cfadacdc58f961053156fb844.png\" alt=\"image\"\/><\/p>\n<h5>\u041e\u0431\u044a\u0435\u043a\u0442\u044b<\/h5>\n<p>  \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 TME?<br \/>  \u041e\u0431\u044a\u0435\u043a\u0442 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0435 \u0438\u043c\u044f, \u0442\u0438\u043f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438.<br \/>  \u0417\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u044d\u0442\u0430 \u043f\u0430\u043d\u0435\u043b\u044c<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/8e3\/3ea\/7a0\/8e33ea7a0a01a43830698c18a4d30efe.png\" alt=\"image\"\/><\/p>\n<p>  \u0412\u044b \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043a\u043d\u043e\u043f\u043e\u043a, \u0441\u0430\u043c\u0438.<br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442.<br \/>  \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0441\u043b\u043e\u0439 \u00ab\u041a\u043e\u043b\u043e\u0431\u043e\u0448\u0430\u00bb, \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u043b\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0441 \u0442\u0435\u043c \u0436\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u00ab\u041a\u043e\u043b\u043e\u0431\u043e\u0448\u0430\u00bb. \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u00ab\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u0439\u043b-\u043e\u0431\u044a\u0435\u043a\u0442\u00bb \u0438\u0437 \u043f\u0430\u043d\u0435\u043b\u0438 \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (\u0438\u043b\u0438 \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u0444\u0438\u0433\u0443\u0440\u0443 \u2014 Shape), \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 \u0442\u0430\u0439\u043b \u041a\u043e\u043b\u043e\u0431\u043e\u0448\u0438 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0430\u0432\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u043a\u0430\u043a\u043e\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u043c\u0435\u0441\u0442\u043e.<br \/>  \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u043c\u044b\u0448\u0438 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 \u00ab\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430&#8230;\u00bb. \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u0438\u043c\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043d\u0430 Kolobosha.<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0435 \u043a\u0430\u0440\u0442\u0443.<\/p>\n<p>  \u0412 \u043e\u0431\u0449\u0435\u043c, \u043d\u0438\u0447\u0435\u0433\u043e \u0430\u0440\u0445\u0438\u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430\u0445 \u043a\u0430\u0440\u0442 \u043d\u0435\u0442\u0443. \u041f\u043e\u0440\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044e \u043a\u0430\u0440\u0442\u044b.<\/p>\n<h4>\u0421\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b<\/h4>\n<p>  \u0414\u043b\u044f \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f XML \u0444\u0430\u0439\u043b\u043e\u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <a href=\"http:\/\/www.grinninglizard.com\/tinyxml\/\">TinyXML<\/a>, \u0441\u043a\u0430\u0447\u0430\u0439\u0442\u0435 \u0435\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438.<\/p>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0435\u043a\u0442 Visual Studio. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0444\u0430\u0439\u043b\u044b TinyXML (\u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u0438\u0445\u0430\u0439\u0442\u0435 \u0432\u0441\u0435 \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u0432 \u043f\u0440\u043e\u0435\u043a\u0442, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c xmltest.cpp \ud83d\ude42 )<br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c includ&#8217;\u044b \u0438 lib&#8217;\u044b SFML \u0432 \u00ab\u041f\u0440\u043e\u0435\u043a\u0442-&gt;\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u00bb. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442\u0435, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u2014 \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u0413\u0443\u0433\u043b<\/p>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c Level.h \u0434\u043b\u044f \u043a\u0430\u0440\u0442<\/p>\n<pre><code class=\"cpp\">#ifndef LEVEL_H #define LEVEL_H  #pragma comment(lib,&quot;Box2D.lib&quot;) #pragma comment(lib,&quot;sfml-graphics.lib&quot;) #pragma comment(lib,&quot;sfml-window.lib&quot;) #pragma comment(lib,&quot;sfml-system.lib&quot;)  #include &lt;string&gt; #include &lt;vector&gt; #include &lt;map&gt; #include &lt;SFML\/Graphics.hpp&gt; <\/code><\/pre>\n<p>  \u042d\u0442\u043e \u043d\u0430\u0447\u0430\u043b\u043e \u0444\u0430\u0439\u043b\u0430.<\/p>\n<p>  \u0414\u0430\u043b\u044c\u0448\u0435 \u0438\u0434\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430  <\/p>\n<pre><code class=\"cpp\">struct Object {     int GetPropertyInt(std::string name);     float GetPropertyFloat(std::string name);     std::string GetPropertyString(std::string name);      std::string name;     std::string type;     sf::Rect&lt;int&gt; rect;     std::map&lt;std::string, std::string&gt; properties;  \tsf::Sprite sprite; }; <\/code><\/pre>\n<p>  \u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0435\u0451.<br \/>  \u041a\u0430\u043a \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c, \u0432 TME \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0438\u0437 XML \u0444\u0430\u0439\u043b\u0430, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 properties, \u0438 \u043f\u043e\u0442\u043e\u043c \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u0442\u0440\u0435\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. name \u2014 \u0438\u043c\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430, type \u2014 \u0435\u0433\u043e \u0442\u0438\u043f, rect \u2014 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442. \u0418 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, sprite \u2014 \u0441\u043f\u0440\u0430\u0439\u0442 (\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435) \u2014 \u0447\u0430\u0441\u0442\u044c \u0442\u0430\u0439\u043b\u0441\u0435\u0442\u0430, \u0432\u0437\u044f\u0442\u0430\u044f \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u0421\u043f\u0440\u0430\u0439\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435 \u0431\u044b\u0442\u044c.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0438\u0434\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u043b\u043e\u044f \u2014 \u043e\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430  <\/p>\n<pre><code class=\"cpp\">struct Layer {     int opacity;     std::vector&lt;sf::Sprite&gt; tiles; }; <\/code><\/pre>\n<p>  \u0412 \u0441\u043b\u043e\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c (\u0434\u0430, \u0434\u0430, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0435 \u0441\u043b\u043e\u0438!) \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 \u0442\u0430\u0439\u043b\u043e\u0432.<\/p>\n<p>  \u0414\u0430\u043b\u044c\u0448\u0435 \u0438\u0434\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 Level  <\/p>\n<pre><code class=\"cpp\">class Level { public:     bool LoadFromFile(std::string filename);     Object GetObject(std::string name);     std::vector&lt;Object&gt; GetObjects(std::string name);     void Draw(sf::RenderWindow &window); \tsf::Vector2i GetTileSize();  private:     int width, height, tileWidth, tileHeight;     int firstTileID;     sf::Rect&lt;float&gt; drawingBounds;     sf::Texture tilesetImage;     std::vector&lt;Object&gt; objects;     std::vector&lt;Layer&gt; layers; };  #endif <\/code><\/pre>\n<p>  <b>LoadFromFile<\/b> \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043a\u0430\u0440\u0442\u0443 \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430. \u042d\u0442\u043e \u0441\u0435\u0440\u0434\u0446\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 Level<br \/>  <b>GetObject<\/b> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c, <b>GetObjects<\/b> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c. \u0412\u043e\u043e\u0431\u0449\u0435-\u0442\u043e, \u043f\u043e-\u0445\u043e\u0440\u043e\u0448\u0435\u043c\u0443, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f (type) \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043d\u043e \u043c\u043d\u0435 \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0432\u044b\u043b\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438 \u0438 \u0438\u0433\u0440\u043e\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 \u0438\u043c\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0438\u043c\u044f \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0432\u0435\u0440\u0445\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0430 \u0442\u0438\u043f \u2014 \u043d\u0435\u0442<br \/>  <b>Draw<\/b> \u0440\u0438\u0441\u0443\u0435\u0442 \u0432\u0441\u0435 \u0442\u0430\u0439\u043b\u044b (\u043d\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b!), \u0431\u0435\u0440\u044f \u0441\u0435\u0431\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 RenderWindow<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0435\u043c Level.cpp<\/p>\n<pre><code class=\"cpp\">#include &quot;level.h&quot;  #include &lt;iostream&gt; #include &quot;tinyxml.h&quot; <\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0432\u044b\u043c \u043c\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432  <\/p>\n<pre><code class=\"cpp\">int Object::GetPropertyInt(std::string name) {     return atoi(properties[name].c_str()); }  float Object::GetPropertyFloat(std::string name) {     return strtod(properties[name].c_str(), NULL); }  std::string Object::GetPropertyString(std::string name) {     return properties[name]; } <\/code><\/pre>\n<p>  \u0414\u043b\u044f Layer \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0435 \u043d\u0443\u0436\u043d\u0430, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a Level  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">bool Level::LoadFromFile(std::string filename)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">bool Level::LoadFromFile(std::string filename) {     TiXmlDocument levelFile(filename.c_str());  \t\/\/ \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c XML-\u043a\u0430\u0440\u0442\u0443     if(!levelFile.LoadFile())     {         std::cout &lt;&lt; &quot;Loading level \\&quot;&quot; &lt;&lt; filename &lt;&lt; &quot;\\&quot; failed.&quot; &lt;&lt; std::endl;         return false;     }  \t\/\/ \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c map     TiXmlElement *map;     map = levelFile.FirstChildElement(&quot;map&quot;);  \t\/\/ \u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u0430\u0440\u0442\u044b: &lt;map version=&quot;1.0&quot; orientation=&quot;orthogonal&quot; \t\/\/ width=&quot;10&quot; height=&quot;10&quot; tilewidth=&quot;34&quot; tileheight=&quot;34&quot;&gt;     width = atoi(map-&gt;Attribute(&quot;width&quot;));     height = atoi(map-&gt;Attribute(&quot;height&quot;));     tileWidth = atoi(map-&gt;Attribute(&quot;tilewidth&quot;));     tileHeight = atoi(map-&gt;Attribute(&quot;tileheight&quot;));  \t\/\/ \u0411\u0435\u0440\u0435\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0430\u0439\u043b\u0441\u0435\u0442\u0430 \u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0442\u0430\u0439\u043b\u0430     TiXmlElement *tilesetElement;     tilesetElement = map-&gt;FirstChildElement(&quot;tileset&quot;);     firstTileID = atoi(tilesetElement-&gt;Attribute(&quot;firstgid&quot;));  \t\/\/ source - \u043f\u0443\u0442\u044c \u0434\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 image     TiXmlElement *image;     image = tilesetElement-&gt;FirstChildElement(&quot;image&quot;);     std::string imagepath = image-&gt;Attribute(&quot;source&quot;);  \t\/\/ \u041f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0442\u0430\u0439\u043b\u0441\u0435\u0442 \tsf::Image img;      if(!img.loadFromFile(imagepath))     {         std::cout &lt;&lt; &quot;Failed to load tile sheet.&quot; &lt;&lt; std::endl;         return false;     }  \t\/\/ \u041e\u0447\u0438\u0449\u0430\u0435\u043c \u043a\u0430\u0440\u0442\u0443 \u043e\u0442 \u0441\u0432\u0435\u0442\u0430 (109, 159, 185) \t\/\/ \u0412\u043e\u043e\u0431\u0449\u0435-\u0442\u043e \u0432 \u0442\u0430\u0439\u043b\u0441\u0435\u0442\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0444\u043e\u043d \u043b\u044e\u0431\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430, \u043d\u043e \u044f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043a\u0430\u043a 16-\u0440\u0438\u0447\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \t\/\/ \u0432\u0440\u043e\u0434\u0435 &quot;6d9fb9&quot; \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0446\u0432\u0435\u0442     img.createMaskFromColor(sf::Color(109, 159, 185)); \t\/\/ \u0413\u0440\u0443\u0437\u0438\u043c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u0438\u0437 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \ttilesetImage.loadFromImage(img); \t\/\/ \u0420\u0430\u0441\u043f\u043b\u044b\u0432\u0447\u0430\u0442\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u0430     tilesetImage.setSmooth(false);  \t\/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0438 \u0441\u0442\u0440\u043e\u043a \u0442\u0430\u0439\u043b\u0441\u0435\u0442\u0430 \tint columns = tilesetImage.getSize().x \/ tileWidth;     int rows = tilesetImage.getSize().y \/ tileHeight;  \t\/\/ \u0412\u0435\u043a\u0442\u043e\u0440 \u0438\u0437 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 (TextureRect)     std::vector&lt;sf::Rect&lt;int&gt;&gt; subRects;  \tfor(int y = 0; y &lt; rows; y++) \tfor(int x = 0; x &lt; columns; x++) \t{ \t\tsf::Rect&lt;int&gt; rect;  \t\trect.top = y * tileHeight; \t\trect.height = tileHeight; \t\trect.left = x * tileWidth; \t\trect.width = tileWidth;  \t\tsubRects.push_back(rect); \t}  \t\/\/ \u0420\u0430\u0431\u043e\u0442\u0430 \u0441\u043e \u0441\u043b\u043e\u044f\u043c\u0438     TiXmlElement *layerElement;     layerElement = map-&gt;FirstChildElement(&quot;layer&quot;);     while(layerElement)     {         Layer layer; \t\t \t\t\/\/ \u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 opacity, \u0442\u043e \u0437\u0430\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c \u0441\u043b\u043e\u044f, \u0438\u043d\u0430\u0447\u0435 \u043e\u043d \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u0435\u043d         if (layerElement-&gt;Attribute(&quot;opacity&quot;) != NULL)         {             float opacity = strtod(layerElement-&gt;Attribute(&quot;opacity&quot;), NULL);             layer.opacity = 255 * opacity;         }         else         {             layer.opacity = 255;         }  \t\t\/\/ \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 &lt;data&gt;         TiXmlElement *layerDataElement;         layerDataElement = layerElement-&gt;FirstChildElement(&quot;data&quot;);          if(layerDataElement == NULL)         {             std::cout &lt;&lt; &quot;Bad map. No layer information found.&quot; &lt;&lt; std::endl;         }  \t\t\/\/ \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 &lt;tile&gt; - \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0430\u0439\u043b\u043e\u0432 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043b\u043e\u044f         TiXmlElement *tileElement;         tileElement = layerDataElement-&gt;FirstChildElement(&quot;tile&quot;);          if(tileElement == NULL)         {             std::cout &lt;&lt; &quot;Bad map. No tile information found.&quot; &lt;&lt; std::endl;             return false;         }          int x = 0;         int y = 0;          while(tileElement)         {             int tileGID = atoi(tileElement-&gt;Attribute(&quot;gid&quot;));             int subRectToUse = tileGID - firstTileID;  \t\t\t\/\/ \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c TextureRect \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0430\u0439\u043b\u0430             if (subRectToUse &gt;= 0)             {                 sf::Sprite sprite;                 sprite.setTexture(tilesetImage); \t\t\t\tsprite.setTextureRect(subRects[subRectToUse]);                 sprite.setPosition(x * tileWidth, y * tileHeight);                 sprite.setColor(sf::Color(255, 255, 255, layer.opacity));                  layer.tiles.push_back(sprite);             }              tileElement = tileElement-&gt;NextSiblingElement(&quot;tile&quot;);              x++;             if (x &gt;= width)             {                 x = 0;                 y++;                 if(y &gt;= height)                     y = 0;             }         }          layers.push_back(layer);          layerElement = layerElement-&gt;NextSiblingElement(&quot;layer&quot;);     }      \/\/ \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438     TiXmlElement *objectGroupElement;  \t\/\/ \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0441\u043b\u043e\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432     if (map-&gt;FirstChildElement(&quot;objectgroup&quot;) != NULL)     {         objectGroupElement = map-&gt;FirstChildElement(&quot;objectgroup&quot;);         while (objectGroupElement)         { \t\t\t\/\/ \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 &lt;object&gt;             TiXmlElement *objectElement;             objectElement = objectGroupElement-&gt;FirstChildElement(&quot;object&quot;);             \t\t\twhile(objectElement)             { \t\t\t\t\/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 - \u0442\u0438\u043f, \u0438\u043c\u044f, \u043f\u043e\u0437\u0438\u0446\u0438\u044f, etc                 std::string objectType;                 if (objectElement-&gt;Attribute(&quot;type&quot;) != NULL)                 {                     objectType = objectElement-&gt;Attribute(&quot;type&quot;);                 }                 std::string objectName;                 if (objectElement-&gt;Attribute(&quot;name&quot;) != NULL)                 {                     objectName = objectElement-&gt;Attribute(&quot;name&quot;);                 }                 int x = atoi(objectElement-&gt;Attribute(&quot;x&quot;));                 int y = atoi(objectElement-&gt;Attribute(&quot;y&quot;));  \t\t\t\tint width, height;  \t\t\t\tsf::Sprite sprite;                 sprite.setTexture(tilesetImage); \t\t\t\tsprite.setTextureRect(sf::Rect&lt;int&gt;(0,0,0,0));                 sprite.setPosition(x, y);  \t\t\t\tif (objectElement-&gt;Attribute(&quot;width&quot;) != NULL) \t\t\t\t{ \t\t\t\t\twidth = atoi(objectElement-&gt;Attribute(&quot;width&quot;)); \t\t\t\t\theight = atoi(objectElement-&gt;Attribute(&quot;height&quot;)); \t\t\t\t} \t\t\t\telse \t\t\t\t{ \t\t\t\t\twidth = subRects[atoi(objectElement-&gt;Attribute(&quot;gid&quot;)) - firstTileID].width; \t\t\t\t\theight = subRects[atoi(objectElement-&gt;Attribute(&quot;gid&quot;)) - firstTileID].height; \t\t\t\t\tsprite.setTextureRect(subRects[atoi(objectElement-&gt;Attribute(&quot;gid&quot;)) - firstTileID]); \t\t\t\t}  \t\t\t\t\/\/ \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430                 Object object;                 object.name = objectName;                 object.type = objectType; \t\t\t\tobject.sprite = sprite;                  sf::Rect &lt;int&gt; objectRect;                 objectRect.top = y;                 objectRect.left = x; \t\t\t\tobjectRect.height = height; \t\t\t\tobjectRect.width = width;                 object.rect = objectRect;  \t\t\t\t\/\/ &quot;\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435&quot; \u043e\u0431\u044a\u0435\u043a\u0442\u0430                 TiXmlElement *properties;                 properties = objectElement-&gt;FirstChildElement(&quot;properties&quot;);                 if (properties != NULL)                 {                     TiXmlElement *prop;                     prop = properties-&gt;FirstChildElement(&quot;property&quot;);                     if (prop != NULL)                     {                         while(prop)                         {                             std::string propertyName = prop-&gt;Attribute(&quot;name&quot;);                             std::string propertyValue = prop-&gt;Attribute(&quot;value&quot;);                              object.properties[propertyName] = propertyValue;                              prop = prop-&gt;NextSiblingElement(&quot;property&quot;);                         }                     }                 }  \t\t\t\t\/\/ \u041f\u0438\u0445\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u0432\u0435\u043a\u0442\u043e\u0440                 objects.push_back(object);                  objectElement = objectElement-&gt;NextSiblingElement(&quot;object&quot;);             }             objectGroupElement = objectGroupElement-&gt;NextSiblingElement(&quot;objectgroup&quot;);         }     }     else     {         std::cout &lt;&lt; &quot;No object layers found...&quot; &lt;&lt; std::endl;     }      return true; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Level  <\/p>\n<pre><code class=\"cpp\">Object Level::GetObject(std::string name) { \t\/\/ \u0422\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c     for (int i = 0; i &lt; objects.size(); i++)         if (objects[i].name == name)             return objects[i]; }  std::vector&lt;Object&gt; Level::GetObjects(std::string name) { \t\/\/ \u0412\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c \tstd::vector&lt;Object&gt; vec;     for(int i = 0; i &lt; objects.size(); i++)         if(objects[i].name == name) \t\t\tvec.push_back(objects[i]);  \treturn vec; }  sf::Vector2i Level::GetTileSize() { \treturn sf::Vector2i(tileWidth, tileHeight); }  void Level::Draw(sf::RenderWindow &window) { \t\/\/ \u0420\u0438\u0441\u0443\u0435\u043c \u0432\u0441\u0435 \u0442\u0430\u0439\u043b\u044b (\u043e\u0431\u044a\u0435\u043a\u0442\u044b \u041d\u0415 \u0440\u0438\u0441\u0443\u0435\u043c!) \tfor(int layer = 0; layer &lt; layers.size(); layer++) \t\tfor(int tile = 0; tile &lt; layers[layer].tiles.size(); tile++) \t\t\twindow.draw(layers[layer].tiles[tile]); } <\/code><\/pre>\n<p>  \u0421 Level.h \u043e\u043a\u043e\u043d\u0447\u0435\u043d\u043e!<\/p>\n<p>  \u041f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e.<br \/>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c main.cpp \u0438 \u043f\u0438\u0448\u0435\u043c  <\/p>\n<pre><code class=\"cpp\">#include &quot;level.h&quot;  int main() { \tLevel level; \tlevel.LoadFromFile(&quot;test.tmx&quot;);  \tsf::RenderWindow window; \twindow.create(sf::VideoMode(800, 600), &quot;Level.h test&quot;);      while(window.isOpen())     {         sf::Event event;          while(window.pollEvent(event))         {             if(event.type == sf::Event::Closed)                 window.close();         }          window.clear(); \t\tlevel.Draw(window);         window.display();     }      return 0; } <\/code><\/pre>\n<p>  \u041a\u0430\u0440\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043a\u0430\u043a \u0443\u0433\u043e\u0434\u043d\u043e!<\/p>\n<p>  \u041c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/s6.hostingkartinok.com\/uploads\/images\/2013\/10\/e99cc289b5fb814eb7c509ed69cef81c.png\" alt=\"image\"\/><\/p>\n<p>  main.cpp  <\/p>\n<pre><code class=\"cpp\">#include &quot;level.h&quot; #include &lt;iostream&gt;  int main() { \tLevel level; \tlevel.LoadFromFile(&quot;test.tmx&quot;);  \tObject kolobosha = level.GetObject(&quot;Kolobosha&quot;); \tstd::cout &lt;&lt; kolobosha.name &lt;&lt; std::endl; \tstd::cout &lt;&lt; kolobosha.type &lt;&lt; std::endl; \tstd::cout &lt;&lt; kolobosha.GetPropertyInt(&quot;health&quot;) &lt;&lt; std::endl; \tstd::cout &lt;&lt; kolobosha.GetPropertyString(&quot;mood&quot;) &lt;&lt; std::endl;  \tsf::RenderWindow window; \twindow.create(sf::VideoMode(800, 600), &quot;Kolobosha adventures&quot;);      while(window.isOpen())     {         sf::Event event;          while(window.pollEvent(event))         {             if(event.type == sf::Event::Closed)                 window.close();         }          window.clear(); \t\tlevel.Draw(window);         window.display();     }      return 0; } <\/code><\/pre>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<br \/>  <img decoding=\"async\" src=\"http:\/\/s3.hostingkartinok.com\/uploads\/images\/2013\/10\/65774b5a0cc0887d293dd29f9eea7677.png\" alt=\"image\"\/><\/p>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u043d\u0430\u0438\u0433\u0440\u0430\u0435\u0442\u0435\u0441\u044c \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438, \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u0442 \u043f\u043e\u0440\u0430 Box2D<\/p>\n<h4>\u041a\u043e\u0440\u043e\u0431\u043a\u0438-\u043a\u043e\u0440\u043e\u0431\u043e\u0447\u043a\u0438<\/h4>\n<p>  \u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c <s>3D-\u044d\u043a\u0448\u043e\u043d<\/s> \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u0440, \u0441\u0443\u0442\u044c \u0442\u0430\u043a\u043e\u0432\u0430\u2026<br \/>  \u041d\u0430 \u043a\u0430\u0440\u0442\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u2014 \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c\u0438 player \u2014 \u0438\u0433\u0440\u043e\u043a, enemy \u2014 \u0432\u0440\u0430\u0433, block \u2014 \u0431\u043b\u043e\u043a, money \u2014 \u043c\u043e\u043d\u0435\u0442\u043a\u0438.<br \/>  \u041c\u044b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0438\u0433\u0440\u043e\u043a\u0430, \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u043f\u043e\u0432\u0438\u043d\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0436\u0430\u0442\u0438\u044f\u043c \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u0438 \u0441\u0438\u043b\u0435 \u041d\u044c\u044e\u0442\u043e\u043d\u0430.<br \/>  \u0412\u0440\u0430\u0433\u0438 \u0445\u043e\u0434\u044f\u0442 \u0442\u0443\u0434\u0430-\u0441\u044e\u0434\u0430, \u043e\u0442\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043b\u0438\u0437\u043a\u043e \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e\u0441\u044f \u0438\u0433\u0440\u043e\u043a\u0430 \u0438 \u043f\u043e\u0433\u0438\u0431\u0430\u044e\u0442, \u0435\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a \u043f\u0440\u044b\u0433\u0430\u0435\u0442 \u043d\u0430 \u043d\u0438\u0445<br \/>  \u0411\u043b\u043e\u043a\u0438 \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u044f\u044e\u0442\u0441\u044f \u00ab\u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0435\u00bb \u043a\u0430\u043a \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043d\u0430 \u043d\u0438\u0445 \u0438\u0433\u0440\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u044b\u0433\u0430\u0442\u044c<br \/>  \u041c\u043e\u043d\u0435\u0442\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0430\u044e\u0442, \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u0447\u0435\u0437\u0430\u044e\u0442 \u043f\u0440\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u0441 \u0438\u0433\u0440\u043e\u043a\u043e\u043c<\/p>\n<p>  \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c main.h, \u0441\u0442\u0438\u0440\u0430\u0435\u043c \u0442\u043e, \u0447\u0442\u043e \u0442\u0430\u043c \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e, \u0438 \u043f\u0438\u0448\u0435\u043c  <\/p>\n<pre><code class=\"cpp\">#include &quot;level.h&quot; #include &lt;Box2D\\Box2D.h&gt;  #include &lt;iostream&gt; #include &lt;random&gt;  Object player; b2Body* playerBody;  std::vector&lt;Object&gt; coin; std::vector&lt;b2Body*&gt; coinBody;  std::vector&lt;Object&gt; enemy; std::vector&lt;b2Body*&gt; enemyBody; <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0443 \u043d\u0430\u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b level.h \u0438 Box2D.h. iostream \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c, random \u2014 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0432\u0440\u0430\u0433\u0430.<br \/>  \u0414\u0430\u043b\u0435\u0435 \u0438\u0434\u0443\u0442 \u0438\u0433\u0440\u043e\u043a \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u044b, \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0432\u0440\u0430\u0433\u0443, \u043c\u043e\u043d\u0435\u0442\u043a\u0435, \u0438\u0433\u0440\u043e\u043a\u0443 \u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0439 Object \u0438 b2Body (\u0442\u0435\u043b\u043e \u0432 Box2D)<br \/>  \u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u2014 \u0431\u043b\u043e\u043a\u0430\u043c \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u0441 \u0438\u0433\u0440\u043e\u043a\u043e\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0444\u0438\u0437\u0438\u043a\u0438 Box2D, \u0430 \u043d\u0435 \u0432 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0435<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435:  <\/p>\n<pre><code class=\"cpp\">int main() { \tsrand(time(NULL));  \tLevel lvl; \tlvl.LoadFromFile(&quot;platformer.tmx&quot;);       b2Vec2 gravity(0.0f, 1.0f);     b2World world(gravity);  \tsf::Vector2i tileSize = lvl.GetTileSize(); <\/code><\/pre>\n<p>  srand(time(NULL)) \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0440\u0430\u043d\u0434\u043e\u043c\u0430.<br \/>  \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043a\u0430\u0440\u0442\u0443, \u0441\u043e\u0437\u0434\u0430\u0435\u043c b2World, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0435\u0439 \u0433\u0440\u0430\u0432\u0438\u0442\u0430\u0446\u0438\u044e. \u041a\u0441\u0442\u0430\u0442\u0438, \u0433\u0440\u0430\u0432\u0438\u0442\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0438\u0437 \u043a\u0430\u043a\u043e\u0433\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0438 \u0433\u0440\u0430\u0432\u0438\u0442\u0430\u0446\u0438\u044f \u0438\u0437 (0,10) \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u0435\u0435 (0,1). \u041f\u043e\u0442\u043e\u043c \u043c\u044b \u0431\u0435\u0440\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0430\u0439\u043b\u043e\u0432<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u0435\u043b\u0430 \u0431\u043b\u043e\u043a\u043e\u0432  <\/p>\n<pre><code class=\"cpp\">\tstd::vector&lt;Object&gt; block = lvl.GetObjects(&quot;block&quot;); \tfor(int i = 0; i &lt; block.size(); i++) \t{ \t\tb2BodyDef bodyDef; \t\tbodyDef.type = b2_staticBody; \t\tbodyDef.position.Set(block[i].rect.left + tileSize.x \/ 2 * (block[i].rect.width \/ tileSize.x - 1), \t\t\tblock[i].rect.top + tileSize.y \/ 2 * (block[i].rect.height \/ tileSize.y - 1)); \t\tb2Body* body = world.CreateBody(&bodyDef); \t\tb2PolygonShape shape; \t\tshape.SetAsBox(block[i].rect.width \/ 2, block[i].rect.height \/ 2); \t\tbody-&gt;CreateFixture(&shape,1.0f); \t} <\/code><\/pre>\n<pre><code class=\"cpp\">bodyDef.type = b2_staticBody; <\/code><\/pre>\n<p>  \u0411\u043b\u043e\u043a\u0438 \u2014 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0435\u043b\u0430, \u043e\u043d\u0438 \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u043c\u0430\u0441\u0441\u044b \u0438 \u0432\u0438\u0441\u044f\u0442 \u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0435  <\/p>\n<pre><code class=\"cpp\">bodyDef.position.Set(block[i].rect.left + tileSize.x \/ 2 * (block[i].rect.width \/ tileSize.x - 1), \t\t\tblock[i].rect.top + tileSize.y \/ 2 * (block[i].rect.height \/ tileSize.y - 1)); <\/code><\/pre>\n<p>  \u0422\u0443\u0442 \u043c\u044b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0431\u043b\u043e\u043a\u043e\u0432. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0442\u0430\u043a\u0443\u044e \u0436\u0435, \u043a\u0430\u043a \u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0436\u0434\u0430\u0442\u044c \u043a\u043e\u0432\u0430\u0440\u043d\u0430\u044f <a href=\"http:\/\/www.gamedev.ru\/code\/forum\/?id=182066\">\u043e\u0448\u0438\u0431\u043a\u0430<\/a>  <\/p>\n<pre><code class=\"cpp\">b2Body* body = world.CreateBody(&bodyDef); <\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u0435\u043b\u043e \u0431\u043b\u043e\u043a\u0430 \u0432 world. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0441 \u0442\u0435\u043b\u043e\u043c \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c (\u0432 \u0441\u043c\u044b\u0441\u043b\u0435, \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u043c)  <\/p>\n<pre><code class=\"cpp\">b2PolygonShape shape; \t\tshape.SetAsBox(block[i].rect.width \/ 2, block[i].rect.height \/ 2); <\/code><\/pre>\n<p>  \u041a\u0430\u0436\u0434\u043e\u043c\u0443 \u0442\u0435\u043b\u0443 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e shape \u2014 \u0444\u0438\u0433\u0443\u0440. \u042f \u043d\u0435 \u0431\u0443\u0434\u0443 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u044d\u0442\u0443 \u0442\u0435\u043c\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u0431\u043b\u043e\u043a\u0430\u043c (\u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u0442\u0435\u043b\u0430\u043c) \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0432\u0441\u0435\u0433\u043e-\u0442\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430.  <\/p>\n<pre><code class=\"cpp\">body-&gt;CreateFixture(&shape,1.0f); <\/code><\/pre>\n<p>  \u0421\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0438\u0433\u0443\u0440\u0443 \u0441 \u0442\u0435\u043b\u043e\u043c.<\/p>\n<p>  \u0417\u0430\u0442\u0435\u043c \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0441 \u0432\u0440\u0430\u0433\u0430\u043c\u0438, \u043c\u043e\u043d\u0435\u0442\u0430\u043c\u0438 \u0438 \u0438\u0433\u0440\u043e\u043a\u043e\u043c, \u0437\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f\u043c\u0438  <\/p>\n<pre><code class=\"cpp\">\tcoin = lvl.GetObjects(&quot;coin&quot;); \tfor(int i = 0; i &lt; coin.size(); i++) \t{ \t\tb2BodyDef bodyDef; \t\tbodyDef.type = b2_dynamicBody; \t\tbodyDef.position.Set(coin[i].rect.left + tileSize.x \/ 2 * (coin[i].rect.width \/ tileSize.x - 1), \t\t\tcoin[i].rect.top + tileSize.y \/ 2 * (coin[i].rect.height \/ tileSize.y - 1)); \t\tbodyDef.fixedRotation = true; \t\tb2Body* body = world.CreateBody(&bodyDef); \t\tb2PolygonShape shape; \t\tshape.SetAsBox(coin[i].rect.width \/ 2, coin[i].rect.height \/ 2); \t\tbody-&gt;CreateFixture(&shape,1.0f); \t\tcoinBody.push_back(body); \t}  \tenemy = lvl.GetObjects(&quot;enemy&quot;); \tfor(int i = 0; i &lt; enemy.size(); i++) \t{ \t\tb2BodyDef bodyDef; \t\tbodyDef.type = b2_dynamicBody; \t\tbodyDef.position.Set(enemy[i].rect.left + \t\t\ttileSize.x \/ 2 * (enemy[i].rect.width \/ tileSize.x - 1), \t\t\tenemy[i].rect.top + tileSize.y \/ 2 * (enemy[i].rect.height \/ tileSize.y - 1)); \t\tbodyDef.fixedRotation = true; \t\tb2Body* body = world.CreateBody(&bodyDef); \t\tb2PolygonShape shape; \t\tshape.SetAsBox(enemy[i].rect.width \/ 2, enemy[i].rect.height \/ 2); \t\tbody-&gt;CreateFixture(&shape,1.0f); \t\tenemyBody.push_back(body); \t}   \tplayer = lvl.GetObject(&quot;player&quot;); \tb2BodyDef bodyDef; \tbodyDef.type = b2_dynamicBody; \tbodyDef.position.Set(player.rect.left, player.rect.top); \tbodyDef.fixedRotation = true; \tplayerBody = world.CreateBody(&bodyDef); \tb2PolygonShape shape; shape.SetAsBox(player.rect.width \/ 2, player.rect.height \/ 2); \tb2FixtureDef fixtureDef; \tfixtureDef.shape = &shape; \tfixtureDef.density = 1.0f; fixtureDef.friction = 0.3f; \tplayerBody-&gt;CreateFixture(&fixtureDef); <\/code><\/pre>\n<pre><code class=\"cpp\">bodyDef.fixedRotation = true; <\/code><\/pre>\n<p>  \u041e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0442\u0435\u043b\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f<\/p>\n<p>  \u0412\u0441\u0435 \u0442\u0435\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u044b, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a\u0443!  <\/p>\n<pre><code class=\"cpp\">\tsf::Vector2i screenSize(800, 600);  \tsf::RenderWindow window; \twindow.create(sf::VideoMode(screenSize.x, screenSize.y), &quot;Game&quot;); <\/code><\/pre>\n<p>  \u0425\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u043a\u043e\u0434, \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c<\/p>\n<pre><code class=\"cpp\">\tsf::View view; \tview.reset(sf::FloatRect(0.0f, 0.0f, screenSize.x, screenSize.y)); \tview.setViewport(sf::FloatRect(0.0f, 0.0f, 2.0f, 2.0f)); <\/code><\/pre>\n<p>  \u0422\u0443\u0442 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u0438\u0434 (View) \u0434\u043b\u044f \u043e\u043a\u043d\u0430.<br \/>  \u0417\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u043d\u0430\u0434\u043e? \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0434\u0430\u0442\u044c \u0438\u0433\u0440\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0438\u043b\u044c, \u043c\u044b \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u044d\u043a\u0440\u0430\u043d\u0430 \u043d\u0430 2 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c sf::View \u0438 \u0432\u0441\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0440\u0438\u0441\u0443\u044e\u0442\u0441\u044f \u0432 2 \u0440\u0430\u0437\u0430 \u0432\u044b\u0448\u0435 \u0438 \u0448\u0438\u0440\u0435.<\/p>\n<pre><code class=\"cpp\">    while(window.isOpen())     {         sf::Event evt;          while(window.pollEvent(evt))         { \t\t\tswitch(evt.type) \t\t\t{ \t\t\tcase sf::Event::Closed:                 window.close(); \t\t\t\tbreak; <\/code><\/pre>\n<p>  \u041e\u043a\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e \u043d\u0430 \u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u043a\u0440\u0435\u0441\u0442\u0438\u043a. \u0422\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u0431\u044b\u043b \u0440\u0430\u043d\u0435\u0435<\/p>\n<pre><code class=\"cpp\">\t\t\tcase sf::Event::KeyPressed: \t\t\t\tif(evt.key.code == sf::Keyboard::W) \t\t\t\t\tplayerBody-&gt;SetLinearVelocity(b2Vec2(0.0f, -15.0f));  \t\t\t\tif(evt.key.code == sf::Keyboard::D) \t\t\t\t\tplayerBody-&gt;SetLinearVelocity(b2Vec2(5.0f, 0.0f));  \t\t\t\tif(evt.key.code == sf::Keyboard::A) \t\t\t\t\tplayerBody-&gt;SetLinearVelocity(b2Vec2(-5.0f, 0.0f)); \t\t\t\tbreak; <\/code><\/pre>\n<p>  \u0422\u0443\u0442 \u0443\u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435! \u041c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u0443 \u043f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e \u043a\u043b\u0430\u0432\u0438\u0448 WAD<\/p>\n<pre><code class=\"cpp\">world.Step(1.0f \/ 60.0f, 1, 1); <\/code><\/pre>\n<p>  \u0422\u0443\u0442 \u043c\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0438\u0440 Box2D. \u041f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0438\u0440\u0430 (\u0440\u0430\u0437 \u0432 1\/60 \u0441\u0435\u043a\u0443\u043d\u0434), \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e velocityIterations \u0438 positionIterations. \u0427\u0435\u043c \u0432\u044b\u0448\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0434\u0432\u0443\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0442\u0435\u043c \u0440\u0435\u0430\u043b\u044c\u043d\u0435\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0444\u0438\u0437\u0438\u043a\u0430 \u0438\u0433\u0440\u044b. \u0422\u0430\u043a \u043a\u0430\u043a \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442\u0443 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0444\u0438\u0433\u0443\u0440, \u043a\u0430\u043a \u0432 AngryBirds, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438, \u0442\u043e \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e \u0440\u0430\u0437\u0443.<\/p>\n<pre><code class=\"cs\">\t\tfor(b2ContactEdge* ce = playerBody-&gt;GetContactList(); ce; ce = ce-&gt;next) \t\t{ \t\t\tb2Contact* c = ce-&gt;contact; <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0442\u0435\u043b\u0430\u043c\u0438<\/p>\n<pre><code class=\"cpp\">\t\t\tfor(int i = 0; i &lt; coinBody.size(); i++) \t\t\t\tif(c-&gt;GetFixtureA() == coinBody[i]-&gt;GetFixtureList()) \t\t\t\t{ \t\t\t\t\tcoinBody[i]-&gt;DestroyFixture(coinBody[i]-&gt;GetFixtureList()); \t\t\t\t\tcoin.erase(coin.begin() + i); \t\t\t\t\tcoinBody.erase(coinBody.begin() + i); \t\t\t\t} <\/code><\/pre>\n<p>  \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0441 \u043c\u043e\u043d\u0435\u0442\u0430\u043c\u0438.<br \/>  \u0415\u0441\u043b\u0438 \u043a\u0430\u043a\u0430\u044f \u043c\u043e\u043d\u0435\u0442\u0430 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0430\u0441\u044c \u0441 \u0438\u0433\u0440\u043e\u043a\u043e\u043c, \u043e\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0435\u0442\u0441\u044f \u0438 \u0441\u0442\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432<\/p>\n<pre><code class=\"cpp\">\t\t\tfor(int i = 0; i &lt; enemyBody.size(); i++) \t\t\t\tif(c-&gt;GetFixtureA() == enemyBody[i]-&gt;GetFixtureList()) \t\t\t\t{ \t\t\t\t\tif(playerBody-&gt;GetPosition().y &lt; enemyBody[i]-&gt;GetPosition().y) \t\t\t\t\t{ \t\t\t\t\t\tplayerBody-&gt;SetLinearVelocity(b2Vec2(0.0f, -10.0f));  \t\t\t\t\t\tenemyBody[i]-&gt;DestroyFixture(enemyBody[i]-&gt;GetFixtureList()); \t\t\t\t\t\tenemy.erase(enemy.begin() + i); \t\t\t\t\t\tenemyBody.erase(enemyBody.begin() + i); \t\t\t\t\t} <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u0440\u0430\u0433 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u0438\u0433\u0440\u043e\u043a\u043e\u043c, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f, \u0432\u044b\u0448\u0435 \u0438\u0433\u0440\u043e\u043a \u0432\u0440\u0430\u0433\u0430 \u0438\u043b\u0438 \u043d\u0435\u0442. \u0415\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a \u0432\u044b\u0448\u0435 \u0432\u0440\u0430\u0433\u0430, \u0442\u043e \u043e\u043d \u0441\u0442\u0438\u0440\u0430\u0435\u0442\u0441\u044f, \u0430 \u0438\u0433\u0440\u043e\u043a \u043f\u043e\u0434\u0441\u043a\u0430\u043a\u0438\u0432\u0430\u0435\u0442 \u0432\u0432\u0435\u0440\u0445.<br \/>  \u0415\u0441\u043b\u0438 \u0438\u043d\u0430\u0447\u0435, \u0442\u043e \u0438\u0433\u0440\u043e\u043a \u043e\u0442\u0441\u043a\u0430\u043a\u0438\u0432\u0430\u0435\u0442 \u043e\u0442 \u0432\u0440\u0430\u0433\u0430  <\/p>\n<pre><code class=\"cpp\">\t\t\t\t\telse \t\t\t\t\t{ \t\t\t\t\t\tint tmp = (playerBody-&gt;GetPosition().x &lt; enemyBody[i]-&gt;GetPosition().x) \t\t\t\t\t\t\t? -1 : 1; \t\t\t\t\t\tplayerBody-&gt;SetLinearVelocity(b2Vec2(10.0f * tmp, 0.0f)); \t\t\t\t\t} \t\t\t\t} \t\t} <\/code><\/pre>\n<p>  \u0418\u0433\u0440\u043e\u043a \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0438\u043b\u0438 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0441\u0442\u0432\u0438\u0438 \u0441 \u0435\u0433\u043e \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0440\u0430\u0433\u0430.<\/p>\n<pre><code class=\"cpp\">\t\tfor(int i = 0; i &lt; enemyBody.size(); i++) \t\t{ \t\t\tif(enemyBody[i]-&gt;GetLinearVelocity() == b2Vec2_zero) \t\t\t{ \t\t\t\tint tmp = (rand() % 2 == 1) ? 1 : -1; \t\t\t\tenemyBody[i]-&gt;SetLinearVelocity(b2Vec2(5.0f * tmp, 0.0f)); \t\t\t} \t\t} <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u0440\u0430\u0433\u0430 \u0440\u0430\u0432\u043d\u0430 0, \u0442\u043e \u0435\u043c\u0443 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u043d\u043e\u0432\u044c \u2014 \u043e\u043d \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f \u043b\u0438\u0431\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043e, \u043b\u0438\u0431\u043e \u043d\u0430\u043b\u0435\u0432\u043e. \u0412\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u0440\u044b\u0432\u043a\u0430\u043c\u0438.<\/p>\n<pre><code class=\"cpp\">\t\tb2Vec2 pos = playerBody-&gt;GetPosition(); \t\tview.setCenter(pos.x + screenSize.x \/ 4, pos.y + screenSize.y \/ 4); \t\twindow.setView(view); <\/code><\/pre>\n<p>  \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439. \u0411\u0435\u0440\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0438\u0433\u0440\u043e\u043a\u0430, \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u0446\u0435\u043d\u0442\u0440 \u0432\u0438\u0434\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043d\u0430\u0448 \u0432\u0438\u0434<\/p>\n<pre><code class=\"cpp\">\t\tplayer.sprite.setPosition(pos.x, pos.y);  \t\tfor(int i = 0; i &lt; coin.size(); i++) \t\t\tcoin[i].sprite.setPosition(coinBody[i]-&gt;GetPosition().x, coinBody[i]-&gt;GetPosition().y);  \t\tfor(int i = 0; i &lt; enemy.size(); i++) \t\t\tenemy[i].sprite.setPosition(enemyBody[i]-&gt;GetPosition().x, enemyBody[i]-&gt;GetPosition().y); <\/code><\/pre>\n<p>  \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u043f\u0440\u0430\u0439\u0442\u0430\u043c \u0438\u0433\u0440\u043e\u043a\u0430, \u043c\u043e\u043d\u0435\u0442 \u0438 \u0432\u0440\u0430\u0433\u043e\u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 b2Body<\/p>\n<pre><code class=\"cpp\">        window.clear();  \t\tlvl.Draw(window);  \t\twindow.draw(player.sprite);  \t\tfor(int i = 0; i &lt; coin.size(); i++) \t\t\twindow.draw(coin[i].sprite);  \t\tfor(int i = 0; i &lt; enemy.size(); i++) \t\t\twindow.draw(enemy[i].sprite);  \t\twindow.display(); <\/code><\/pre>\n<p>  \u041e\u0447\u0438\u0449\u0430\u0435\u043c \u043e\u043a\u043d\u0430, \u0440\u0438\u0441\u0443\u0435\u043c \u0442\u0430\u0439\u043b\u044b \u043a\u0430\u0440\u0442\u044b, \u043f\u043e\u0442\u043e\u043c \u0438\u0433\u0440\u043e\u043a\u0430, \u043c\u043e\u043d\u0435\u0442\u044b \u0438 \u0432\u0440\u0430\u0433\u043e\u0432, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u043a\u043d\u043e.<\/p>\n<pre><code class=\"cpp\">    }      return 0; } <\/code><\/pre>\n<p>  \u0413\u043e\u0442\u043e\u0432\u043e!<\/p>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0430<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/s6.hostingkartinok.com\/uploads\/images\/2013\/10\/a348a0abc8945f94fa4cb205342b074e.png\" alt=\"image\"\/><\/p>\n<h4>\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438<\/h4>\n<p>  <img decoding=\"async\" src=\"http:\/\/static.pmmlabs.ru\/images\/github-logo.png\" alt=\"image\"\/><br \/>  <a href=\"https:\/\/github.com\/Izaron\/Platformer\">https:\/\/github.com\/Izaron\/Platformer<\/a><\/p>\n<p>  \u0412\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u0438\u0448\u0438\u0442\u0435 \u0442\u0443\u0442 \u0438\u043b\u0438 \u0432 \u041b\u0421, \u043b\u0438\u0431\u043e, \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0435 \u043f\u043e\u0432\u0435\u0437\u043b\u043e \u0431\u044b\u0442\u044c \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u2014 \u043d\u0430 izarizar@mail.ru      \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\/199064\/\"> http:\/\/habrahabr.ru\/post\/199064\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f C++, Box2D \u0438 SFML, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 2D \u043a\u0430\u0440\u0442 \u0434\u043b\u044f \u0438\u0433\u0440 <a href=\"http:\/\/habrahabr.ru\/post\/148653\/\">Tiled Map Editor<\/a><\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/601\/b21\/f51\/601b21f51d4be0d9d0f022c0d30a43ae.png\" alt=\"image\"\/><\/p>\n<p>  \u0412\u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 (\u043a\u0430\u0440\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0430\u0441\u044c 5 \u043c\u0438\u043d\u0443\u0442 + \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u044c\u0435\u043c\u043a\u0438 \u0438\u0433\u0440\u0430 \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u043b\u0430 + \u044d\u043a\u0440\u0430\u043d \u043d\u0435 \u0442\u0430\u043a \u0440\u0430\u0441\u0442\u044f\u043d\u0443\u0442 \u2014 \u0434\u0435\u0444\u0435\u043a\u0442 Bandicam \ud83d\ude42 )<br \/>  <iframe loading=\"lazy\" width=\"560\" height=\"349\" src=\"\/\/www.youtube.com\/embed\/0NUAUMjQigI?wmode=opaque\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n<p>  \u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0438 exe \u2014 \u0432\u043d\u0438\u0437\u0443 \u0441\u0442\u0430\u0442\u044c\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-199064","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/199064","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=199064"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/199064\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=199064"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=199064"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=199064"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}