{"id":348329,"date":"2023-06-02T21:00:12","date_gmt":"2023-06-02T21:00:12","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=348329"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2023-06-02T21:00:12","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=348329","title":{"rendered":"<span>\u0428\u0443\u0442\u0435\u0440 \u201c\u041f\u0440\u043e\u0435\u043a\u0442 \u041a\u043e\u0449\u0435\u0439\u201d, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u0433\u0440 \u043d\u0430 SFML C++<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/728654\/\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0442\u0435\u043c\u0430<\/a><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7a2\/e48\/904\/7a2e4890401f1075d3dd5968093c855c.png\" width=\"974\" height=\"548\"><\/figure>\n<p>\u0428\u0443\u0442\u0435\u0440\u044b \u2013 \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0436\u0430\u043d\u0440\u043e\u0432 \u0432\u0438\u0434\u0435\u043e\u0438\u0433\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 90-\u0445 \u0433\u043e\u0434\u043e\u0432. \u041f\u0435\u0440\u0432\u044b\u0435 \u0448\u0443\u0442\u0435\u0440\u044b \u0431\u044b\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0434\u043b\u044f \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u0432 \u0438 \u0438\u043c\u0435\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0443\u044e \u0433\u0440\u0430\u0444\u0438\u043a\u0443 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435. \u041e\u0434\u043d\u0430\u043a\u043e, \u043e\u043d\u0438 \u0431\u044b\u043b\u0438 \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b, \u0438 \u0432 \u0441\u043a\u043e\u0440\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0442\u0430\u043b\u0438 \u0441\u0430\u043c\u044b\u043c\u0438 \u043f\u0440\u043e\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u043c\u0438 \u0438\u0433\u0440\u0430\u043c\u0438.<\/p>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0438\u0433\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u043a \u0436\u0430\u043d\u0440\u0443 \u0448\u0443\u0442\u0435\u0440\u043e\u0432, \u0431\u044b\u043b\u0430 Wolfenstein 3D, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 id Software \u0432 1992 \u0433\u043e\u0434\u0443. \u041e\u043d\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u0438\u0433\u0440\u043e\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0433\u0440\u043e\u043a \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u043c \u043e\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043b\u0438\u0446\u0430, \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u043c \u0432\u0440\u0430\u0433\u0430\u043c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. Wolfenstein 3D \u0442\u0430\u043a\u0436\u0435 \u0441\u0442\u0430\u043b\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u0438\u0433\u0440\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430 3D-\u0433\u0440\u0430\u0444\u0438\u043a\u0443 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041e\u043d\u0430 \u0431\u044b\u043b\u0430 \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430 \u0438 \u0441\u0442\u0430\u043b\u0430 \u043e\u0441\u043d\u043e\u0432\u043e\u0439 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0448\u0443\u0442\u0435\u0440\u043e\u0432.<\/p>\n<p>\u0412 1993 \u0433\u043e\u0434\u0443 id Software \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0430 \u0438\u0433\u0440\u0443 Doom, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0430\u043b\u0430 \u0435\u0449\u0435 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0439, \u0447\u0435\u043c Wolfenstein 3D. Doom \u0431\u044b\u043b\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u0438\u0433\u0440\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u0435\u0440, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0438\u0433\u0440\u043e\u043a\u0430\u043c \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u043c\u0438\u0440\u0430 \u0441\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442.<\/p>\n<p>\u0412 1996 \u0433\u043e\u0434\u0443 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f Valve \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0430 \u0438\u0433\u0440\u0443 Half-Life, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0430\u043b\u0430 \u043d\u043e\u0432\u043e\u0439 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0435\u0439 \u0436\u0430\u043d\u0440\u0430. \u041e\u043d\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u043d\u043e\u0432\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0439 \u0433\u0435\u0439\u043c\u043f\u043b\u0435\u0439, \u0441\u044e\u0436\u0435\u0442 \u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u043e\u0432\u0443\u044e \u0433\u0440\u0430\u0444\u0438\u043a\u0443 \u0438 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u0432\u0438\u0436\u043e\u043a.<\/p>\n<p>\u0428\u0443\u0442\u0435\u0440\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0441\u0435\u0439 \u0434\u0435\u043d\u044c, \u0438 \u0438\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0443\u0433\u0430\u0441\u0430\u0435\u0442. \u041e\u043d\u0438 \u0441\u0442\u0430\u043b\u0438 \u043d\u0435\u043e\u0442\u044a\u0435\u043c\u043b\u0435\u043c\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0438\u0433\u0440\u043e\u043a\u0430\u043c \u043e\u043a\u0443\u043d\u0443\u0442\u044c\u0441\u044f \u0432 \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043c\u0438\u0440 \u0441\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438 \u044d\u043a\u0448\u0435\u043d\u0430.<\/p>\n<h3>\u0428\u0443\u0442\u0435\u0440 \u201c\u041f\u0440\u043e\u0435\u043a\u0442 \u041a\u043e\u0449\u0435\u0439\u201d<\/h3>\n<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/83a\/82f\/15b\/83a82f15ba76630098504170ab24948e.gif\" width=\"692\" height=\"388\"><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9d2\/9fa\/63f\/9d29fa63f201e0ea77a37b733b225e31.png\" width=\"894\" height=\"503\"><\/figure>\n<h3>\u041a\u043b\u0430\u0441\u0441 Player<\/h3>\n<p><strong>player.h<\/strong><\/p>\n<pre><code class=\"cpp\">#pragma once #include\"Animator.h\"  class Player { public: Player(); \/\/ \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430 enum class playermove { UpPressed, UpRg, UpLf, DownPressed,  DownRg, DownLf, LeftPressed, RightPressed, Stop }; \/\/ \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 \u043d\u0430 \u0438\u0433\u0440\u043e\u0432\u043e\u043c \u043f\u043e\u043b\u0435 void spawn(sf::IntRect planet, sf::Vector2f resolution, int tileSize); \/\/ \u043c\u0435\u0442\u043e\u0434 \u0440\u0435\u0441\u0442\u0430\u0440\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438\u0433\u0440\u043e\u043a\u0430 void resetPlayerStats(); \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0436\u0438\u0437\u043d\u0438 \u0438\u0433\u0440\u043e\u043a\u0430 bool getLive() const; \/\/ \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 \u0438\u0433\u0440\u043e\u043a\u043e\u043c bool hit(sf::Time timeHit); \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u0434\u0430\u0432\u043d\u043e \u0431\u044b\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0443\u0434\u0430\u0440 \u043f\u043e \u0438\u0433\u0440\u043e\u043a\u0443 sf::Time getLastHitTime() const; \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438\u0433\u0440\u043e\u043a\u0430 sf::FloatRect getPosition() const; \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438\u0433\u0440\u043e\u043a\u0430 sf::Vector2f getCenter() const; \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u0433\u043e\u043b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0438\u0433\u0440\u043e\u043a\u0430 float getRotation() const; \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043f\u0438\u044e \u0441\u043f\u0440\u0430\u0439\u0442\u0430 \u0438\u0433\u0440\u043e\u043a\u0430 sf::Sprite getSprite() const; \/\/ \u0440\u0438\u0441\u0443\u0435\u043c \u0438\u0433\u0440\u043e\u043a\u0430 void draw(sf::RenderWindow&amp; win) const; \/\/ \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0438\u0433\u0440\u043e\u043a\u0430 void move(playermove mov); \/\/ \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438  void update(sf::Time deltaTime, sf::Vector2i mousePosition); \/\/ \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f  void upgradeHealth(float heal); \/\/ \u043f\u043e\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 void increaseHealthLevel(float amount); \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f \u0443 \u0438\u0433\u0440\u043e\u043a\u0430 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442? float getHealth() const; \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 float getMaxHealth() const;  private: \/\/ \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0436\u0438\u0437\u043d\u044c \u0438\u0433\u0440\u043e\u043a\u0430 const float START_HEALTH = 200; \/\/ \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430 sf::Vector2f m_Position; \/\/ \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 \u0441\u043f\u0440\u0430\u0439\u0442 \u0438  \u043e\u0431\u044a\u0435\u043a\u0442 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 sf::Sprite m_Sprite; Animator m_AnimPlayer = Animator(m_Sprite); \/\/ \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u0430 bool m_animMove = false; \/\/ \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u043a\u0440\u0430\u043d\u0430 sf::Vector2f m_Resolution; \/\/ \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f  sf::IntRect m_planet; \/\/ \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f  int m_TileSize; \/\/ \u0432 \u043a\u0430\u043a\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438(\u044f\u0445) \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f \u0438\u0433\u0440\u043e\u043a \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 playermove m_move; \/\/ \u0436\u0438\u0432\u043e\u0439 \u043b\u0438 \u0438\u0433\u0440\u043e\u043a bool m_live = true; \/\/ \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 float m_Health; \/\/ \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 float m_MaxHealth; \/\/ \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0443\u0434\u0430\u0440\u0430 \u043f\u043e \u0438\u0433\u0440\u043e\u043a\u0443  sf::Time m_LastHit; \/\/ \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430 sf::Time m_time_moving; \/\/ \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 float m_Speed;  };<\/code><\/pre>\n<p><strong>player.cpp<\/strong><\/p>\n<pre><code class=\"cpp\">#include \"Player.h\"  Player::Player() { \/\/ \u0437\u0430\u0434\u0430\u0451\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0438\u0433\u0440\u043e\u043a\u0430 m_Speed = 2; m_Health = START_HEALTH; m_MaxHealth = START_HEALTH; m_move = playermove::Stop; m_TileSize = 0; \/\/ \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430 auto&amp; idleForward = m_AnimPlayer.CreateAnimation(\"idleForward\", \"graphics\/player.png\", sf::seconds(0.5), true); idleForward.AddFrames(sf::Vector2i(0, 0), sf::Vector2i(135, 105), 4, 1); auto&amp; dead = m_AnimPlayer.CreateAnimation(\"dead\", \"graphics\/player.png\", sf::seconds(0.5), false); dead.AddFrames(sf::Vector2i(405, 0), sf::Vector2i(135, 105), 4, 1); m_AnimPlayer.SwitchAnimation(\"idleForward\"); m_AnimPlayer.Update(sf::seconds(0)); \/\/ \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441\u043f\u0440\u0430\u0439\u0442\u0430 \u0432 \u0446\u0435\u043d\u0442\u0440  m_Sprite.setOrigin(m_Sprite.getGlobalBounds().width \/ 2, m_Sprite.getGlobalBounds().height \/ 2); }<\/code><\/pre>\n<p>\u0412 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 <strong>player<\/strong> \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438 \u0433\u0438\u0431\u0435\u043b\u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430. \u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0434\u043b\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0431\u0435\u0440\u0451\u043c \u0438\u0437 \u0444\u0430\u0439\u043b\u0430<strong> player.png.<\/strong><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/720\/0ae\/dd2\/7200aedd2af7f1dc6bc9a08b6355d256.png\" width=\"974\" height=\"218\"><\/figure>\n<p>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/habr.com\/ru\/articles\/720342\/\" rel=\"noopener noreferrer nofollow\">&#171;\u041f\u043e\u043a\u0430\u0434\u0440\u043e\u0432\u0430\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f&#187;.<\/a> <\/p>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 setOrigin(m_Sprite.getGlobalBounds().width \/ 2, m_Sprite.getGlobalBounds().height \/ 2) \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043f\u0440\u0430\u0439\u0442\u0430 \u0432 \u0446\u0435\u043d\u0442\u0440 \u0441\u043f\u0440\u0430\u0439\u0442\u0430.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cba\/ec5\/d91\/cbaec5d917af4148a312ea6450d683df.png\" width=\"408\" height=\"340\"><\/figure>\n<pre><code class=\"cpp\">\/\/ \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u043c\u0438\u0440\u0435 void Player::spawn(sf::IntRect planet, sf::Vector2f resolution, int tileSize) {  \/\/ \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u0446\u0435\u043d\u0442\u0440 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f m_Position.x = static_cast&lt;float&gt;(planet.width \/ 2); m_Position.y = static_cast&lt;float&gt;(planet.height \/ 2); \/\/ \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0434\u0435\u0442\u0430\u043b\u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f m_planet.left = planet.left; m_planet.width = planet.width; m_planet.top = planet.top; m_planet.height = planet.height; \/\/ \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u043b\u0438\u0442\u043e\u043a m_TileSize = tileSize; \/\/ \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u043a\u0440\u0430\u043d\u0430 m_Resolution.x = resolution.x; m_Resolution.y = resolution.y; }<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 void spawn(sf::IntRect planet, sf::Vector2f resolution, int tileSize), \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043b\u0435\u0435\u0440\u0430 \u0432 \u0438\u0433\u0440\u043e\u0432\u043e\u043c \u043c\u0438\u0440\u0435, \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442: \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043c\u0438\u0440\u0430 planet, \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u043a\u0440\u0430\u043d\u0430 resolution, \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u043b\u0438\u0442\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b tileSize, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043c\u0438\u0440.  <\/p>\n<pre><code class=\"cpp\">\/\/ \u0441\u0431\u0440\u043e\u0441 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0438\u0433\u0440\u043e\u043a\u0430 void Player::resetPlayerStats() {  m_Health = START_HEALTH; m_MaxHealth = START_HEALTH; m_live = true; m_AnimPlayer.SwitchAnimation(\"idleForward\"); m_AnimPlayer.Update(sf::seconds(0)); }  \/\/ \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 \u0436\u0438\u0432 \u043c\u0451\u0440\u0442\u0432 bool Player::getLive() const {  return m_live; }  \/\/ \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 sf::Time Player::getLastHitTime() const {  return m_LastHit; }  \/\/ \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u043d\u0430 \u0438\u0433\u0440\u043e\u043a\u043e\u043c bool Player::hit(sf::Time timeHit) {  if (timeHit.asMilliseconds()- m_LastHit.asMilliseconds() &gt; 200 &amp;&amp; m_Health&gt;0) {  m_LastHit = timeHit; if (m_Health&gt;100) m_Health -= 10; else m_Health -= 5; if (m_Health &lt; 0) m_Health = 0; return true; } else {  return false; } }<\/code><\/pre>\n<p>  \u041c\u0435\u0442\u043e\u0434 bool hit(sf::Time timeHit) \u043d\u0430\u043d\u043e\u0441\u0438\u0442 \u0443\u0440\u043e\u043d \u0438\u0433\u0440\u043e\u043a\u0443 \u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e \u0435\u0433\u043e \u0436\u0438\u0437\u043d\u044c m_Health \u043d\u0435 \u0440\u0430\u0432\u043d\u0430 \u043d\u0443\u043b\u044e \u0438 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 timeHit.asMilliseconds()- m_LastHit.asMilliseconds() \u043d\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 200 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434. \u041c\u0435\u0442\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 \u2013 \u0443\u0440\u043e\u043d \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u0438\u043b\u0438 \u043d\u0435\u0442. \u0412 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043c\u0435\u0442\u043e\u0434\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 timeHit. <\/p>\n<pre><code class=\"cpp\">\/\/ \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430 sf::FloatRect Player::getPosition() const {  auto myGlobalBounds = sf::FloatRect(m_Sprite.getGlobalBounds().left+20, m_Sprite.getGlobalBounds().top+20, m_Sprite.getGlobalBounds().width - 40, m_Sprite.getGlobalBounds().height - 40);  return myGlobalBounds; }<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 FloatRect getPosition() \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043e\u0431\u043b\u0430\u0441\u0442\u0438, \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u043c\u044b\u0435 \u043f\u043b\u0435\u0435\u0440\u043e\u043c.&nbsp; \u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u043b\u0435\u0435\u0440\u0430 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438. \u0412 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432\u043d\u0435\u0441\u0435\u043d\u044b \u043f\u043e\u043f\u0440\u0430\u0432\u043a\u0438&nbsp; \u0433\u0440\u0430\u043d\u0438\u0446 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438.<\/p>\n<figure class=\"bordered full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/477\/34d\/c5d\/47734dc5d6395b4e0aadbde0f0015627.png\" width=\"594\" height=\"448\"><\/figure>\n<pre><code class=\"cpp\">\/\/ \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430 sf::Vector2f Player::getCenter() const {  return m_Position; }  \/\/ \u0443\u0433\u043e\u043b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0438\u0433\u0440\u043e\u043a\u0430 float Player::getRotation() const {  return m_Sprite.getRotation(); }  \/\/ \u0441\u043f\u0440\u0430\u0439\u0442 \u0438\u0433\u0440\u043e\u043a\u0430 sf::Sprite Player::getSprite() const {  return m_Sprite; }  \/\/ \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0436\u0438\u0437\u043d\u0438 \u0438\u0433\u0440\u043e\u043a\u0430 float Player::getHealth() const {  return m_Health; }  \/\/ \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0436\u0438\u0437\u043d\u0438 \u0438\u0433\u0440\u043e\u043a\u0430 float Player::getMaxHealth() const { return m_MaxHealth; }  \/\/ \u0440\u0438\u0441\u0443\u0435\u043c \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043e\u043a\u043d\u0435 void Player::draw(sf::RenderWindow&amp; win) const {  win.draw(m_Sprite); }<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 void draw(sf::RenderWindow&amp; win) const \u0440\u0438\u0441\u0443\u044e\u0449\u0438\u0439 \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043e\u043a\u043d\u0435, \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043a\u043d\u043e win.&nbsp; <\/p>\n<pre><code class=\"cpp\">\/\/ \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 void Player::move(playermove mov) {  m_move = mov; }<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 void move(playermove mov) \u043c\u0435\u043d\u044f\u0435\u0442 \u0432\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u043b\u0435\u0435\u0440\u0430. \u0412 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f mov. <\/p>\n<pre><code class=\"cpp\">\/\/ \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0436\u0438\u0437\u043d\u0438 void Player::upgradeHealth(float heal) {  if (m_Health!=0) m_MaxHealth += heal; }<\/code><\/pre>\n<p>\u0412 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043c\u0435\u0442\u043e\u0434\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0436\u0438\u0437\u043d\u0438 void upgradeHealth(float heal), \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0432\u0435\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 heal, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0436\u0438\u0437\u043d\u0438.&nbsp; <\/p>\n<pre><code class=\"cpp\">\/\/ \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0436\u0438\u0437\u043d\u0438 \u0438\u0433\u0440\u043e\u043a\u0430 void Player::increaseHealthLevel(float amount) {  if (m_Health &gt; 0 &amp;&amp; m_Health&lt; m_MaxHealth) { m_Health += amount; \/\/ \u041d\u043e \u043d\u0435 \u0432\u044b\u0448\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0430 if (m_Health &gt; m_MaxHealth){  m_Health = m_MaxHealth; } } }<\/code><\/pre>\n<p>\u0412 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043c\u0435\u0442\u043e\u0434\u0430 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 void increaseHealthLevel(float amount), \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0435\u0434\u0438\u043d\u0438\u0446 amount, \u0434\u043b\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0436\u0438\u0437\u043d\u0438 \u0438\u0433\u0440\u043e\u043a\u0430 m_Health.&nbsp;    <\/p>\n<pre><code class=\"cpp\">\/\/ \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0438\u0433\u0440\u043e\u043a\u0430 void Player::update(sf::Time deltaTime, sf::Vector2i mousePosition) { m_time_moving += deltaTime; \/\/ \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430 if (m_animMove &amp;&amp; m_Health&gt;0) m_AnimPlayer.Update(deltaTime); \/\/ \u0435\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a \u043f\u043e\u0442\u0435\u0440\u044f\u043b \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 if (m_Health &lt;= 0)  { if (m_AnimPlayer.GetCurrentAnimationName() != \"dead\") m_AnimPlayer.SwitchAnimation(\"dead\");  m_AnimPlayer.Update(deltaTime);  if (m_AnimPlayer.getEndAnim()) { m_live = false; } } \/\/ \u043d\u0430\u0447\u0430\u043b\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u0435\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a \u043f\u043e\u043b\u043e\u043d \u0441\u0438\u043b else {  if (m_time_moving&gt; sf::microseconds(5000)) {  m_time_moving = sf::microseconds(0);  switch (m_move){  case Player::playermove::UpPressed: m_Position.y -= m_Speed; m_animMove = true; break; case Player::playermove::UpRg: m_Position.y -= m_Speed \/ (100 \/ (m_Resolution.y \/ (m_Resolution.x \/ 100))); m_Position.x += m_Speed; m_animMove = true; break; case Player::playermove::UpLf: m_Position.y -= m_Speed \/ (100 \/ (m_Resolution.y \/ (m_Resolution.x \/ 100))); m_Position.x -= m_Speed; m_animMove = true; break; case Player::playermove::DownPressed: m_Position.y += m_Speed; m_animMove = true; break; case Player::playermove::DownRg: m_Position.y += m_Speed \/ (100 \/ (m_Resolution.y \/ (m_Resolution.x \/ 100))); m_Position.x += m_Speed; m_animMove = true; break; case Player::playermove::DownLf: m_Position.y += m_Speed \/ (100 \/ (m_Resolution.y \/ (m_Resolution.x \/ 100))); m_Position.x -= m_Speed; m_animMove = true; break; case Player::playermove::LeftPressed: m_Position.x -= m_Speed; m_animMove = true; break; case Player::playermove::RightPressed: m_animMove = true; m_Position.x += m_Speed; break; default: m_animMove = false; break; }  \/\/ \u0414\u0435\u0440\u0436\u0438\u0442\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 \u043d\u0430 \u0430\u0440\u0435\u043d\u0435 if (m_Position.x &gt; static_cast&lt;float&gt;((m_planet.width - m_TileSize)-(m_Sprite.getGlobalBounds().width\/2))) {  m_Position.x = static_cast&lt;float&gt;((m_planet.width - m_TileSize) - (m_Sprite.getGlobalBounds().width \/ 2)); } if (m_Position.x &lt; static_cast&lt;float&gt;((m_planet.left + m_TileSize)+ (m_Sprite.getGlobalBounds().width \/ 2))) {  m_Position.x = static_cast&lt;float&gt;((m_planet.left + m_TileSize) + (m_Sprite.getGlobalBounds().width \/ 2)); } if (m_Position.y &gt; static_cast&lt;float&gt;((m_planet.height - m_TileSize) - (m_Sprite.getGlobalBounds().height \/ 2))) {  m_Position.y = static_cast&lt;float&gt;((m_planet.height - m_TileSize) - (m_Sprite.getGlobalBounds().height \/ 2)); } if (m_Position.y &lt; static_cast&lt;float&gt;((m_planet.top + m_TileSize)+(m_Sprite.getGlobalBounds().height \/ 2))){  m_Position.y = static_cast&lt;float&gt;((m_planet.top + m_TileSize)+(m_Sprite.getGlobalBounds().height \/ 2)); } \/\/ \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u0433\u043e\u043b, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u0438\u0433\u0440\u043e\u043a auto angle = static_cast&lt;float&gt;((atan2(static_cast&lt;float&gt;(mousePosition.y) - m_Resolution.y \/ 2,  static_cast&lt;float&gt;(mousePosition.x) - m_Resolution.x \/ 2)* 180) \/ 3.141); std::cout &lt;&lt; angle &lt;&lt; \"\\n\"; m_Sprite.setPosition(m_Position); m_Sprite.setRotation(angle); } }  \/\/ \u043a\u043e\u043d\u0435\u0446 \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u0435\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a \u043f\u043e\u043b\u043e\u043d \u0441\u0438\u043b } <\/code><\/pre>\n<p>\u0412 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043c\u0435\u0442\u043e\u0434\u0430&nbsp; void update(sf::Time deltaTime, sf::Vector2i mousePosition), \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 deltaTime \u0438 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u043c\u044b\u0448\u043a\u0438 mousePosition.&nbsp; \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 m_time_moving \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<pre><code class=\"cpp\">if (m_animMove &amp;&amp; m_Health&gt;0) m_AnimPlayer.Update(deltaTime);<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043b\u0435\u0435\u0440&nbsp; \u0432 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 m_animMove \u0438 \u0435\u0433\u043e \u0436\u0438\u0437\u043d\u044c m_Health \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0443\u043b\u044f, \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u043c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f.    <\/p>\n<pre><code class=\"cpp\">if (m_Health &lt;= 0)  { if (m_AnimPlayer.GetCurrentAnimationName() != \"dead\") m_AnimPlayer.SwitchAnimation(\"dead\");  m_AnimPlayer.Update(deltaTime);  if (m_AnimPlayer.getEndAnim()) { m_live = false; } }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0436\u0438\u0437\u043d\u044c \u0438\u0433\u0440\u043e\u043a\u0430 m_Health \u0440\u0430\u0432\u043d\u0430 \u043d\u0443\u043b\u044e \u0438\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435 \u043d\u0443\u043b\u044f,&nbsp;&nbsp; \u043c\u0435\u043d\u044f\u0435\u043c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u043d\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u0441\u043c\u0435\u0440\u0442\u0438 \u0438 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u043c \u0435\u0451. <\/p>\n<pre><code class=\"cpp\">if (m_AnimPlayer.getEndAnim()) { m_live = false; }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0448 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d getEndAnim(), \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441 \u0438\u0433\u0440\u043e\u043a\u0430 m_live \u043c\u0451\u0440\u0442\u0432.<\/p>\n<pre><code class=\"cpp\">else {  if (m_time_moving&gt; sf::microseconds(5000)) {  m_time_moving = sf::microseconds(0);  switch (m_move){  case Player::playermove::UpPressed: m_Position.y -= m_Speed; m_animMove = true; break; case Player::playermove::UpRg: m_Position.y -= m_Speed \/ (100 \/ (m_Resolution.y \/ (m_Resolution.x \/ 100))); m_Position.x += m_Speed; m_animMove = true; break;                 \/\/ \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u0434 <\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043a\u043e\u0434\u0430, \u0441 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u043c 5000 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f m_move.&nbsp;&nbsp;&nbsp;&nbsp;<\/p>\n<pre><code class=\"cpp\">if (m_Position.x &gt; static_cast&lt;float&gt;((m_planet.width - m_TileSize)-(m_Sprite.getGlobalBounds().width\/2))) {  m_Position.x = static_cast&lt;float&gt;((m_planet.width - m_TileSize) - (m_Sprite.getGlobalBounds().width \/ 2)); } if (m_Position.x &lt; static_cast&lt;float&gt;((m_planet.left + m_TileSize)+ (m_Sprite.getGlobalBounds().width \/ 2))) {  m_Position.x = static_cast&lt;float&gt;((m_planet.left + m_TileSize) + (m_Sprite.getGlobalBounds().width \/ 2)); }           \/\/ \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u0434 <\/code><\/pre>\n<p>&nbsp;\u0414\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e.&nbsp; <\/p>\n<pre><code class=\"cpp\">auto angle = static_cast&lt;float&gt;((atan2(static_cast&lt;float&gt;(mousePosition.y) - m_Resolution.y \/ 2,  static_cast&lt;float&gt;(mousePosition.x) - m_Resolution.x \/ 2)* 180) \/ 3.141);<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9e8\/f63\/37d\/9e8f6337d83ec3b1038dc6eea580893b.png\" width=\"974\" height=\"339\"><\/figure>\n<p>\u041f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0443\u0433\u043e\u043b angle, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u043f\u043b\u0435\u0435\u0440. <\/p>\n<pre><code class=\"cpp\">m_Sprite.setPosition(m_Position); m_Sprite.setRotation(angle);<\/code><\/pre>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441\u043f\u0440\u0430\u0439\u0442\u0430, \u0438 \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u043f\u0440\u0430\u0439\u0442 \u043d\u0430 \u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0439 \u0443\u0433\u043e\u043b angle.&nbsp;&nbsp; <\/p>\n<p><strong>MonsterPlanet.h<\/strong><\/p>\n<pre><code class=\"cpp\">#pragma once #include &lt;SFML\/Graphics.hpp&gt; #include &lt;random&gt;  int createBackground(sf::VertexArray&amp; rVA, sf::IntRect planet, int index);<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043f\u043b\u0430\u043d\u0435\u0442\u0430 \u043c\u043e\u043d\u0441\u0442\u0440\u043e\u0432.&nbsp; \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u0444\u043e\u043d\u0430 int createBackground(sf::VertexArray&amp; rVA, sf::IntRect planet, int index).&nbsp; <\/p>\n<p>\u0412 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432 \u0432\u0435\u0440\u0448\u0438\u043d rVA, \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f planet, \u043d\u043e\u043c\u0435\u0440 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f index.<\/p>\n<pre><code class=\"cpp\">#include \"MonsterPlanet.h\"  int createBackground(sf::VertexArray&amp; rVA, sf::IntRect planet, int index) {     \/\/ \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0434\u043b\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b     std::random_device rd;     std::mt19937 gen(rd());     \/\/ \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u043b\u0438\u0442\u043a\u0438     const int TILE_SIZE = 200;     \/\/ \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043f\u043b\u0438\u0442\u043e\u043a     const int TILE_TYPES = 9;     \/\/ \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0435\u0440\u0448\u0438\u043d     const int VERTS_IN_QUAD = 4;     \/\/ \u0448\u0438\u0440\u0438\u043d\u0430 \u043c\u0438\u0440\u0430     int worldWidth = planet.width \/ TILE_SIZE;     \/\/ \u0432\u044b\u0441\u043e\u0442\u0430 \u043c\u0438\u0440\u0430     int worldHeight = planet.height \/ TILE_SIZE;     \/\/ \u0442\u0438\u043f \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0430     rVA.setPrimitiveType(sf::Quads);     \/\/ \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u0435\u0440\u0448\u0438\u043d     rVA.resize(worldWidth * worldHeight * VERTS_IN_QUAD);     \/\/ \u043d\u0430\u0447\u0430\u0442\u044c \u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u0435\u0440\u0448\u0438\u043d     int currentVertex = 0;      for (int w = 0; w &lt; worldWidth; w++)     {         for (int h = 0; h &lt; worldHeight; h++)         {             \/\/ \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0439\u0442\u0435 \u043a\u0430\u0436\u0434\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0447\u0435\u0442\u044b\u0440\u0435\u0445\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0435             rVA[currentVertex + 0].position = sf::Vector2f(static_cast&lt;float&gt;(w * TILE_SIZE), static_cast&lt;float&gt;(h * TILE_SIZE));             rVA[currentVertex + 1].position = sf::Vector2f(static_cast&lt;float&gt;((w * TILE_SIZE) + TILE_SIZE), static_cast&lt;float&gt;(h * TILE_SIZE));             rVA[currentVertex + 2].position = sf::Vector2f(static_cast&lt;float&gt;((w * TILE_SIZE) + TILE_SIZE), static_cast&lt;float&gt;((h * TILE_SIZE) + TILE_SIZE));             rVA[currentVertex + 3].position = sf::Vector2f(static_cast&lt;float&gt;(w * TILE_SIZE), static_cast&lt;float&gt;((h * TILE_SIZE) + TILE_SIZE));              \/\/ \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0435 \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0447\u0435\u0442\u044b\u0440\u0435\u0445\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430             \/\/ \u0442\u0440\u0430\u0432\u0430, \u043a\u0430\u043c\u0435\u043d\u044c, \u043a\u0443\u0441\u0442 \u0438\u043b\u0438 \u0441\u0442\u0435\u043d\u0430             if (h == 0 || h == worldHeight - 1 ||                 w == 0 || w == worldWidth - 1)             {                 \/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u0441\u0442\u0435\u043d\u044b                 rVA[currentVertex + 0].texCoords = sf::Vector2f(TILE_SIZE * TILE_TYPES, TILE_SIZE*(index-1));                 rVA[currentVertex + 1].texCoords = sf::Vector2f(TILE_SIZE * TILE_TYPES + TILE_SIZE, TILE_SIZE*(index-1));                 rVA[currentVertex + 2].texCoords = sf::Vector2f(TILE_SIZE * TILE_TYPES + TILE_SIZE, TILE_SIZE*index);                 rVA[currentVertex + 3].texCoords = sf::Vector2f(TILE_SIZE * TILE_TYPES, TILE_SIZE*index);             }             else             {                 std::uniform_int_distribution&lt;&gt; dis(0, TILE_TYPES - 1);                  \/\/ \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u0443\u044e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u043f\u043e\u043b\u0430                 int mOrG = dis(gen);                 int verticalOffset = mOrG * TILE_SIZE;                 rVA[currentVertex + 0].texCoords = sf::Vector2f(static_cast&lt;float&gt;(verticalOffset), TILE_SIZE * (index - 1));                 rVA[currentVertex + 1].texCoords = sf::Vector2f(static_cast&lt;float&gt;(verticalOffset + TILE_SIZE), TILE_SIZE * (index - 1));                 rVA[currentVertex + 2].texCoords = sf::Vector2f(static_cast&lt;float&gt;(verticalOffset + TILE_SIZE), TILE_SIZE * index);                 rVA[currentVertex + 3].texCoords = sf::Vector2f(static_cast&lt;float&gt;(verticalOffset), TILE_SIZE * index);             }             \/\/ \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0433\u043e\u0442\u043e\u0432\u0430 \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u0432\u0435\u0440\u0448\u0438\u043d             currentVertex = currentVertex + VERTS_IN_QUAD;         }     }     return TILE_SIZE; }<\/code><\/pre>\n<p>\u0412 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b. \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435. <\/p>\n<pre><code class=\"cpp\">rVA[currentVertex + 0].position = sf::Vector2f(static_cast&lt;float&gt;(w * TILE_SIZE), static_cast&lt;float&gt;(h * TILE_SIZE));             rVA[currentVertex + 1].position = sf::Vector2f(static_cast&lt;float&gt;((w * TILE_SIZE) + TILE_SIZE), static_cast&lt;float&gt;(h * TILE_SIZE));             rVA[currentVertex + 2].position = sf::Vector2f(static_cast&lt;float&gt;((w * TILE_SIZE) + TILE_SIZE), static_cast&lt;float&gt;((h * TILE_SIZE) + TILE_SIZE));             rVA[currentVertex + 3].position = sf::Vector2f(static_cast&lt;float&gt;(w * TILE_SIZE), static_cast&lt;float&gt;((h * TILE_SIZE) + TILE_SIZE));<\/code><\/pre>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/202\/d0d\/4fc\/202d0d4fc6b315cadf3da2b72d8ff7c3.png\" width=\"250\" height=\"233\"><\/figure>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0447\u0435\u0442\u044b\u0440\u0451\u0445\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430. <\/p>\n<pre><code class=\"cpp\">if (h == 0 || h == worldHeight - 1 ||                 w == 0 || w == worldWidth - 1)             {                 \/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u0441\u0442\u0435\u043d\u044b                 rVA[currentVertex + 0].texCoords = sf::Vector2f(TILE_SIZE * TILE_TYPES, TILE_SIZE*(index-1));                 rVA[currentVertex + 1].texCoords = sf::Vector2f(TILE_SIZE * TILE_TYPES + TILE_SIZE, TILE_SIZE*(index-1));                 rVA[currentVertex + 2].texCoords = sf::Vector2f(TILE_SIZE * TILE_TYPES + TILE_SIZE, TILE_SIZE*index);                 rVA[currentVertex + 3].texCoords = sf::Vector2f(TILE_SIZE * TILE_TYPES, TILE_SIZE*index);             }             else             {                 std::uniform_int_distribution&lt;&gt; dis(0, TILE_TYPES - 1);                  \/\/ \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u0443\u044e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u043f\u043e\u043b\u0430                 int mOrG = dis(gen);                 int verticalOffset = mOrG * TILE_SIZE;                 rVA[currentVertex + 0].texCoords = sf::Vector2f(static_cast&lt;float&gt;(verticalOffset), TILE_SIZE * (index - 1));                 rVA[currentVertex + 1].texCoords = sf::Vector2f(static_cast&lt;float&gt;(verticalOffset + TILE_SIZE), TILE_SIZE * (index - 1));                 rVA[currentVertex + 2].texCoords = sf::Vector2f(static_cast&lt;float&gt;(verticalOffset + TILE_SIZE), TILE_SIZE * index);                 rVA[currentVertex + 3].texCoords = sf::Vector2f(static_cast&lt;float&gt;(verticalOffset), TILE_SIZE * index);             }<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/42a\/ed9\/c17\/42aed9c17926357f19535ee80c2525b9.png\" width=\"974\" height=\"976\"><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/621\/7f2\/ae5\/6217f2ae5a7f4c6d30c0768b8e86ad7f.png\" width=\"974\" height=\"99\"><\/figure>\n<p>\u0414\u043b\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u0441\u0442\u0435\u043d\u044b, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c  \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043e\u0439 \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442\u0430 \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435. <\/p>\n<pre><code class=\"cpp\">\/\/ \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0433\u043e\u0442\u043e\u0432\u0430 \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u0432\u0435\u0440\u0448\u0438\u043d             currentVertex = currentVertex + VERTS_IN_QUAD;         }     }     return TILE_SIZE; }<\/code><\/pre>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/551\/9f0\/b83\/5519f0b8368951405f544fedc702859d.png\" width=\"317\" height=\"300\"><\/figure>\n<p>\u041c\u0435\u043d\u044f\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u0435\u0440\u0448\u0438\u043d currentVertex. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b TILE_SIZE.&nbsp;&nbsp;&nbsp;&nbsp; <\/p>\n<h3>\u041a\u043b\u0430\u0441\u0441 GameEngine<\/h3>\n<p><strong>GameEngine.h<\/strong><\/p>\n<pre><code class=\"cpp\">#pragma once #include&lt;iostream&gt; #include\"AssetManager.h\" #include \"Player.h\" #include \"MonsterPlanet.h\"  class GameEngine { public: \/\/ \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 GameEngine(); \/\/ \u043c\u0435\u0442\u043e\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 void run(); private: \/\/ \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 AssetManager m_manager;  \/\/ \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u043a\u0440\u0430\u043d\u0430 sf::Vector2f m_resolution = sf::Vector2f(static_cast&lt;float&gt;(sf::VideoMode::getDesktopMode().width),  static_cast&lt;float&gt;(sf::VideoMode::getDesktopMode().height)); \/\/ \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043a\u043d\u043e  sf::RenderWindow m_window;  \/\/ \u0438\u0433\u0440\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 enum class State { paused, level, level_up, game_over, playing,  game_victory, game_load, splash_screen, transition, help }; \/\/ c\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u0433\u0440\u044b State m_state; \/\/ \u0438\u043a\u043e\u043d\u043a\u0430 sf::Image m_icon; \/\/ \u043e\u043a\u043d\u043e mainView sf::View m_mainView = sf::View(sf::FloatRect(0, 0, 1920, 1080)); \/\/ \u043e\u043a\u043d\u043e HUD sf::View m_hudView = sf::View(sf::FloatRect(0, 0, 1920, 1080)); \/\/ o\u0431\u0449\u0435\u0435 \u0438\u0433\u0440\u043e\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f sf::Time m_gameTimeTotal; \/\/ \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0441\u0442\u0440\u0435\u043b\u044c\u0431\u044b sf::Time m_lastPressed; \/\/ \u043c\u0438\u0440\u043e\u0432\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043c\u044b\u0448\u043a\u0438 sf::Vector2f m_mouseWorldPosition; \/\/ \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043c\u044b\u0448\u043a\u0438 \u0432 \u043e\u043a\u043d\u0435 sf::Vector2i m_mouseScreenPosition; \/\/ \u0438\u0433\u0440\u043e\u043a Player m_player; \/\/ \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f sf::IntRect m_planet; \/\/ \u0444\u043e\u043d \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f sf::VertexArray m_background; int m_level = 0; \/\/ \u041c\u0435\u0442\u043e\u0434 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439  void input(); \/\/ \u043c\u0435\u0442\u043e\u0434 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432  void update(sf::Time const&amp; deltaTime); \/\/ \u043c\u0435\u0442\u043e\u0434 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043e\u043a\u043d\u0435 void draw(); \/\/ \u0440\u0435\u0441\u0442\u0430\u0440\u0442 \u0438\u0433\u0440\u044b void restart(); \/\/ \u043d\u043e\u0432\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c void newLevel(); };<\/code><\/pre>\n<p><strong>GameEngine.cpp<\/strong><\/p>\n<pre><code class=\"cpp\">#include \"GameEngine.h\"  GameEngine::GameEngine() { \/\/ \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 m_window.create(sf::VideoMode(m_resolution.x, m_resolution.y), L\"\u041f\u0440\u043e\u0435\u043a\u0442 \u041a\u043e\u0449\u0435\u0439\", sf::Style::Default); \/\/ \u044d\u0442\u0430\u043f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u0433\u0440\u044b m_state = State::game_load; \/\/ \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u0438\u0434\u0430 m_mainView.setSize(m_resolution.x, m_resolution.y); \/\/ \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f m_planet.left = 0; m_planet.top = 0; \/\/ \u0438\u043a\u043e\u043d\u043a\u0430 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 if (!m_icon.loadFromFile(\"game.png\")) exit(3);  m_window.setIcon(194, 256, m_icon.getPixelsPtr()); }<\/code><\/pre>\n<p>\u0412 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u043a\u043d\u0430 m_window, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u0433\u0440\u044b m_state, \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u0438\u0434\u0430 m_mainView \u0438 &nbsp;\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f m_planet. <\/p>\n<pre><code class=\"cpp\">void GameEngine::input() { sf::Event event; while (m_window.pollEvent(event)) { if (event.type == sf::Event::KeyPressed) { \/\/ \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438\u0433\u0440\u044b if (m_state == State::game_load) { if ((event.key.code == sf::Keyboard::Space)) { m_state = State::splash_screen; return; } }           \/\/ \u0417\u0430\u0441\u0442\u0430\u0432\u043a\u0430 \u0438\u0433\u0440\u044b if (m_state == State::splash_screen) { if ((event.key.code == sf::Keyboard::Space)) { m_state = State::level_up; return; } }            \/\/ \u041d\u0430\u0447\u0430\u0442\u044c \u0438\u0433\u0440\u0443 if (m_state == State::level) { if ((event.key.code == sf::Keyboard::Space)) { m_state = State::playing; } } \/\/ \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0438\u0433\u0440\u044b if ((event.key.code == sf::Keyboard::Escape) || (event.type == sf::Event::Closed)) { m_window.close(); } if (m_state == State::transition) {  if ((event.key.code == sf::Keyboard::Space)) { m_state = State::level_up; return; } }  \/\/ \u0418\u0433\u0440\u0430 if (m_state == State::playing || m_state == State::transition) { \/\/ \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 if (event.key.code==sf::Keyboard::W) {  m_player.move(Player::playermove::UpPressed); } if (event.key.code == sf::Keyboard::E) {  m_player.move(Player::playermove::UpRg); } if (event.key.code == sf::Keyboard::C) {  m_player.move(Player::playermove::DownRg);  } if (event.key.code == sf::Keyboard::S) {  m_player.move(Player::playermove::DownPressed); }  if (event.key.code == sf::Keyboard::Z) {  m_player.move(Player::playermove::DownLf); }  if (event.key.code == sf::Keyboard::Q) {  m_player.move(Player::playermove::UpLf); }  if (event.key.code == sf::Keyboard::A) {  m_player.move(Player::playermove::LeftPressed);  } if (event.key.code == sf::Keyboard::D) {  m_player.move(Player::playermove::RightPressed); }  if (event.key.code == sf::Keyboard::X) {  m_player.move(Player::playermove::Stop); } } \/\/ \u043a\u043e\u043d\u0435\u0446 \u0438\u0433\u0440\u044b } }<\/code><\/pre>\n<p>\u0412 \u043c\u0435\u0442\u043e\u0434\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 void input(), \u043d\u0430\u0436\u0438\u043c\u0430\u044f \u043f\u0440\u043e\u0431\u0435\u043b, \u043c\u0435\u043d\u044f\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u0433\u0440\u044b&nbsp; \u0441 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 \u043f\u043e\u043a\u0430\u0437 \u0437\u0430\u0441\u0442\u0430\u0432\u043a\u0438, \u0434\u0430\u043b\u0435\u0435 \u043d\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0443\u0440\u043e\u0432\u043d\u044f.&nbsp; \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u0435\u0449\u0451 \u0440\u0430\u0437 \u043f\u0440\u043e\u0431\u0435\u043b \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0438\u0433\u0440\u0443. \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0432 \u044d\u0442\u043e\u043c \u0443\u0447\u0430\u0441\u0442\u043a\u0435 \u043a\u043e\u0434\u0430 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0437\u0430\u0441\u0442\u0430\u0432\u043a\u0443 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u0433\u0440\u044b \u0438 \u043f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044e.<\/p>\n<pre><code class=\"cpp\">void GameEngine::update(sf::Time const&amp; deltaTime) {  \/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043b\u043e\u0433\u0438\u043a\u0438 \u0438\u0433\u0440\u043e\u043a\u0430 m_player.update(deltaTime, sf::Mouse::getPosition()); \/\/ \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e  sf::Vector2f playerPosition(m_player.getCenter()); \/\/ \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0446\u0435\u043d\u0442\u0440 \u043e\u043a\u043d\u0430 mainView, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0438\u0433\u0440\u043e\u043a\u0430 m_mainView.setCenter(m_player.getCenter());     \/\/ \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c if (m_state == State::level_up) { m_level++; if (m_level &gt; 5) {\/\/ \u0412\u044b\u0438\u0433\u0440\u0430\u043b\u0438 \u0438\u0433\u0440\u0443 m_state = State::game_victory; } else {\/\/ \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c newLevel(); m_state = State::level; } } } \/\/ \u043c\u0435\u0442\u043e\u0434 \u0440\u0438\u0441\u0443\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043e\u043a\u043d\u0435 void GameEngine::draw() {  if (m_state == State::playing || m_state == State::transition) { \/\/ \u043e\u0447\u0438\u0449\u0430\u0435\u043c \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043a\u043d\u043e         m_window.clear(); \/\/ \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432\u0438\u0434 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0438\u0433\u0440\u044b m_window.setView(m_mainView); \/\/ \u0440\u0438\u0441\u0443\u0435\u043c \u0444\u043e\u043d \u0438\u0433\u0440\u044b m_window.draw(m_background, &amp;AssetManager::GetTexture(\"graphics\/plan.png\")); \/\/ \u0440\u0438\u0441\u0443\u0435\u043c \u0438\u0433\u0440\u043e\u043a\u0430 m_player.draw(m_window); } m_window.display(); } \/\/ \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0446\u0438\u043a\u043b void GameEngine::run() { \/\/ \u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0447\u0430\u0441\u044b sf::Clock clock; \/\/ \u0426\u0438\u043a\u043b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u043a\u0430 \u043e\u043a\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u043e while (m_window.isOpen()) { \/\/ \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 dt sf::Time dt = clock.restart();  input(); update(dt); draw(); } } \/\/ \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u0438\u0433\u0440\u044b void GameEngine::restart() { m_player.resetPlayerStats(); } \/\/ \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f void GameEngine::newLevel() { m_planet.width = 10000 * m_level; m_planet.height = 10000 * m_level; m_background.clear(); int tileSize = createBackground(m_background, m_planet, m_level); m_player.spawn(m_planet, m_resolution, tileSize); } <\/code><\/pre>\n<p><strong>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442&#8230;<\/strong><\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0432 \u0432\u0438\u0434\u0435\u043e&nbsp;<strong>\u00abSFML C++ games \u0428\u0443\u0442\u0435\u0440 \u041f\u0440\u043e\u0435\u043a\u0442 \u041a\u043e\u0449\u0435\u0439 #1\u00bb<\/strong><\/p>\n<p><iframe id=\"647a326b9ac2a5a9641d54f0\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/647a326b9ac2a5a9641d54f0\" class=\"embed_video embed__content\" allowfullscreen=\"true\"><\/iframe><\/p>\n<p><a href=\"https:\/\/github.com\/cnet-sudo\/Mincer.git\" rel=\"noopener noreferrer nofollow\">\u041a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/a><\/p>\n<p><a href=\"https:\/\/t.me\/C_Verhovcevo_NVK\" rel=\"noopener noreferrer nofollow\">\u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u043c \u043a\u0430\u043d\u0430\u043b &#171;\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0433\u0440 \u0421++\/\u0421#<\/a><\/p>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/728654\/\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0442\u0435\u043c\u0430<\/a><\/p>\n<\/div>\n<\/div>\n<p> <!----> <!----><\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/739584\/\"> https:\/\/habr.com\/ru\/articles\/739584\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/728654\/\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0442\u0435\u043c\u0430<\/a><\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0428\u0443\u0442\u0435\u0440\u044b \u2013 \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0436\u0430\u043d\u0440\u043e\u0432 \u0432\u0438\u0434\u0435\u043e\u0438\u0433\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 90-\u0445 \u0433\u043e\u0434\u043e\u0432. \u041f\u0435\u0440\u0432\u044b\u0435 \u0448\u0443\u0442\u0435\u0440\u044b \u0431\u044b\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0434\u043b\u044f \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u0432 \u0438 \u0438\u043c\u0435\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0443\u044e \u0433\u0440\u0430\u0444\u0438\u043a\u0443 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435. \u041e\u0434\u043d\u0430\u043a\u043e, \u043e\u043d\u0438 \u0431\u044b\u043b\u0438 \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b, \u0438 \u0432 \u0441\u043a\u043e\u0440\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0442\u0430\u043b\u0438 \u0441\u0430\u043c\u044b\u043c\u0438 \u043f\u0440\u043e\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u043c\u0438 \u0438\u0433\u0440\u0430\u043c\u0438.<\/p>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0438\u0433\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u043a \u0436\u0430\u043d\u0440\u0443 \u0448\u0443\u0442\u0435\u0440\u043e\u0432, \u0431\u044b\u043b\u0430 Wolfenstein 3D, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 id Software \u0432 1992 \u0433\u043e\u0434\u0443. \u041e\u043d\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u0438\u0433\u0440\u043e\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0433\u0440\u043e\u043a \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u043c \u043e\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043b\u0438\u0446\u0430, \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u043c \u0432\u0440\u0430\u0433\u0430\u043c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. Wolfenstein 3D \u0442\u0430\u043a\u0436\u0435 \u0441\u0442\u0430\u043b\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u0438\u0433\u0440\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430 3D-\u0433\u0440\u0430\u0444\u0438\u043a\u0443 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041e\u043d\u0430 \u0431\u044b\u043b\u0430 \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430 \u0438 \u0441\u0442\u0430\u043b\u0430 \u043e\u0441\u043d\u043e\u0432\u043e\u0439 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0448\u0443\u0442\u0435\u0440\u043e\u0432.<\/p>\n<p>\u0412 1993 \u0433\u043e\u0434\u0443 id Software \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0430 \u0438\u0433\u0440\u0443 Doom, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0430\u043b\u0430 \u0435\u0449\u0435 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0439, \u0447\u0435\u043c Wolfenstein 3D. Doom \u0431\u044b\u043b\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u0438\u0433\u0440\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u0435\u0440, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0438\u0433\u0440\u043e\u043a\u0430\u043c \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u043c\u0438\u0440\u0430 \u0441\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442.<\/p>\n<p>\u0412 1996 \u0433\u043e\u0434\u0443 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f Valve \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0430 \u0438\u0433\u0440\u0443 Half-Life, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0430\u043b\u0430 \u043d\u043e\u0432\u043e\u0439 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0435\u0439 \u0436\u0430\u043d\u0440\u0430. \u041e\u043d\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u043d\u043e\u0432\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0439 \u0433\u0435\u0439\u043c\u043f\u043b\u0435\u0439, \u0441\u044e\u0436\u0435\u0442 \u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u043e\u0432\u0443\u044e \u0433\u0440\u0430\u0444\u0438\u043a\u0443 \u0438 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u0432\u0438\u0436\u043e\u043a.<\/p>\n<p>\u0428\u0443\u0442\u0435\u0440\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0441\u0435\u0439 \u0434\u0435\u043d\u044c, \u0438 \u0438\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0443\u0433\u0430\u0441\u0430\u0435\u0442. \u041e\u043d\u0438 \u0441\u0442\u0430\u043b\u0438 \u043d\u0435\u043e\u0442\u044a\u0435\u043c\u043b\u0435\u043c\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0438\u0433\u0440\u043e\u043a\u0430\u043c \u043e\u043a\u0443\u043d\u0443\u0442\u044c\u0441\u044f \u0432 \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043c\u0438\u0440 \u0441\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438 \u044d\u043a\u0448\u0435\u043d\u0430.<\/p>\n<h3>\u0428\u0443\u0442\u0435\u0440 \u201c\u041f\u0440\u043e\u0435\u043a\u0442 \u041a\u043e\u0449\u0435\u0439\u201d<\/h3>\n<\/p>\n<figure class=\"full-width\"><\/figure>\n<figure class=\"full-width\"><\/figure>\n<h3>\u041a\u043b\u0430\u0441\u0441 Player<\/h3>\n<p><strong>player.h<\/strong><\/p>\n<pre><code class=\"cpp\">#pragma once #include\"Animator.h\"  class Player { public: Player(); \/\/ \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430 enum class playermove { UpPressed, UpRg, UpLf, DownPressed,  DownRg, DownLf, LeftPressed, RightPressed, Stop }; \/\/ \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 \u043d\u0430 \u0438\u0433\u0440\u043e\u0432\u043e\u043c \u043f\u043e\u043b\u0435 void spawn(sf::IntRect planet, sf::Vector2f resolution, int tileSize); \/\/ \u043c\u0435\u0442\u043e\u0434 \u0440\u0435\u0441\u0442\u0430\u0440\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438\u0433\u0440\u043e\u043a\u0430 void resetPlayerStats(); \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0436\u0438\u0437\u043d\u0438 \u0438\u0433\u0440\u043e\u043a\u0430 bool getLive() const; \/\/ \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 \u0438\u0433\u0440\u043e\u043a\u043e\u043c bool hit(sf::Time timeHit); \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u0434\u0430\u0432\u043d\u043e \u0431\u044b\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0443\u0434\u0430\u0440 \u043f\u043e \u0438\u0433\u0440\u043e\u043a\u0443 sf::Time getLastHitTime() const; \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438\u0433\u0440\u043e\u043a\u0430 sf::FloatRect getPosition() const; \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438\u0433\u0440\u043e\u043a\u0430 sf::Vector2f getCenter() const; \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u0433\u043e\u043b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0438\u0433\u0440\u043e\u043a\u0430 float getRotation() const; \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043f\u0438\u044e \u0441\u043f\u0440\u0430\u0439\u0442\u0430 \u0438\u0433\u0440\u043e\u043a\u0430 sf::Sprite getSprite() const; \/\/ \u0440\u0438\u0441\u0443\u0435\u043c \u0438\u0433\u0440\u043e\u043a\u0430 void draw(sf::RenderWindow&amp; win) const; \/\/ \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0438\u0433\u0440\u043e\u043a\u0430 void move(playermove mov); \/\/ \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438  void update(sf::Time deltaTime, sf::Vector2i mousePosition); \/\/ \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f  void upgradeHealth(float heal); \/\/ \u043f\u043e\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 void increaseHealthLevel(float amount); \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f \u0443 \u0438\u0433\u0440\u043e\u043a\u0430 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442? float getHealth() const; \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 float getMaxHealth() const;  private: \/\/ \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0436\u0438\u0437\u043d\u044c \u0438\u0433\u0440\u043e\u043a\u0430 const float START_HEALTH = 200; \/\/ \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430 sf::Vector2f m_Position; \/\/ \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 \u0441\u043f\u0440\u0430\u0439\u0442 \u0438  \u043e\u0431\u044a\u0435\u043a\u0442 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 sf::Sprite m_Sprite; Animator m_AnimPlayer = Animator(m_Sprite); \/\/ \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u0430 bool m_animMove = false; \/\/ \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u043a\u0440\u0430\u043d\u0430 sf::Vector2f m_Resolution; \/\/ \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f  sf::IntRect m_planet; \/\/ \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f  int m_TileSize; \/\/ \u0432 \u043a\u0430\u043a\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438(\u044f\u0445) \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f \u0438\u0433\u0440\u043e\u043a \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 playermove m_move; \/\/ \u0436\u0438\u0432\u043e\u0439 \u043b\u0438 \u0438\u0433\u0440\u043e\u043a bool m_live = true; \/\/ \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 float m_Health; \/\/ \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 float m_MaxHealth; \/\/ \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0443\u0434\u0430\u0440\u0430 \u043f\u043e \u0438\u0433\u0440\u043e\u043a\u0443  sf::Time m_LastHit; \/\/ \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430 sf::Time m_time_moving; \/\/ \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 float m_Speed;  };<\/code><\/pre>\n<p><strong>player.cpp<\/strong><\/p>\n<pre><code class=\"cpp\">#include \"Player.h\"  Player::Player() { \/\/ \u0437\u0430\u0434\u0430\u0451\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0438\u0433\u0440\u043e\u043a\u0430 m_Speed = 2; m_Health = START_HEALTH; m_MaxHealth = START_HEALTH; m_move = playermove::Stop; m_TileSize = 0; \/\/ \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430 auto&amp; idleForward = m_AnimPlayer.CreateAnimation(\"idleForward\", \"graphics\/player.png\", sf::seconds(0.5), true); idleForward.AddFrames(sf::Vector2i(0, 0), sf::Vector2i(135, 105), 4, 1); auto&amp; dead = m_AnimPlayer.CreateAnimation(\"dead\", \"graphics\/player.png\", sf::seconds(0.5), false); dead.AddFrames(sf::Vector2i(405, 0), sf::Vector2i(135, 105), 4, 1); m_AnimPlayer.SwitchAnimation(\"idleForward\"); m_AnimPlayer.Update(sf::seconds(0)); \/\/ \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441\u043f\u0440\u0430\u0439\u0442\u0430 \u0432 \u0446\u0435\u043d\u0442\u0440  m_Sprite.setOrigin(m_Sprite.getGlobalBounds().width \/ 2, m_Sprite.getGlobalBounds().height \/ 2); }<\/code><\/pre>\n<p>\u0412 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 <strong>player<\/strong> \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438 \u0433\u0438\u0431\u0435\u043b\u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430. \u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0434\u043b\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0431\u0435\u0440\u0451\u043c \u0438\u0437 \u0444\u0430\u0439\u043b\u0430<strong> player.png.<\/strong><\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/habr.com\/ru\/articles\/720342\/\" rel=\"noopener noreferrer nofollow\">&#171;\u041f\u043e\u043a\u0430\u0434\u0440\u043e\u0432\u0430\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f&#187;.<\/a> <\/p>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 setOrigin(m_Sprite.getGlobalBounds().width \/ 2, m_Sprite.getGlobalBounds().height \/ 2) \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043f\u0440\u0430\u0439\u0442\u0430 \u0432 \u0446\u0435\u043d\u0442\u0440 \u0441\u043f\u0440\u0430\u0439\u0442\u0430.<\/p>\n<figure class=\"\"><\/figure>\n<pre><code class=\"cpp\">\/\/ \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u043c\u0438\u0440\u0435 void Player::spawn(sf::IntRect planet, sf::Vector2f resolution, int tileSize) {  \/\/ \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u0446\u0435\u043d\u0442\u0440 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f m_Position.x = static_cast&lt;float&gt;(planet.width \/ 2); m_Position.y = static_cast&lt;float&gt;(planet.height \/ 2); \/\/ \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0434\u0435\u0442\u0430\u043b\u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f m_planet.left = planet.left; m_planet.width = planet.width; m_planet.top = planet.top; m_planet.height = planet.height; \/\/ \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u043b\u0438\u0442\u043e\u043a m_TileSize = tileSize; \/\/ \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u043a\u0440\u0430\u043d\u0430 m_Resolution.x = resolution.x; m_Resolution.y = resolution.y; }<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 void spawn(sf::IntRect planet, sf::Vector2f resolution, int tileSize), \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043b\u0435\u0435\u0440\u0430 \u0432 \u0438\u0433\u0440\u043e\u0432\u043e\u043c \u043c\u0438\u0440\u0435, \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442: \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043c\u0438\u0440\u0430 planet, \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u043a\u0440\u0430\u043d\u0430 resolution, \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u043b\u0438\u0442\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b tileSize, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043c\u0438\u0440.  <\/p>\n<pre><code class=\"cpp\">\/\/ \u0441\u0431\u0440\u043e\u0441 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0438\u0433\u0440\u043e\u043a\u0430 void Player::resetPlayerStats() {  m_Health = START_HEALTH; m_MaxHealth = START_HEALTH; m_live = true; m_AnimPlayer.SwitchAnimation(\"idleForward\"); m_AnimPlayer.Update(sf::seconds(0)); }  \/\/ \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 \u0436\u0438\u0432 \u043c\u0451\u0440\u0442\u0432 bool Player::getLive() const {  return m_live; }  \/\/ \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 sf::Time Player::getLastHitTime() const {  return m_LastHit; }  \/\/ \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u043d\u0430 \u0438\u0433\u0440\u043e\u043a\u043e\u043c bool Player::hit(sf::Time timeHit) {  if (timeHit.asMilliseconds()- m_LastHit.asMilliseconds() &gt; 200 &amp;&amp; m_Health&gt;0) {  m_LastHit = timeHit; if (m_Health&gt;100) m_Health -= 10; else m_Health -= 5; if (m_Health &lt; 0) m_Health = 0; return true; } else {  return false; } }<\/code><\/pre>\n<p>  \u041c\u0435\u0442\u043e\u0434 bool hit(sf::Time timeHit) \u043d\u0430\u043d\u043e\u0441\u0438\u0442 \u0443\u0440\u043e\u043d \u0438\u0433\u0440\u043e\u043a\u0443 \u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e \u0435\u0433\u043e \u0436\u0438\u0437\u043d\u044c m_Health \u043d\u0435 \u0440\u0430\u0432\u043d\u0430 \u043d\u0443\u043b\u044e \u0438 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 timeHit.asMilliseconds()- m_LastHit.asMilliseconds() \u043d\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 200 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434. \u041c\u0435\u0442\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 \u2013 \u0443\u0440\u043e\u043d \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u0438\u043b\u0438 \u043d\u0435\u0442. \u0412 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043c\u0435\u0442\u043e\u0434\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 timeHit. <\/p>\n<pre><code class=\"cpp\">\/\/ \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430 sf::FloatRect Player::getPosition() const {  auto myGlobalBounds = sf::FloatRect(m_Sprite.getGlobalBounds().left+20, m_Sprite.getGlobalBounds().top+20, m_Sprite.getGlobalBounds().width - 40, m_Sprite.getGlobalBounds().height - 40);  return myGlobalBounds; }<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 FloatRect getPosition() \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043e\u0431\u043b\u0430\u0441\u0442\u0438, \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u043c\u044b\u0435 \u043f\u043b\u0435\u0435\u0440\u043e\u043c.&nbsp; \u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u043b\u0435\u0435\u0440\u0430 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438. \u0412 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432\u043d\u0435\u0441\u0435\u043d\u044b \u043f\u043e\u043f\u0440\u0430\u0432\u043a\u0438&nbsp; \u0433\u0440\u0430\u043d\u0438\u0446 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438.<\/p>\n<figure class=\"bordered full-width\"><\/figure>\n<pre><code class=\"cpp\">\/\/ \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430 sf::Vector2f Player::getCenter() const {  return m_Position; }  \/\/ \u0443\u0433\u043e\u043b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0438\u0433\u0440\u043e\u043a\u0430 float Player::getRotation() const {  return m_Sprite.getRotation(); }  \/\/ \u0441\u043f\u0440\u0430\u0439\u0442 \u0438\u0433\u0440\u043e\u043a\u0430 sf::Sprite Player::getSprite() const {  return m_Sprite; }  \/\/ \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0436\u0438\u0437\u043d\u0438 \u0438\u0433\u0440\u043e\u043a\u0430 float Player::getHealth() const {  return m_Health; }  \/\/ \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0436\u0438\u0437\u043d\u0438 \u0438\u0433\u0440\u043e\u043a\u0430 float Player::getMaxHealth() const { return m_MaxHealth; }  \/\/ \u0440\u0438\u0441\u0443\u0435\u043c \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043e\u043a\u043d\u0435 void Player::draw(sf::RenderWindow&amp; win) const {  win.draw(m_Sprite); }<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 void draw(sf::RenderWindow&amp; win) const \u0440\u0438\u0441\u0443\u044e\u0449\u0438\u0439 \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043e\u043a\u043d\u0435, \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043a\u043d\u043e win.&nbsp; <\/p>\n<pre><code class=\"cpp\">\/\/ \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 void Player::move(playermove mov) {  m_move = mov; }<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 void move(playermove mov) \u043c\u0435\u043d\u044f\u0435\u0442 \u0432\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u043b\u0435\u0435\u0440\u0430. \u0412 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f mov. <\/p>\n<pre><code class=\"cpp\">\/\/ \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0436\u0438\u0437\u043d\u0438 void Player::upgradeHealth(float heal) {  if (m_Health!=0) m_MaxHealth += heal; }<\/code><\/pre>\n<p>\u0412 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043c\u0435\u0442\u043e\u0434\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0436\u0438\u0437\u043d\u0438 void upgradeHealth(float heal), \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0432\u0435\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 heal, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0436\u0438\u0437\u043d\u0438.&nbsp; <\/p>\n<pre><code class=\"cpp\">\/\/ \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0436\u0438\u0437\u043d\u0438 \u0438\u0433\u0440\u043e\u043a\u0430 void Player::increaseHealthLevel(float amount) {  if (m_Health &gt; 0 &amp;&amp; m_Health&lt; m_MaxHealth) { m_Health += amount; \/\/ \u041d\u043e \u043d\u0435 \u0432\u044b\u0448\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0430 if (m_Health &gt; m_MaxHealth){  m_Health = m_MaxHealth; } } }<\/code><\/pre>\n<p>\u0412 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043c\u0435\u0442\u043e\u0434\u0430 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 void increaseHealthLevel(float amount), \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0435\u0434\u0438\u043d\u0438\u0446 amount, \u0434\u043b\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0436\u0438\u0437\u043d\u0438 \u0438\u0433\u0440\u043e\u043a\u0430 m_Health.&nbsp;    <\/p>\n<pre><code class=\"cpp\">\/\/ \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0438\u0433\u0440\u043e\u043a\u0430 void Player::update(sf::Time deltaTime, sf::Vector2i mousePosition) { m_time_moving += deltaTime; \/\/ \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430 if (m_animMove &amp;&amp; m_Health&gt;0) m_AnimPlayer.Update(deltaTime); \/\/ \u0435\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a \u043f\u043e\u0442\u0435\u0440\u044f\u043b \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 if (m_Health &lt;= 0)  { if (m_AnimPlayer.GetCurrentAnimationName() != \"dead\") m_AnimPlayer.SwitchAnimation(\"dead\");  m_AnimPlayer.Update(deltaTime);  if (m_AnimPlayer.getEndAnim()) { m_live = false; } } \/\/ \u043d\u0430\u0447\u0430\u043b\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u0435\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a \u043f\u043e\u043b\u043e\u043d \u0441\u0438\u043b else {  if (m_time_moving&gt; sf::microseconds(5000)) {  m_time_moving = sf::microseconds(0);  switch (m_move){  case Player::playermove::UpPressed: m_Position.y -= m_Speed; m_animMove = true; break; case Player::playermove::UpRg: m_Position.y -= m_Speed \/ (100 \/ (m_Resolution.y \/ (m_Resolution.x \/ 100))); m_Position.x += m_Speed; m_animMove = true; break; case Player::playermove::UpLf: m_Position.y -= m_Speed \/ (100 \/ (m_Resolution.y \/ (m_Resolution.x \/ 100))); m_Position.x -= m_Speed; m_animMove = true; break; case Player::playermove::DownPressed: m_Position.y += m_Speed; m_animMove = true; break; case Player::playermove::DownRg: m_Position.y += m_Speed \/ (100 \/ (m_Resolution.y \/ (m_Resolution.x \/ 100)));<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\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-348329","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/348329","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=348329"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/348329\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=348329"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=348329"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=348329"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}