{"id":363152,"date":"2024-05-21T01:49:53","date_gmt":"2024-05-21T01:49:53","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=363152"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=363152","title":{"rendered":"<span>PyZelda \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438 \u0438\u043b\u0438 \u043a\u0430\u043a \u0433\u0435\u0439\u043c\u0434\u0435\u0432\u0438\u0442\u044c \u0431\u0435\u0437 Unreal, Unity \u0438 \u043a\u0440\u0435\u0434\u0438\u0442\u043e\u0432<\/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<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/hk\/pc\/jt\/hkpcjtucu8_q8r5waklrrytfd78.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/hk\/pc\/jt\/hkpcjtucu8_q8r5waklrrytfd78.jpeg\" data-blurred=\"true\"\/><\/figure>\n<h3>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0425\u0430\u0431\u0440\u044b \u0438 \u0425\u0430\u0431\u0440\u043e\u0447\u043a\u0438, \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u0435\u0440\u0435\u0434 \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0451\u0439 \u043e\u0431\u0441\u0443\u0434\u0438\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441 \u0446\u0435\u043b\u0435\u0441\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e\u0441\u0442\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0434\u0432\u0438\u0436\u043e\u043a, \u0432\u043c\u0435\u0441\u0442\u043e \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439. \u0415\u0441\u0442\u044c \u043a\u0443\u0447\u0430 \u0441\u0442\u0430\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0438\u0448\u0443\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0434\u0432\u0438\u0436\u043a\u0438 \u043e\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0434\u043e \u043c\u0435\u043d\u0435\u0435. \u042f \u0431\u044b \u0445\u043e\u0442\u0435\u043b \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0432\u043e\u043f\u0440\u043e\u0441: &#171;\u041a\u0430\u043a \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0437\u0443\u0447\u0430\u043b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043d\u043e\u0433\u043e \u043b\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0433\u0435\u0439\u043c\u0434\u0435\u0432\u043e\u043c?&#187;. \u041e\u0431\u044b\u0447\u043d\u043e, \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043f\u0443\u0442\u0438 \u0432 \u0433\u0435\u0439\u043c\u0434\u0435\u0432:<\/p>\n<ol>\n<li>\n<p>\u0423\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u0443\u0442\u044c. \u042d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0433\u0440\u0430\u0435\u0442 \u0432 \u0438\u0433\u0440\u044b \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u0440\u0435\u0448\u0438\u0442 \u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u0442\u044c. \u0422\u043e\u0433\u0434\u0430, \u043e\u043d \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0433\u0434\u0435 \u0435\u043c\u0443 \u0443\u0447\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u043e\u043c\u0443 \u0438 \u0432\u044b\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0438\u0433\u0440\u043e\u0432\u044b\u0435 \u0434\u0432\u0438\u0436\u043a\u0438 \u0438 C-\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u043a \u043d\u0438\u043c (\u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e, C#).<\/p>\n<\/li>\n<li>\n<p>\u041f\u0443\u0442\u044c \u043f\u0440\u043e\u0433\u0435\u0440\u043e\u0432. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0443\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u043e\u0439 \u0438 \u043f\u0438\u0448\u0435\u0442 \u043a\u043e\u0434. \u0422\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435, \u0432\u0435\u0437\u0434\u0435 \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u043a\u043e\u0434 \u2014 \u0435\u0441\u0442\u044c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440. \u0426\u0438\u0444\u0440\u043e\u0432\u044b\u0435 \u0440\u0430\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0438\u0433\u0440\u044b) \u043d\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u043c\u0438\u043c\u043e \u0442\u0435\u0445 \u043b\u044e\u0434\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043f\u0438\u0448\u0443\u0442 \u043a\u043e\u0434. \u0422\u0430\u043a, <a href=\"https:\/\/www.stxnext.com\/blog\/python-for-game-development\/\" rel=\"noopener noreferrer nofollow\">\u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u0435\u0440\u043e\u0432 \u0440\u0435\u0448\u0430\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0438\u0433\u0440\u0443<\/a> \u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043f\u0443\u0442\u044c \u0432 \u0433\u0435\u0439\u043c\u0434\u0435\u0432. \u041e\u0431 \u044d\u0442\u043e\u043c \u043f\u0443\u0442\u0438 \u043c\u044b \u0438 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c.<\/p>\n<\/li>\n<\/ol>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0442\u044b \u0445\u043e\u0447\u0435\u0448\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u2014 \u0438\u0434\u0438 \u0443\u0447\u0438\u0441\u044c \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0439 \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u0432\u044b\u043a\u0438. \u041e\u0441\u0432\u0430\u0438\u0432\u0430\u0439 Unity \u0438\u043b\u0438 Unreal \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0439 \u0432 \u043a\u0440\u0443\u0442\u043e\u0439 <a href=\"https:\/\/dtf.ru\/gameindustry\/1033019-igrovye-studii-i-mesta-ih-obitaniya-v-rossii\" rel=\"noopener noreferrer nofollow\">\u0433\u0435\u0439\u043c\u0434\u0435\u0432-\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438<\/a>. \u0412 \u044d\u0442\u043e\u043c \u0435\u0441\u0442\u044c \u0434\u043e\u043b\u044f \u043f\u0440\u0430\u0432\u0434\u044b. \u041e\u0434\u043d\u0430\u043a\u043e, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u0441\u0432\u043e\u0451 \u0445\u043e\u0431\u0431\u0438 \u0432 \u0440\u0430\u0431\u043e\u0442\u0443 \u2014 \u0434\u0435\u043b\u043e \u043d\u0435 \u0431\u043b\u0430\u0433\u043e\u0440\u0430\u0437\u0443\u043c\u043d\u043e\u0435. \u0412\u044b\u0433\u043e\u0440\u0430\u043d\u0438\u0435 \u0441\u043a\u0430\u0436\u0435\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u0422\u043e\u0433\u0434\u0430 \u0432\u0430\u043c \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043b\u0438\u0431\u043e \u043c\u043e\u0434 \u043d\u0430 \u0438\u0433\u0440\u0443 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/skillbox.ru\/media\/gamedev\/7-igr-na-source-sozdannykh-za-predelami-valve\/\" rel=\"noopener noreferrer nofollow\">\u043d\u0430 \u0434\u0432\u0438\u0436\u043a\u0435 Source<\/a>) \u0438\u043b\u0438 \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c \u0432 <a href=\"https:\/\/dtf.ru\/games\/51311-interaktivnye-grezy-kak-ustroen-redaktor-dreams-i-chto-tam-mozhno-sozdat\" rel=\"noopener noreferrer nofollow\">\u0413\u0440\u0451\u0437\u044b<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u043e\u0436\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430. \u0422\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442, \u043d\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: &#171;\u0412\u044b\u0431\u043e\u0440 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u044b&#187;.<\/p>\n<h3>\u0412\u044b\u0431\u043e\u0440 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u044b<\/h3>\n<p>\u0412\u0441\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0434 \u0438\u0433\u0440\u043e\u0439:<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u0433\u0440\u0443 \u043d\u0430 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u043c \u0434\u0432\u0438\u0436\u043a\u0435-\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435<\/p>\n<\/li>\n<li>\n<p>\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u043e\u0434 \u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0434\u0432\u0438\u0436\u043e\u043a<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0433\u0440\u0443<\/p>\n<\/li>\n<\/ol>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0445\u043e\u0440\u043e\u0448 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443, \u043d\u043e \u0438 \u0438\u043c\u0435\u0435\u0442 \u0440\u044f\u0434 \u043d\u0435\u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043e\u043a. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b\u0431\u0440\u0430\u0432 \u043f\u0443\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u0433\u0440\u044b \u043d\u0430 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u043c \u0434\u0432\u0438\u0436\u043a\u0435 \u0432\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0451\u0442\u0435\u0441\u044c \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430, \u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438 \u043c\u043e\u043d\u0435\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0415\u0441\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u043e\u0434\u043e\u043f\u0443\u0442\u044c \u2014 \u0432\u044b \u0441\u0440\u0430\u0437\u0443 \u0441\u0442\u043e\u043b\u043a\u043d\u0451\u0442\u0435\u0441\u044c \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u043e\u0442\u043a\u0440\u044b\u0442 \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438\u0433\u0440, \u0430 \u0442\u0430\u043a\u0436\u0435, \u043d\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u043e\u0434 \u0445\u043e\u0442\u044c \u0437\u0430 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0446\u0435\u043d\u0443. \u041f\u0443\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0432 \u0433\u0435\u0439\u043c\u0434\u0435\u0432\u0435 \u0434\u0438\u043a\u0438\u0439 \u043f\u0440\u0438\u043f\u0430\u0434\u043e\u043a, \u043c\u043e\u043b &#171;\u0414\u0430 \u0437\u0430\u0447\u0435\u043c \u043e\u043f\u044f\u0442\u044c \u0438\u0434\u0442\u0438 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0441\u0440\u043e\u043a\u0438 \u0433\u043e\u0440\u044f\u0442, \u0430 \u0441\u0430\u043c \u0442\u044b \u0435\u0449\u0451 \u043d\u0435 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e?&#187;. \u0414\u0430\u043d\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u0432\u0435\u0441\u044c\u043c\u0430 \u043d\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u0435\u043d \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 \u0438\u0437-\u0437\u0430 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0445\u043e\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0432\u0435\u0434\u044c \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 \u0434\u0432\u0438\u0436\u043e\u043a, \u043a\u043e\u043c\u0443-\u0442\u043e \u0441 \u043d\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p>\u0422\u0430\u043a \u0437\u0430\u0447\u0435\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c &#171;\u0441\u043b\u043e\u0436\u043d\u044b\u0439&#187; \u043f\u0443\u0442\u044c? \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043d\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u043d \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u041b\u0438\u0447\u043d\u043e \u043c\u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 C# \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Unity, \u0447\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 Python. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043b\u044e\u0434\u0438 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442 \u0441\u0430\u043c \u0434\u0432\u0438\u0436\u043e\u043a. \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u043f\u0440\u0435\u043f\u043e\u0434\u0430\u044e \u0432 <a href=\"https:\/\/obe.ru\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0441\u0442\u0438\u0442\u0443\u0442\u0435 &#171;\u0411\u0438\u0437\u043d\u0435\u0441\u0430 \u0438 \u0414\u0438\u0437\u0430\u0439\u043d\u0430&#187;<\/a>. \u042d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u043f\u0440\u043e\u0444\u0438\u043b\u044c\u043d\u044b\u0445 \u0443\u0447\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0439, \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0433\u0435\u0439\u043c\u0434\u0435\u0432\u043e\u043c. \u0418 \u0432\u043e\u0442 \u0443 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u044f \u0441\u043f\u0440\u043e\u0441\u0438\u043b \u0437\u0430\u0447\u0435\u043c \u0438\u043c \u0434\u0432\u0438\u0436\u043e\u043a. \u041a\u0430\u043a\u043e\u0432\u043e \u0431\u044b\u043b\u043e \u043c\u043e\u0451 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u0432\u043e\u043e\u0431\u0449\u0435 \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u043d\u0443\u0436\u0435\u043d. \u0421\u043f\u043e\u0439\u043b\u0435\u0440, \u043d\u0435 \u0438\u0437-\u0437\u0430 \u043f\u0440\u0435\u0441\u0435\u0442\u043e\u0432.<\/p>\n<h3>\u0417\u0430\u0447\u0435\u043c \u0432\u0430\u043c \u0434\u0432\u0438\u0436\u043e\u043a?!<\/h3>\n<p>\u041f\u043e \u0441\u0443\u0442\u0438, \u0434\u0432\u0438\u0436\u043e\u043a \u0440\u0435\u0448\u0430\u0435\u0442 \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0442\u0440\u0438, \u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u0430:<\/p>\n<ol>\n<li>\n<p><strong>\u0424\u0438\u0437\u0438\u043a\u0430<\/strong>. \u0415\u0441\u043b\u0438 \u0432\u044b \u043e\u043a\u043e\u043d\u0447\u0438\u043b\u0438 \u0444\u0438\u0437\u043c\u0430\u0442, \u0432\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435 \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043a\u043b\u044f\u043d\u043d\u043e\u0433\u043e \u0448\u0430\u0440\u0430 \u0432\u0435\u0441\u043e\u043c \u0432 2 \u043a\u0438\u043b\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430 \u0434\u043e\u0441\u043a\u0443 \u0438\u0437 \u0434\u0443\u0431\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043b\u0435\u0436\u0438\u0442 \u043f\u043e\u0434 \u0443\u0433\u043b\u043e\u043c 32 \u0433\u0440\u0430\u0434\u0443\u0441\u0430. \u0422\u0430\u043a\u0436\u0435, \u043d\u0443\u0436\u043d\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441 \u043a\u0430\u043a\u043e\u0439 \u0432\u044b\u0441\u043e\u0442\u044b \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043f\u0430\u0441\u0442\u044c \u0448\u0430\u0440, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0431\u0438\u0442\u044c\u0441\u044f. \u0414\u0432\u0438\u0436\u043e\u043a \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u044d\u0442\u0443 \u0444\u0438\u0437\u0438\u043a\u0443 \u0437\u0430 \u0432\u0430\u0441, \u0430 \u0432\u044b \u043b\u0438\u0448\u044c \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0435\u0441\u044c \u043a \u0442\u0435\u043c \u0438\u043b\u0438 \u0438\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c.<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u0430\u0439\u043b\u0441\u0435\u0442\u044b<\/strong>. \u0422\u0430\u0439\u043b \u2014 \u044d\u0442\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 (\u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e, \u043a\u0430\u0440\u0442). \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u0439\u043b\u043e\u0432 <a href=\"https:\/\/habr.com\/ru\/articles\/470099\/\" rel=\"noopener noreferrer nofollow\">\u0432\u0435\u0441\u044c\u043c\u0430 \u044d\u043d\u0435\u0440\u0433\u043e\u0437\u0430\u0442\u0440\u0430\u0442\u043d\u044b\u0439<\/a>, \u0430 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u0442\u0430\u0439\u043b\u043e\u0432 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0434\u0435\u043b\u043e. \u041f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0433\u0434\u0435 \u043b\u0435\u0436\u0438\u0442 \u043a\u0430\u043c\u0435\u043d\u044c, \u0430 \u0433\u0434\u0435 \u0437\u0435\u043c\u043b\u044f \u0438\u043b\u0438 \u0432\u043e\u0434\u0430. \u0412 \u0434\u0432\u0438\u0436\u043a\u0430\u0445 \u0442\u0438\u043f\u0430 Unreal \u0438\u043b\u0438 Unity \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0441\u043b\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u0438 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0435\u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u0438\u0437 \u0442\u0430\u0439\u0442\u043b\u043e\u0432 \u043a\u0430\u0440\u0442\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>\u0410\u043d\u0438\u043c\u0430\u0446\u0438\u044f<\/strong>. \u0421\u0430\u043c\u044b\u0439 \u0441\u043f\u043e\u0440\u043d\u044b\u0439 \u043f\u0443\u043d\u043a\u0442. \u0412 \u0434\u0432\u0438\u0436\u043a\u0430\u0445 \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u2014 \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u041a\u0430\u0436\u0434\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u043c\u0435\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u043f\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c x, y, z \u0438 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0432 \u0441\u0430\u043c\u043e\u043c \u0434\u0432\u0438\u0436\u043a\u0435 \u043f\u0443\u0442\u0451\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f, \u0441\u0436\u0430\u0442\u0438\u044f \u0438\u043b\u0438 \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u041d\u043e \u0432\u0430\u0436\u043d\u043e\u0435 \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435, \u043f\u0440\u043e\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u043f\u043e x, y, z \u2014 \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u0438\u0434\u0435\u044f. \u041a\u0443\u0434\u0430 \u043d\u0430\u0434\u0451\u0436\u043d\u0435\u0435, \u043a\u0440\u0430\u0441\u0438\u0432\u0435\u0435 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0448\u0430\u0433 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u0443\u0442\u0451\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e \u043f\u0440\u0435\u0441\u0435\u0442\u0443 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u043f\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0435.<\/p>\n<\/li>\n<\/ol>\n<p>\u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0441\u0430\u043c \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u2014 \u044d\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443. \u041e\u0434\u043d\u0430\u043a\u043e, \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u0432\u0438\u0436\u043a\u0430 \u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445. \u041c\u043e\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438\u0433\u0440\u044b \u043f\u043e \u0441\u0430\u043c\u043e\u043c\u0443 \u0441\u043b\u043e\u0436\u043d\u043e\u043c\u0443 \u043f\u0443\u0442\u0438, \u0445\u043e\u0442\u044f Python \u0438 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0447\u0430\u0441\u0442\u044c \u0432\u0435\u0449\u0435\u0439. \u0427\u0442\u043e \u0436, \u0445\u0432\u0430\u0442\u0438\u0442 \u0441\u043b\u043e\u0432 \u0438 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043a \u0434\u0435\u043b\u0443!<\/p>\n<h3>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/h3>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0430\u043f\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u042f \u043d\u0430\u0437\u0432\u0430\u043b \u043f\u0440\u043e\u0435\u043a\u0442 PyZelda \u0438 \u0432 \u043f\u0430\u043f\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0435\u0441\u0442\u044c \u0435\u0449\u0451 4 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438: audio, code, graphic \u0438 map.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ex\/80\/nz\/ex80nzsijzxwn-d2kwwbn1_icyc.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ex\/80\/nz\/ex80nzsijzxwn-d2kwwbn1_icyc.png\"\/><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435, \u0432 \u043f\u0430\u043f\u043a\u0435 code \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u0430:<\/p>\n<ul>\n<li>\n<p><a href=\"http:\/\/main.py\" rel=\"noopener noreferrer nofollow\">main.py<\/a> \u2014 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0430\u0439\u043b \u0438\u0433\u0440\u044b<\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/settings.py\" rel=\"noopener noreferrer nofollow\">settings.py<\/a> \u2014 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u0433\u0440\u044b (\u0442\u0443\u0442 \u043c\u044b \u0443\u043a\u0430\u0436\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043e\u043b\u0435\u0439 \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u043e\u043a\u043d\u0443 \u0438 \u043f\u0440\u043e\u0440\u0438\u0441\u043e\u0432\u043a\u0435)<\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/debug.py\" rel=\"noopener noreferrer nofollow\">debug.py<\/a> \u2014 \u0444\u0430\u0439\u043b \u0434\u0435\u0431\u0430\u0433\u0438\u043d\u0433\u0430<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0440\u0430\u0431\u043e\u0442\u043e\u0439, \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 PyGame (<code>pip install pygame<\/code>)<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/hm\/dt\/zi\/hmdtzidghxionst8damlsi_flzw.png\" data-src=\"https:\/\/habrastorage.org\/webt\/hm\/dt\/zi\/hmdtzidghxionst8damlsi_flzw.png\"\/><\/figure>\n<p>\u0424\u0430\u0439\u043b main:<\/p>\n<pre><code class=\"python\">import pygame, sys #\u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 PyGame \u0438 Sys from settings import * #\u0438\u043c\u043f\u043e\u0440\u0442 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 settings  class Game: #\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0438\u0433\u0440\u044b def __init__(self): #\u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 pygame.init() #\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 PyGame self.screen = pygame.display.set_mode((WIDTH,HEIGTH)) #\u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044d\u043a\u0440\u0430\u043d \u0432 \u0432\u0438\u0434\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 \u0438 \u0432\u044b\u0441\u043e\u0442\u0443 pygame.display.set_caption(\"PyZelda\") #\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u043a\u043d\u0430 self.clock = pygame.time.Clock() #\u0430 \u0442\u0430\u043a\u0436\u0435, \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432\u0440\u0435\u043c\u044f  def run(self): #\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438\u0433\u0440\u044b while True: #\u0434\u043e \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0438\u0433\u0440\u044b \u043e\u043d\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u0430 for event in pygame.event.get(): #\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u0438\u0433\u0440\u0435 if event.type == pygame.QUIT: #\u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0439\u0442\u0438 \u0438 \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435: pygame.quit() #\u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0438\u0433\u0440\u044b sys.exit() #\u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043e\u043a\u043d\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u044b self.screen.fill('green') #\u043f\u043e\u043c\u0438\u043c\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0446\u0432\u0435\u0442 \u044d\u043a\u0440\u0430\u043d\u0430 pygame.display.update() #\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u044d\u043a\u0440\u0430\u043d self.clock.tick(FPS) #\u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c FPS  if __name__ == '__main__': #\u0437\u0430\u043f\u0443\u0441\u043a \u0438\u0433\u0440\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 main-\u0444\u0430\u0439\u043b\u0430 game = Game() #\u0415\u0441\u043b\u0438 \u0444\u0430\u0439\u043b main, \u0442\u043e \u0441\u0430\u043c\u0430 \u0438\u0433\u0440\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441... game.run() #...\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e run \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 <\/code><\/pre>\n<p>\u0412 \u0444\u0430\u0439\u043b\u0435 main \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0430\u043c\u0443 \u0438\u0433\u0440\u0443. \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043d\u0430 \u0431\u0430\u0437\u0435 PyGame \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u0432\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<p>\u0424\u0430\u0439\u043b <a href=\"http:\/\/setting.py\" rel=\"noopener noreferrer nofollow\">setting.py<\/a>:<\/p>\n<pre><code class=\"python\">WIDTH = 1280 #\u0428\u0438\u0440\u0438\u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0430 HEIGTH = 720 #\u0412\u044b\u0441\u043e\u0442\u0430 \u044d\u043a\u0440\u0430\u043d\u0430 FPS = 60 #\u0427\u0438\u0441\u043b\u043e FPS TILESIZE = 64 #\u0420\u0430\u0437\u043c\u0435\u0440 \u0442\u0430\u0439\u043b\u0430 (\u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b)  WORLD_MAP = [ #\u041a\u0430\u0440\u0442\u0430 \u043c\u0438\u0440\u0430 \u0438\u0433\u0440\u044b. \u041e\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 20\u044520 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043e\u0432 ['x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'], ] <\/code><\/pre>\n<p>\u0412 <a href=\"http:\/\/settings.py\" rel=\"noopener noreferrer nofollow\">settings.py<\/a> \u0431\u0443\u0434\u0443\u0442 \u0432\u0441\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u0433\u0440\u044b. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0448\u0438\u0440\u0438\u043d\u0430 \u0438 \u0432\u044b\u0441\u043e\u0442\u0430 \u043e\u043a\u043d\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0447\u0438\u0441\u043b\u043e FPS (\u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u043a\u043d\u0430) \u0438 \u0441\u0430\u043c\u0430\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u2014 \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0430\u0439\u043b\u0430. \u041a\u0430\u043a \u044f \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u0440\u0430\u043d\u0435\u0435, \u0442\u0430\u0439\u043b \u2014 \u044d\u0442\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u043c\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c\u0438. \u0412\u044b\u0441\u043e\u0442\u0430 \u0438 \u0448\u0438\u0440\u0438\u043d\u0430 \u043a\u0430\u0434\u0440\u0430 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445 (\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b 1280 \u043d\u0430 720), \u043a\u0430\u043a \u0438 \u0441\u0430\u043c \u0442\u0430\u0439\u043b, \u043d\u043e \u0435\u0441\u0442\u044c \u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u2014 \u0442\u0430\u0439\u043b \u0432\u0441\u0435\u0433\u0434\u0430 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u043c\u044b \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 \u0442\u0430\u0439\u043b\u0430 (\u043e\u043d \u0443 \u043d\u0430\u0441 64 \u043d\u0430 64 \u043f\u0438\u043a\u0441\u0435\u043b\u044f). \u0414\u0430\u043b\u0435\u0435, \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u0430\u0440\u0442\u0443 \u043c\u0438\u0440\u0430. \u0421\u0435\u0439\u0447\u0430\u0441 \u043e\u043d\u0430 20 \u043d\u0430 20 \u0442\u0430\u0439\u043b\u043e\u0432 (\u0434\u0430\u043b\u0435\u0435, \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0451 \u0442\u0430\u0439\u043b\u0430\u043c\u0438). \u042f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043b, \u0447\u0442\u043e <code>'x'<\/code> \u2014 \u044d\u0442\u043e \u043a\u043e\u043d\u0435\u0446 \u043a\u0430\u0440\u0442\u044b, \u0430 <code>','<\/code> \u2014 \u043f\u0443\u0441\u0442\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u0438\u0433\u0440\u044b.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435, \u0444\u0430\u0439\u043b <a href=\"http:\/\/debug.py\" rel=\"noopener noreferrer nofollow\">debug.py<\/a>:<\/p>\n<pre><code class=\"python\">import pygame #\u0421\u043d\u043e\u0432\u0430 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a PyGame pygame.init() #\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 font = pygame.font.Font(None, 30) #\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0448\u0440\u0438\u0444\u0442  def debug(info, y = 10, x = 10):  #\u0421\u0430\u043c\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u0435\u0431\u0430\u0433\u0430 display_surface = pygame.display.get_surface() #\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u0443\u044e \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0438\u0433\u0440\u0435 debug_surf = font.render(str(info), True, \"Red\") #\u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043c \u0442\u0435\u043a\u0441\u0442 (\u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0435\u0433\u043e \u043a\u0440\u0430\u0441\u043d\u044b\u043c) debug_rect = debug_surf.get_rect(topleft = (x, y)) #\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u043c\u0435\u043c \u043c\u0435\u0441\u0442\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u044b \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 (\u043b\u0435\u0432\u044b\u0439 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0443\u0433\u043e\u043b) pygame.draw.rect(display_surface, \"White\", debug_rect) #\u0414\u0435\u043b\u0430\u0435\u043c \u043c\u0438\u043a\u0440\u043e-\u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0432 \u0432\u0438\u0434\u0435 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 (\u0438 \u0434\u0430 \u043e\u043d \u0431\u0435\u043b\u044b\u0439, \u0431\u0443\u0434\u0435\u0442 \u0431\u0435\u043b\u0430\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0441 \u043a\u0440\u0430\u0441\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c) display_surface.blit(debug_surf, debug_rect) #\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0430\u0448\u0443 \u043c\u0438\u043a\u0440\u043e-\u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 <\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0435\u0431\u0430\u0433 \u0438\u0433\u0440\u044b. \u042d\u0442\u043e \u043f\u043e\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0432\u0432\u0435\u0440\u0445\u0443 \u0441\u043b\u0435\u0432\u0430 \u044d\u043a\u0440\u0430\u043d\u0430 \u0438 \u0432 \u043d\u0451\u043c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c \u0442\u0435\u043a\u0441\u0442. \u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0434\u0435\u0431\u0430\u0433\u0430, \u043d\u0443\u0436\u043d\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c debug \u0432 main-\u0444\u0430\u0439\u043b \u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043e\u043a\u043d\u0430. \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a (\u0444\u0430\u0439\u043b <a href=\"http:\/\/main.py\" rel=\"noopener noreferrer nofollow\">main.py<\/a>):<\/p>\n<pre><code class=\"python\">import pygame, sys #\u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 PyGame \u0438 Sys from settings import * #\u0438\u043c\u043f\u043e\u0440\u0442 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 settings from debug import debug #\u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0434\u0435\u0431\u0430\u0433 &lt;------------------  class Game: #\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0438\u0433\u0440\u044b def __init__(self): #\u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 pygame.init() #\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 PyGame self.screen = pygame.display.set_mode((WIDTH,HEIGTH)) #\u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044d\u043a\u0440\u0430\u043d \u0432 \u0432\u0438\u0434\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 \u0438 \u0432\u044b\u0441\u043e\u0442\u0443 pygame.display.set_caption(\"PyZelda\") #\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u043a\u043d\u0430 self.clock = pygame.time.Clock() #\u0430 \u0442\u0430\u043a\u0436\u0435, \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432\u0440\u0435\u043c\u044f  def run(self): #\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438\u0433\u0440\u044b while True: #\u0434\u043e \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0438\u0433\u0440\u044b \u043e\u043d\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u0430 for event in pygame.event.get(): #\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u0438\u0433\u0440\u0435 if event.type == pygame.QUIT: #\u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0439\u0442\u0438 \u0438 \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435: pygame.quit() #\u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0438\u0433\u0440\u044b sys.exit() #\u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043e\u043a\u043d\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u044b self.screen.fill('green') #\u043f\u043e\u043c\u0438\u043c\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0446\u0432\u0435\u0442 \u044d\u043a\u0440\u0430\u043d\u0430 debug('\u0427\u0451 \u043a\u0430\u043a? \u042f \u0434\u0435\u0431\u0430\u0433!') #\u0414\u0435\u0431\u0430\u0436\u0438\u043c &lt;------------------ pygame.display.update() #\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u044d\u043a\u0440\u0430\u043d self.clock.tick(FPS) #\u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c FPS  if __name__ == '__main__': #\u0437\u0430\u043f\u0443\u0441\u043a \u0438\u0433\u0440\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 main-\u0444\u0430\u0439\u043b\u0430 game = Game() #\u0415\u0441\u043b\u0438 \u0444\u0430\u0439\u043b main, \u0442\u043e \u0441\u0430\u043c\u0430 \u0438\u0433\u0440\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441... game.run() #...\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e run \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 <\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u043c \u0444\u0435\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0438\u0433\u0440\u0443 \u0446\u0432\u0435\u0442\u043e\u0432:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/_b\/t0\/i5\/_bt0i5v_zg2q9mwccux-ch_xfd4.png\" data-src=\"https:\/\/habrastorage.org\/webt\/_b\/t0\/i5\/_bt0i5v_zg2q9mwccux-ch_xfd4.png\"\/><\/figure>\n<p><a href=\"https:\/\/disk.yandex.ru\/d\/8jdGZBe3w3plAg\" rel=\"noopener noreferrer nofollow\">\u0421\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f<\/a>.<\/p>\n<h3>\u041f\u0438\u0448\u0435\u043c \u0443\u0440\u043e\u0432\u0435\u043d\u044c<\/h3>\n<p>\u0418\u0442\u0430\u043a, \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u0432 \u043f\u043e\u043d\u044f\u0442\u0438\u0438 &#171;\u043a\u043b\u0430\u0441\u0441&#187; \u0432 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u041e\u041e\u041f (\u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f). \u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441 <code>Level<\/code>. \u0412 \u044d\u0442\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u0435\u0441\u0442\u044c \u0432\u0441\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u0432\u043d\u0443\u0442\u0440\u0438. \u041f\u043e \u0441\u0443\u0442\u0438, \u043a\u043b\u0430\u0441\u0441 <code>Level<\/code> \u0438 \u0435\u0441\u0442\u044c \u043d\u0430\u0448\u0430 \u0438\u0433\u0440\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u0435 <strong>\u0441\u043f\u0440\u0430\u0439\u0442\u044b<\/strong> (\u0438\u0433\u0440\u043e\u043a, \u0432\u0440\u0430\u0433\u0438, \u043a\u0430\u0440\u0442\u0430 \u043c\u0438\u0440\u0430 \u0438 \u0442.\u0434.). \u041f\u043e\u043c\u0438\u043c\u043e \u0441\u0430\u043c\u0438\u0445 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432, \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u043e\u043c \u0442\u0435\u0445 \u0438\u043b\u0438 \u0438\u043d\u044b\u0445 \u043f\u0443\u043d\u043a\u0442\u043e\u0432. \u041a\u0430\u043a \u044f \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u0440\u0430\u043d\u0435\u0435, \u0434\u0432\u0438\u0436\u043e\u043a \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u0444\u0438\u0437\u0438\u043a\u0438, \u0430 \u0444\u0438\u0437\u0438\u043a\u0430 \u2014 \u044d\u0442\u043e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u043c \u0441 <strong>\u0447\u0438\u0441\u043b\u0430\u043c\u0438<\/strong> \u0438 <strong>\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438<\/strong>. \u042d\u0442\u043e \u0442\u043e\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <code>Level<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a\u0430 \u0443\u0434\u0430\u0440\u0438\u0442 \u0432\u0440\u0430\u0433, \u0442\u043e \u0438\u0433\u0440\u043e\u043a \u043f\u043e\u0442\u0435\u0440\u044f\u0435\u0442 5% \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f \u2014 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043d\u0430\u0448\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b.<\/p>\n<p>\u041d\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0440\u044b\u0441\u043a\u0430\u0442\u044c \u0432 \u043a\u043e\u0434\u0435 \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043a\u0430\u043c\u043d\u044f \u211667, \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0430\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0432\u0435 \u0433\u0440\u0443\u043f\u043f\u044b: <code>visible_sprites<\/code> \u0438 <code>obstacle_sprites<\/code>. \u041a\u0430\u043a \u0432\u044b \u0443\u0436\u0435 \u043f\u043e\u043d\u044f\u043b\u0438, \u0433\u0440\u0443\u043f\u043f\u0430 <code>visible_sprites<\/code> \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u0438\u0434\u0438\u0442 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u0440\u0442\u0443 \u043c\u0438\u0440\u0430 \u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430), \u0430 <code>obstacle_sprites<\/code> \u2014 \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u0412\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0441\u043b\u0430\u0442\u044c \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0438\u043b\u0438 \u043d\u0430 \u043d\u0430\u0431\u043e\u0440 \u0433\u0440\u0443\u043f\u043f. \u0422\u0430\u043a, \u043e\u0431\u044a\u0435\u043a\u0442 &#171;\u043a\u043e\u0442&#187; \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432 \u0433\u0440\u0443\u043f\u043f\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0434\u0432\u0438\u0436\u0443\u0449\u0438\u0445\u0441\u044f, \u043d\u043e \u043d\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0441 \u0438\u0433\u0440\u043e\u043a\u043e\u043c. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0442\u0430 \u0432 \u043e\u0431\u0435 \u0433\u0440\u0443\u043f\u043f\u044b, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0451\u043d \u0438 \u0430\u043a\u0442\u0438\u0432\u0435\u043d.<\/p>\n<p>\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u043a\u043e\u0434\u0443. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b <code>level.py<\/code>. \u041f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u0432 \u043d\u0451\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"python\">import pygame  class Level: #\u0421\u043e\u0437\u0434\u0430\u043b\u0438 \u043a\u043b\u0430\u0441\u0441 def __init__(self): #\u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b self.visible_sprites = pygame.sprite.Group() #\u0421\u043e\u0437\u0434\u0430\u043b\u0438 \u0433\u0440\u0443\u043f\u043f\u0443 \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 self.obstacle_sprites = pygame.sprite.Group() #\u0421\u043e\u0437\u0434\u0430\u043b\u0438 \u0433\u0440\u0443\u043f\u043f\u0443 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432  def run(self): #\u0421\u043e\u0437\u0434\u0430\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 pass <\/code><\/pre>\n<p>\u041c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043a\u043b\u0430\u0441\u0441 \u0438 \u0432 \u043d\u0451\u043c 2 \u0433\u0440\u0443\u043f\u043f\u044b, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0437\u043e\u0432\u0430 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u0414\u0430\u043b\u0435\u0435, \u043d\u0443\u0436\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u0432 main-\u0444\u0430\u0439\u043b \u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 <code>Level<\/code> (<code>from level import Level<\/code>), \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441 <code>Level<\/code> (<code>self.level = Level()<\/code>), \u0430 \u0442\u0430\u0436\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0441\u0430\u043c\u043e\u043c run-\u043c\u0435\u0442\u043e\u0434\u0435 \u0432 main (<code>self.level.run()<\/code>). \u042f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043a\u0430 \u0443\u0431\u0440\u0430\u0442\u044c \u0434\u0435\u0431\u0430\u0433 \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u0435\u0439\u0447\u0430\u0441 \u0434\u0435\u0431\u0430\u0436\u0438\u0442\u044c \u043d\u0435\u0447\u0435\u0433\u043e \u0438 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 main-\u0444\u0430\u0439\u043b\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">import pygame, sys #\u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 PyGame \u0438 Sys from settings import * #\u0438\u043c\u043f\u043e\u0440\u0442 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 settings from level import Level #+++ \u0438\u043c\u043f\u043e\u0440\u0442 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 level \u043a\u043b\u0430\u0441\u0441 Level +++  class Game: #\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0438\u0433\u0440\u044b def __init__(self): #\u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 pygame.init() #\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 PyGame self.screen = pygame.display.set_mode((WIDTH,HEIGTH)) #\u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044d\u043a\u0440\u0430\u043d \u0432 \u0432\u0438\u0434\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 \u0438 \u0432\u044b\u0441\u043e\u0442\u0443 pygame.display.set_caption(\"PyZelda\") #\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u043a\u043d\u0430 self.clock = pygame.time.Clock() #\u0430 \u0442\u0430\u043a\u0436\u0435, \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432\u0440\u0435\u043c\u044f self.level = Level() #+++ \u043e\u0431\u044a\u0451\u0432\u0438\u043b\u0438 Level +++  def run(self): #\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438\u0433\u0440\u044b while True: #\u0434\u043e \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0438\u0433\u0440\u044b \u043e\u043d\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u0430 for event in pygame.event.get(): #\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u0438\u0433\u0440\u0435 if event.type == pygame.QUIT: #\u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0439\u0442\u0438 \u0438 \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435: pygame.quit() #\u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0438\u0433\u0440\u044b sys.exit() #\u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043e\u043a\u043d\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u044b self.screen.fill('green') #\u043f\u043e\u043c\u0438\u043c\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0446\u0432\u0435\u0442 \u044d\u043a\u0440\u0430\u043d\u0430 self.level.run() #+++ \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e run \u0432 \u0444\u0430\u0439\u043b\u0435 level \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 Level +++ pygame.display.update() #\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u044d\u043a\u0440\u0430\u043d self.clock.tick(FPS) #\u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c FPS  if __name__ == '__main__': #\u0437\u0430\u043f\u0443\u0441\u043a \u0438\u0433\u0440\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 main-\u0444\u0430\u0439\u043b\u0430 game = Game() #\u0415\u0441\u043b\u0438 \u0444\u0430\u0439\u043b main, \u0442\u043e \u0441\u0430\u043c\u0430 \u0438\u0433\u0440\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441... game.run() #...\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e run \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 <\/code><\/pre>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u0430\u043b\u0435\u0435, \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u0447\u0442\u043e-\u0442\u043e \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 Level. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u043e\u0434\u043b\u043e\u0436\u043a\u0443 \u0438\u0437 \u0437\u0435\u043b\u0451\u043d\u043e\u0433\u043e \u0444\u043e\u043d\u0430, \u0430 \u0441\u0432\u0435\u0440\u0445\u0443 \u043d\u0430\u043b\u043e\u0436\u0438\u043c \u043d\u043e\u0432\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e, \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c, \u043a\u0430\u043a \u0432 \u0438 \u0432 \u0434\u0435\u0431\u0430\u0433\u0435: <code>display_surface = pygame.display.get_surface()<\/code>. \u0412 \u043a\u043e\u0434\u0435 \u0441 Level \u043e\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">import pygame  class Level: #\u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043a\u043b\u0430\u0441\u0441 def __init__(self): #\u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b self.display_surface = pygame.display.get_surface() #\u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 \u0441\u043b\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 self.visible_sprites = pygame.sprite.Group() #\u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0433\u0440\u0443\u043f\u043f\u0443 \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 self.obstacle_sprites = pygame.sprite.Group() #\u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0433\u0440\u0443\u043f\u043f\u0443 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432  def run(self): #\u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 pass <\/code><\/pre>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043e\u0431\u044a\u044f\u0432\u0438\u043b\u0438 \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0447\u0442\u043e-\u0442\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c, \u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043b\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b <code>tile.py<\/code>.<\/p>\n<pre><code class=\"python\">import pygame from settings import *  class Tile(pygame.sprite.Sprite): def __init__(self, pos, groups): super().__init__(groups) #\u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u0432\u0441\u0435 \u0433\u0440\u0443\u043f\u043f\u044b self.image = pygame.image.load('..\/graphic\/box.png').convert_alpha() #\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 self.rect = self.image.get_rect(topleft = pos) #\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 (\u043b\u0435\u0432\u044b\u0439 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0443\u0433\u043e\u043b) <\/code><\/pre>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u0432 \u044d\u0442\u043e\u043c \u043a\u043e\u0434\u0435 \u043c\u0430\u043b\u043e. \u041c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u0430\u043c pygame (\u0441\u043d\u043e\u0432\u0430 \u0438 \u0441\u043d\u043e\u0432\u0430), \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 <code>settings.py<\/code> \u043c\u044b \u0431\u0435\u0440\u0451\u043c \u0432\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0435 \u043f\u043e\u043b\u044f (\u043f\u043e\u0442\u043e\u043c\u0443, \u043c\u044b \u0435\u0433\u043e \u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0443\u0442). \u0414\u0430\u043b\u0435\u0435, \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <code>Tile<\/code>. \u0412 \u043d\u0451\u043c \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0435\u0431\u044f, \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0438 \u0433\u0440\u0443\u043f\u043f\u0443 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f. \u0414\u0430\u043b\u0435\u0435, \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>super()<\/code> \u043c\u044b \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c <a href=\"https:\/\/docs-python.ru\/tutorial\/vstroennye-funktsii-interpretatora-python\/funktsija-super\/\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435<\/a>. \u0414\u0430\u043b\u0435\u0435, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0441\u0430\u043c\u0438\u0445 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0438 <a href=\"https:\/\/younglinux.info\/pygame\/rect\" rel=\"noopener noreferrer nofollow\"><code>rect<\/code><\/a> \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a. \u0418\u0437 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e, <code>convert_alpha()<\/code>. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0430\u0439\u0433\u0435\u0439\u043c\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u0443\u044e \u043a\u043e\u043f\u0438\u044e \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0441 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u0421\u0443\u0440\u043e\u0432\u0430\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043f\u0430\u0439\u0433\u0435\u0439\u043c \u043f\u043e\u043d\u044f\u043b \u0447\u0442\u043e \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c.<\/p>\n<p>\u0420\u043e\u0432\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043a\u043e\u0434 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432 \u0444\u0430\u0439\u043b\u0435 <code>player.py<\/code>:<\/p>\n<pre><code class=\"python\">import pygame from settings import *  class Player(pygame.sprite.Sprite): def __init__(self, pos, groups): super().__init__(groups) self.image = pygame.image.load('..\/graphic\/link.png').convert_alpha() self.rect = self.image.get_rect(topleft = pos) <\/code><\/pre>\n<p>\u041e\u0442\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043b\u0438\u0448\u044c \u0432 \u0434\u0432\u0443\u0445 \u043c\u0435\u0441\u0442\u0430\u0445:<\/p>\n<ul>\n<li>\n<p>\u042f \u0441\u043e\u0437\u0434\u0430\u043b \u043a\u043b\u0430\u0441\u0441 <code>Player<\/code> \u0432\u043c\u0435\u0441\u0442\u043e Tile<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043c\u0435\u043d\u0438\u043b\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0441 \u043a\u043e\u0440\u043e\u0431\u043e\u043a \u043d\u0430 \u0433\u0435\u0440\u043e\u044f \u0425\u0430\u0439\u0440\u0443\u043b\u0430 \ud83d\ude42<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u0441\u0435 \u043f\u0440\u0435\u0441\u0435\u0442\u044b \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u044f \u0432\u0437\u044f\u043b \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 <a href=\"https:\/\/pixel-boy.itch.io\/ninja-adventure-asset-pack\" rel=\"noopener noreferrer nofollow\">NinjaAdventure<\/a>. \u0422\u0430\u043c \u0435\u0441\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435 \u0441\u0435\u0442\u044b \u0433\u0440\u0430\u0444\u0438\u043a\u0438. \u041e\u0431\u0440\u0435\u0437\u0430\u043b \u043a\u0430\u0440\u0442\u0438\u043a\u0438 \u0432 \u0444\u043e\u0442\u043e\u0448\u043e\u043f\u0435 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043c\u0438\u043d\u0438-\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u043c \u043d\u0430\u0448\u0443 \u043c\u0438\u0440\u043e\u0432\u0443\u044e \u043a\u0430\u0440\u0442\u0443. \u0414\u0435\u043b\u0430\u0442\u044c \u043c\u044b \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0432 \u0444\u0430\u0439\u043b\u0435 <code>level.py<\/code>, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u043d\u0451\u043c \u043c\u044b \u0445\u0440\u0430\u043d\u0438\u043c \u0432\u0441\u044e \u043d\u0443\u0436\u043d\u0443\u044e \u0438\u043d\u0444\u0443 \u043f\u0440\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c. \u0421\u0440\u0430\u0437\u0443 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c <code>settings.py<\/code> \u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u043a \u043a\u0430\u0440\u0442\u0435. \u0424\u0438\u043d\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">import pygame from settings import *  class Level: #\u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043a\u043b\u0430\u0441\u0441 def __init__(self): #\u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b self.display_surface = pygame.display.get_surface() #\u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 \u0441\u043b\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 self.visible_sprites = pygame.sprite.Group() #\u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0433\u0440\u0443\u043f\u043f\u0443 \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 self.obstacle_sprites = pygame.sprite.Group() #\u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0433\u0440\u0443\u043f\u043f\u0443 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 self.create_map()  def create_map(self): for row in WORLD_MAP: print(row)  def run(self): #\u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 pass <\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 main-\u0444\u0430\u0439\u043b\u0430, \u0441\u0430\u043c\u0430 \u0438\u0433\u0440\u0430 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0430\u0441\u044c, \u043d\u043e \u043c\u044b \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u0430\u043b\u0438 \u043d\u0430\u0448\u0443 \u043a\u0430\u0440\u0442\u0443.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/w2\/us\/rl\/w2usrlpqmue5az6n-t4q5dfqkmq.png\" data-src=\"https:\/\/habrastorage.org\/webt\/w2\/us\/rl\/w2usrlpqmue5az6n-t4q5dfqkmq.png\"\/><\/figure>\n<p>\u041f\u0440\u043e \u043a\u0430\u0440\u0442\u0443. \u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b, \u044f \u0441\u043e\u0437\u0434\u0430\u043b \u043a\u043b\u0435\u0442\u043a\u0443 (\u043d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u043e\u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 64 \u043d\u0430 64 \u043f\u0438\u043a\u0441\u0435\u043b\u044f) \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438 \u0447\u0442\u043e \u043a\u0443\u0434\u0430 \u0441\u0442\u0430\u0432\u0438\u0442\u044c. \u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043a\u0430\u0440\u0442\u0443 \u044f \u0442\u0430\u043a: &#8216;x&#8217; \u2014 \u044d\u0442\u043e \u043a\u043e\u0440\u043e\u0431\u043a\u0438, &#8216;,&#8217; \u2014 \u043f\u0443\u0441\u0442\u043e\u0435 \u043c\u0435\u0441\u0442\u043e, \u0430 &#8216;p&#8217; \u2014 \u044d\u0442\u043e \u043d\u0430\u0448 \u0433\u0435\u0440\u043e\u0439.<\/p>\n<p>\u042d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043a\u0440\u0443\u0442\u043e, \u043d\u043e \u0432\u043e\u0442 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u0443 \u0432 \u0438\u0433\u0440\u0435, \u0430 \u043d\u0435 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e, \u043c\u043e\u0434\u0435\u0440\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0444\u0430\u0439\u043b\u043e\u043c <code>level.py<\/code>:<\/p>\n<pre><code class=\"python\">import pygame from settings import * from tile import Tile from player import Player  class Level: #\u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043a\u043b\u0430\u0441\u0441 def __init__(self): #\u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b self.display_surface = pygame.display.get_surface() #\u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 \u0441\u043b\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 self.visible_sprites = pygame.sprite.Group() #\u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0433\u0440\u0443\u043f\u043f\u0443 \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 self.obstacle_sprites = pygame.sprite.Group() #\u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0433\u0440\u0443\u043f\u043f\u0443 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 self.create_map()  def create_map(self): for row_index, row in enumerate(WORLD_MAP): for col_index, col in enumerate(row): x = col_index * TILESIZE y = row_index * TILESIZE if col == 'x': Tile((x, y), [self.visible_sprites]) if col == 'p': Player((x, y), [self.visible_sprites])  def run(self): #\u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 self.visible_sprites.draw(self.display_surface) <\/code><\/pre>\n<p>\u0412\u0441\u0451 \u0447\u0442\u043e \u044f \u0434\u0435\u043b\u0430\u044e \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0445\u043e\u0436\u0443 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0443\u043c\u043d\u043e\u0436\u0430\u044e \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 64, \u0442\u0430\u043a \u043a\u0430\u043a \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u043e\u0435\u0433\u043e \u0442\u0430\u0439\u043b\u0430 \u0440\u0430\u0432\u0435\u043d 64 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u043c. \u0414\u0430\u043b\u0435\u0435, \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0432\u0435\u043d <code>'x'<\/code> \u0437\u0430\u043c\u0435\u043d\u044f\u044e \u0435\u0433\u043e \u043d\u0430 \u043a\u043e\u0440\u043e\u0431\u043a\u0443, \u0430 \u0435\u0441\u043b\u0438 <code>'p'<\/code>, \u0442\u043e \u043d\u0430 \u0433\u0435\u0440\u043e\u044f. \u0414\u0430\u043b\u0435\u0435, \u044f \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043b \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043c\u0435\u0442\u043e\u0434 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043f\u043e\u043b\u044f. \u0422\u0430\u043a\u0436\u0435, \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u044f \u0437\u0430\u043c\u0435\u043d\u0438\u043b \u043e\u0434\u043d\u0443 <code>','<\/code> \u043d\u0430 <code>'p'<\/code>. \u0418 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/yw\/gu\/s6\/ywgus6g0r_afexbaexxmfjgvp3c.png\" data-src=\"https:\/\/habrastorage.org\/webt\/yw\/gu\/s6\/ywgus6g0r_afexbaexxmfjgvp3c.png\"\/><\/figure>\n<p>\u0412 main-\u0444\u0430\u0439\u043b\u0435 \u0437\u0430\u043c\u0435\u043d\u0438\u0432 \u0446\u0432\u0435\u0442 \u0444\u043e\u043d\u0430 \u043d\u0430 \u0447\u0451\u0440\u043d\u044b\u0439, \u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0430\u0439\u043b\u0430 \u043d\u0430 32 \u043f\u0438\u043a\u0441\u0435\u043b\u044f, \u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u044d\u0442\u043e:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/aa\/9f\/wn\/aa9fwnnikbo0j4titebgguazpuu.png\" data-src=\"https:\/\/habrastorage.org\/webt\/aa\/9f\/wn\/aa9fwnnikbo0j4titebgguazpuu.png\"\/><\/figure>\n<p><a href=\"https:\/\/disk.yandex.ru\/d\/ZYjndkgFeRALkA\" rel=\"noopener noreferrer nofollow\">\u0424\u0430\u0439\u043b\u044b \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430 \u0434\u043b\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f<\/a>. \u0421\u0440\u0430\u0437\u0443 \u043e\u0433\u043e\u0432\u043e\u0440\u044e\u0441\u044c, \u0447\u0442\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u0438\u0437-\u0437\u0430 \u0441\u0430\u043c\u0438\u0445 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a. \u042f \u043d\u0435 \u043f\u043e\u0434\u0431\u0438\u0432\u0430\u043b \u0438\u0445 \u043a \u0440\u0430\u0437\u043c\u0435\u0440\u0443 64 \u043d\u0430 64 \u043f\u0438\u043a\u0441\u0435\u043b\u044f. \u0414\u0430\u043b\u0435\u0435 \u044f \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043b \u044d\u0442\u043e \u0438 \u0432\u0435\u0440\u043d\u0443\u043b \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0430\u0439\u043b\u0430 \u0432 64 \u043d\u0430 64 \u043f\u0438\u043a\u0441\u0435\u043b\u044f.<\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0438\u0433\u0440\u043e\u043a\u0430<\/h3>\n<p>\u0421\u0430\u043c \u0438\u0433\u0440\u043e\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u043c\u043e\u0447\u044c \u043f\u0435\u0440\u0435\u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0438 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0435\u0433\u043e \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 <code>player.py<\/code> \u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f. \u041a\u043e\u0434 \u0432 <code>player.py<\/code>:<\/p>\n<pre><code class=\"python\">import pygame from settings import *  class Player(pygame.sprite.Sprite): def __init__(self, pos, groups): super().__init__(groups) self.image = pygame.image.load('..\/graphic\/link.png').convert_alpha() self.rect = self.image.get_rect(topleft = pos)  self.direction = pygame.math.Vector2() #\u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0447\u0435\u0440\u0435\u0437 \u0432\u0435\u043a\u0442\u043e\u0440  def input(self): #\u0432\u0430\u0440\u044c\u0438\u0440\u0443\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0438 keys = pygame.key.get_pressed()  if keys[pygame.K_UP]: self.direction.y = -1 elif keys[pygame.K_DOWN]: self.direction.y = 1 else: self.direction.y = 0  if keys[pygame.K_LEFT]: self.direction.x = -1 elif keys[pygame.K_RIGHT]: self.direction.x = 1 else: self.direction.x = 0  def update(self): self.input() <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0441 \u043a\u043e\u0434\u043e\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>self.direction = pygame.math.Vector2()<\/code> \u043c\u044b \u0437\u0430\u0434\u0430\u0451\u043c \u0432\u0435\u043a\u0442\u043e\u0440 \u0442\u043e\u0447\u043a\u0435. \u0422\u043e\u0447\u043a\u0430 \u2014 \u044d\u0442\u043e \u043d\u0430\u0448 \u0433\u0435\u0440\u043e\u0439, \u0430 \u0435\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440 \u0431\u043e\u043b\u0442\u0430\u0435\u0442\u0441\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043e\u0442 -1 \u0434\u043e 1. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>keys = pygame.key.get_pressed()<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u0438 \u0442\u043e\u0433\u0434\u0430, \u0433\u0435\u0440\u043e\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0430\u0437\u0433\u043e\u043d\u044f\u0442\u044c\u0441\u044f. \u0415\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043d\u0435\u0442 \u2014 \u0432\u0435\u043a\u0442\u043e\u0440 \u0440\u0430\u0432\u0435\u043d 0 \u0438 \u0433\u0435\u0440\u043e\u0439 \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442. \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0435, \u043d\u043e \u043f\u0440\u0438\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0435\u0440\u0446\u0438\u0438.<\/p>\n<p>\u0415\u0449\u0451 \u0432 \u0444\u0430\u0439\u043b\u0435 <code>level.py<\/code> \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>run<\/code> \u044f \u0437\u0430\u043f\u0438\u0441\u0430\u043b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432. \u042d\u0442\u043e \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u043a\u043e\u0434\u0430 \u0432\u0438\u0434\u0430:<\/p>\n<pre><code class=\"python\">self.visible_sprites.update() <\/code><\/pre>\n<p>\u0415\u0449\u0451, \u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043b \u0432 \u0442\u043e\u043c \u0436\u0435 \u0444\u0430\u0439\u043b\u0435 \u0432\u044b\u0437\u043e\u0432 \u0433\u0435\u0440\u043e\u044f. \u041c\u043d\u0435 \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0433\u043b\u043e\u0431\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0433\u0435\u0440\u043e\u044f. \u0418\u0437 \u0441\u0442\u0440\u043e\u043a\u0438<\/p>\n<pre><code>Player((x, y), [self.visible_sprites]) <\/code><\/pre>\n<p>\u042f \u0441\u0434\u0435\u043b\u0430\u043b<\/p>\n<pre><code class=\"python\">self.player = Player((x, y), [self.visible_sprites]) <\/code><\/pre>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u043f\u0440\u043e\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0439 \u0432 \u0444\u0430\u0439\u043b\u0435 <code>player.py<\/code>. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u2014 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b (<code>__init__<\/code>) \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0442\u0440\u043e\u0447\u043a\u0443 <code>self.speed = 5<\/code><\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>move<\/code>:<\/p>\n<pre><code class=\"python\">def move(self, speed): self.rect.center += self.direction * speed <\/code><\/pre>\n<p>\u0418 \u0432 update-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430: <code>self.move(self.speed)<\/code>.<\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/9r\/f5\/kr\/9rf5krne9ukw8zz-8mrbc2k1eho.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/9r\/f5\/kr\/9rf5krne9ukw8zz-8mrbc2k1eho.gif\"\/><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u0433\u043b\u044f\u0434\u0435\u0442\u044c\u0441\u044f, \u0442\u043e \u043f\u043e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u041b\u0438\u043d\u043a \u0431\u0435\u0436\u0438\u0442 \u0447\u0443\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u0431\u0435\u0436\u0438\u0442 \u043f\u043e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u043a\u043e\u0440\u0435\u043d\u044c \u0438\u0437 \u0434\u0432\u0443\u0445, \u0447\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0440\u0430\u0432\u043d\u043e 1.4. \u041c\u044b \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u0432\u0435\u0440\u0445, \u0432\u043d\u0438\u0437, \u0432\u043b\u0435\u0432\u043e \u0438 \u0432\u043f\u0440\u0430\u0432\u043e \u0440\u0430\u0432\u043d\u043e\u0439 1, \u0430 \u0432\u043e\u0442 \u043f\u043e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u0438\u0437 \u043f\u0440\u0430\u0432\u0438\u043b \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0434\u043b\u0438\u043d\u0430 \u0433\u0438\u043f\u043e\u0442\u0435\u043d\u0443\u0437\u044b \u0440\u0430\u0432\u043d\u0430 \u0441\u0443\u043c\u043c\u0435 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043e\u0432 \u0434\u043b\u0438\u043d \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 \u043f\u043e\u0434 \u043a\u043e\u0440\u043d\u0435\u043c, \u0442\u043e \u0435\u0441\u0442\u044c <strong>\u043a\u043e\u0440\u0435\u043d\u044c \u0438\u0437 (1^2 + 1^2)<\/strong>. \u0418\u0441\u043f\u0440\u0430\u0432\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0439 \u0431\u0430\u0433 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043e\u0442 PyGame (\u0434\u0430-\u0434\u0430, \u043a\u0430\u043a \u0432 Unity). \u0418\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"python\">def move(self, speed): if self.direction.magnitude() != 0:         self.direction = self.direction.normalize() self.rect.center += self.direction * speed <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041b\u0438\u043d\u043a \u2014 \u0442\u0430\u043d\u043a. \u041e\u043d \u0441\u0431\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0451 \u043d\u0430 \u0441\u0432\u043e\u0451\u043c \u043f\u0443\u0442\u0438. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0441 \u043d\u0438\u043c\u0438. \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435, \u0447\u0442\u043e \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0443 \u043d\u0430\u0441 \u2014 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u044b \u0442\u0430\u0439\u043b\u0430\u043c\u0438.<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u2014 \u0444\u0430\u0439\u043b <code>player.py<\/code> \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0442\u0430\u0439\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0444\u0430\u0439\u043b \u0443\u0440\u043e\u0432\u043d\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0434\u0430\u0434\u0438\u043c \u043d\u0430\u0448\u0435\u043c\u0443 \u0444\u0430\u0439\u043b\u0443 \u043d\u043e\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0433\u043e \u0432 <code>init<\/code> \u0438 \u043d\u0430\u0437\u043e\u0432\u0451\u043c <code>obstacle_sprites<\/code>. \u0422\u0430\u043a\u0436\u0435, \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0432 \u0444\u0430\u0439\u043b\u0435 \u0441\u0430\u043c\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0441\u043e\u0441\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0430 <code>obstacle_sprites<\/code> \u0432 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0435 \u0442\u043e\u0447\u043a\u0438 \u0438\u0433\u0440\u043e\u043a\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u0444\u0430\u0439\u043b\u0435 <code>level.py<\/code> \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u0435 \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<pre><code class=\"python\">self.player = Player((x, y), [self.visible_sprites]) <\/code><\/pre>\n<p>\u041d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<pre><code class=\"python\">self.player = Player((x, y), [self.visible_sprites], self.obstacle_sprites) <\/code><\/pre>\n<p>\u0412 \u0441\u0430\u043c\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0438\u0433\u0440\u043e\u043a\u0430, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 <code>collision<\/code>. \u0421\u0430\u043c\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f:<\/p>\n<pre><code class=\"python\">def collision(self, direction): if direction == 'horizontal': for sprite in self.obstacle_sprites: if sprite.rect.colliderect(self.rect): if self.direction.x > 0: #\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u0432\u043f\u0440\u0430\u0432\u043e self.rect.right = sprite.rect.left if self.direction.x &lt; 0: #\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u0432\u043b\u0435\u0432\u043e self.rect.left = sprite.rect.right  if direction == 'vertical': for sprite in self.obstacle_sprites: if sprite.rect.colliderect(self.rect): if self.direction.y > 0: #\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u0432\u043d\u0438\u0437 self.rect.bottom = sprite.rect.top if self.direction.y &lt; 0: #\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u0432\u0432\u0435\u0440\u0445 self.rect.top = sprite.rect.bottom <\/code><\/pre>\n<p>\u0412 \u043d\u0435\u0439 \u0432\u0441\u0451 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u043e \u043d\u0430 \u0434\u0432\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. \u041f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0441\u0438 \u2014 x, \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u2014 y. \u0415\u0441\u043b\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438, \u0442\u043e \u0434\u0435\u043b\u0430\u0435\u043c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f (\u0432\u043f\u0440\u0430\u0432\u043e \u0438\u043b\u0438 \u0432\u043b\u0435\u0432\u043e). \u0422\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438, \u043d\u043e \u0442\u0430\u043c \u0432\u043d\u0438\u0437 \u0438 \u0432\u0432\u0435\u0440\u0445. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0448\u0430\u0433 \u2014 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0432 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 \u043d\u0430 \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430: \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439. \u0422\u043e \u0435\u0441\u0442\u044c, \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438:<\/p>\n<pre><code class=\"python\">self.rect.center += self.direction * speed <\/code><\/pre>\n<p>\u0414\u0435\u043b\u0430\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443:<\/p>\n<pre><code class=\"python\">self.rect.x += self.direction.x * speed self.collision('horizontal') self.rect.y += self.direction.y * speed self.collision('vertical') <\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0433\u0435\u0440\u043e\u044f \u0425\u0430\u0439\u0440\u0443\u043b\u0430 \u0431\u0435\u0437 \u043d\u0430\u043a\u043b\u043e\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0432 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/cu\/zc\/0x\/cuzc0x6xo2sy39hccbimhczo4pm.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/cu\/zc\/0x\/cuzc0x6xo2sy39hccbimhczo4pm.gif\"\/><\/figure>\n<p>\u0418\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0433\u0438\u0444\u043a\u0438 \u0432\u0438\u0434\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0443. \u042d\u0442\u0438\u043c \u0438 \u0437\u0430\u0439\u043c\u0451\u043c\u0441\u044f. <a href=\"https:\/\/disk.yandex.ru\/d\/mpG1VH3zri3ioA\" rel=\"noopener noreferrer nofollow\">\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u044d\u0442\u043e\u0442 \u044d\u0442\u0430\u043f<\/a>.<\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0443 \u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0432\u0438\u0433\u0430\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0443 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u043c. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0444\u0430\u0439\u043b\u0443 \u0443\u0440\u043e\u0432\u043d\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441.<\/p>\n<pre><code class=\"python\">class YSortCameraGroup(pygame.sprite.Group): def __init__(self): super().__init__() <\/code><\/pre>\n<p>\u041f\u043e \u0441\u0443\u0442\u0438, \u0432\u0441\u0451 \u0447\u0442\u043e \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0441\u0435\u0439\u0447\u0430\u0441 \u2014 \u0441\u043e\u0437\u0434\u0430\u043b \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043f\u0443\u0441\u0442\u043e\u0439 \u0438 \u0441 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432\u0441\u0435\u0433\u043e \u0438 \u0432\u0441\u044f. \u0414\u0430\u043b\u0435\u0435, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u0432\u043c\u0435\u0441\u0442\u043e <code>pygame.sprite.Group()<\/code> \u0432 <code>visible_sprites<\/code>, \u0434\u0430\u0431\u044b \u043d\u0435 \u0442\u0430\u0432\u0442\u043e\u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0430 \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u043b\u0430\u0441\u0441 \u0441 \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u043d\u043a\u0438\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u043a \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u044f\u043c:<\/p>\n<pre><code class=\"python\">class YSortCameraGroup(pygame.sprite.Group): def __init__(self): super().__init__() self.display_surface = pygame.display.get_surface()  def custom_draw(self): for sprite in self.sprites(): self.display_surface.blit(sprite.image, sprite.rect) #\u043f\u0440\u043e\u0440\u0438\u0441\u0443\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u0438 \u043e\u0442\u0440\u0438\u0441\u0443\u0435\u043c \u0435\u0451 <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0442\u0435\u0445 \u0436\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043d\u043e\u0432\u044b\u0445 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439 \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u0434\u0435\u043c\u043e\u043d\u0430 \u0441 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u0441\u043e\u0437\u0434\u0430\u043b \u043c\u0435\u0442\u043e\u0434 \u0440\u0443\u0447\u043d\u043e\u0439 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 (<code>custom_draw<\/code>). \u0422\u0430\u043c \u0441\u0430\u043c\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043f\u0443\u043d\u043a\u0442 \u0432 <code>display_surface.blit<\/code>. \u0421\u0430\u043c Surface \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u043e\u0432\u044b\u0439 \u0441\u043b\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0430 blit \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0435\u0442 \u0438\u0445. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0441\u0430\u043c\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0438 \u0444\u0438\u0433\u0443\u0440\u044b. \u0421\u043a\u043e\u0440\u043e \u0438 \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0432\u0435\u043a\u0442\u043e\u0440\u044b. \u042d\u0442\u0438\u043c \u0438 \u0437\u0430\u0439\u043c\u0451\u043c\u0441\u044f. \u0421\u0430\u043c \u0432\u0435\u043a\u0442\u043e\u0440 \u0437\u043d\u0430\u043a\u043e\u043c \u0432\u0430\u043c \u043f\u043e \u0445\u043e\u0434\u044c\u0431\u0435 \u041b\u0438\u043d\u043a\u0430. \u0414\u0430\u043b\u0435\u0435, \u0441\u043d\u043e\u0432\u0430 \u0443\u043b\u0443\u0447\u0448\u0438\u043c \u043a\u043b\u0430\u0441\u0441:<\/p>\n<pre><code class=\"python\">class YSortCameraGroup(pygame.sprite.Group): def __init__(self): super().__init__() self.display_surface = pygame.display.get_surface() self.offset = pygame.math.Vector2()  def custom_draw(self): for sprite in self.sprites(): offset_pos = sprite.rect.topleft + self.offset #\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043f\u0443\u0442\u0451\u043c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e \u0443\u0433\u043b\u0430 \u0441 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f self.display_surface.blit(sprite.image, offset_pos) #\u043f\u0440\u043e\u0440\u0438\u0441\u0443\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u0438 \u043e\u0442\u0440\u0438\u0441\u0443\u0435\u043c \u0435\u0451 <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0438\u0437 \u043d\u043e\u0432\u043e\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0432 \u0441\u0430\u043c\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435. \u041e\u043d\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e \u0443\u0433\u043b\u0430, \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u0441 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f. \u0414\u0430\u043b\u0435\u0435, \u0432 run-\u043c\u0435\u0442\u043e\u0434\u0435, \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u0441 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u043d\u0430 \u043d\u0430\u0448\u0443 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u0443\u044e. \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">self.visible_sprites.custom_draw() <\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0432\u0441\u0451 \u0432\u0435\u0440\u043d\u043e, \u0432\u0441\u0442\u0430\u0432\u0438\u0432 \u0432 \u0432\u0435\u043a\u0442\u043e\u0440 2 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (x \u0438 y), \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b. \u042f \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b -150 \u0438 -150 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u044d\u0442\u043e:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ax\/va\/h8\/axvah8xksnzlgt3mdg7c8x5c32q.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ax\/va\/h8\/axvah8xksnzlgt3mdg7c8x5c32q.png\"\/><\/figure>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c\u0441\u044f \u0437\u0430\u0446\u0435\u043f\u0438\u0432\u0448\u0438\u0441\u044c \u0437\u0430 \u0433\u0435\u0440\u043e\u044f. \u0415\u0433\u043e \u043c\u044b \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443 \u044d\u043a\u0440\u0430\u043d\u0430 (\u0434\u0430 \u0437\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0435\u0442 \u044d\u043f\u043e\u0445\u0435 Dendy). \u041d\u0430\u0448 \u043a\u043e\u0434 \u043f\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0435:<\/p>\n<pre><code class=\"python\">class YSortCameraGroup(pygame.sprite.Group): def __init__(self): super().__init__() self.display_surface = pygame.display.get_surface() self.half_width = self.display_surface.get_size()[0] \/\/ 2 #\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0430 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u043f\u043e \u0448\u0438\u0440\u0438\u043d\u0435 self.half_heigth = self.display_surface.get_size()[1] \/\/ 2 #\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0430 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u043f\u043e \u0432\u044b\u0441\u043e\u0442\u0435 self.offset = pygame.math.Vector2()  def custom_draw(self, player): self.offset.x = player.rect.centerx - self.half_width #\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 x \u041b\u0438\u043d\u043a\u0430 self.offset.y = player.rect.centery - self.half_heigth #\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 y \u041b\u0438\u043d\u043a\u0430 for sprite in self.sprites(): offset_pos = sprite.rect.topleft - self.offset #\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043f\u0443\u0442\u0451\u043c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e \u0443\u0433\u043b\u0430 \u0441 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f self.display_surface.blit(sprite.image, offset_pos) #\u043f\u0440\u043e\u0440\u0438\u0441\u0443\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u0438 \u043e\u0442\u0440\u0438\u0441\u0443\u0435\u043c \u0435\u0451 <\/code><\/pre>\n<p>\u0412 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0434\u0435\u043c\u043e\u043d\u043e\u0432 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u044d\u043a\u0440\u0430\u043d\u0430 \u0438 \u0446\u0435\u043d\u0442\u0440 \u044d\u043a\u0440\u0430\u043d\u0430 (\u043d\u0430\u0446\u0435\u043b\u043e \u0434\u0435\u043b\u0438\u043c \u043f\u043e\u043f\u043e\u043b\u0430\u043c). \u0412 \u043d\u0430\u0448\u0443 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u0443\u044e \u0440\u0438\u0441\u043e\u0432\u0430\u043b\u043a\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438\u0433\u0440\u043e\u043a\u0430 \u0438 \u043f\u043e x, y \u043e\u0444\u0441\u0435\u0442\u0430\u043c \u0432\u044b\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0438\u0445. \u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 &#171;\u043f\u044c\u044f\u043d\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b&#187;, \u044f \u0432\u044b\u0447\u0438\u0442\u0430\u044e \u0432\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0430 \u043d\u0435 \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u044e \u0435\u0433\u043e. \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 run-\u043c\u0435\u0442\u043e\u0434\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c <code>self.player<\/code>. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/1o\/vl\/fv\/1ovlfv9bsetj4happytfcnep80o.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/1o\/vl\/fv\/1ovlfv9bsetj4happytfcnep80o.gif\"\/><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0445\u0438\u0442\u0431\u043e\u043a\u0441\u0430\u043c\u0438. \u0421\u0435\u0439\u0447\u0430\u0441, \u0443 \u043d\u0430\u0441 \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u0438\u0437 \u0414\u0435\u043d\u0434\u0438, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u043a\u043b\u0435\u0442\u043a\u0430\u043c (\u0442\u0430\u0439\u043b\u0430\u043c). \u041d\u0443\u0436\u043d\u043e \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c \u0442\u0430\u0439\u043b\u0430 \u0438 \u0434\u043e\u043f\u0438\u0448\u0435\u043c \u043e\u0434\u0438\u043d \u0434\u0435\u043c\u043e\u043d-\u044d\u043b\u0435\u043c\u0435\u043d\u0442:<\/p>\n<pre><code class=\"python\">self.hitbox = self.rect.inflate(0, -10) <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u0438 \u0445\u0438\u0442\u0431\u043e\u043a\u0441 \u043d\u0430 10 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u0422\u0430\u043a \u043a\u0430\u043a \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0438\u0434\u0451\u0442 \u0438\u0437 \u0446\u0435\u043d\u0442\u0440\u0430 \u2014 \u043c\u044b \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c \u0445\u0438\u0442\u0431\u043e\u043a\u0441 \u0441\u0432\u0435\u0440\u0445\u0443 \u0438 \u0441\u043d\u0438\u0437\u0443 \u043d\u0430 5 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u0412 \u0434\u0435\u043c\u043e\u043d\u0430\u0445 \u0438\u0433\u0440\u043e\u043a\u0430 \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434, \u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043c \u0445\u0438\u0442\u0431\u043e\u043a\u0441 \u043d\u0430 26 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u0414\u0430\u043b\u0435\u0435, \u043d\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 \u0445\u0438\u0442\u0431\u043e\u043a\u0441\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441 <code>rect.x<\/code> \u0437\u0430\u043c\u0435\u043d\u0438\u043c \u043d\u0430 <code>hitbox.x<\/code>. \u0422\u043e\u0433\u0434\u0430 move-\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">def move(self, speed): if self.direction.magnitude() != 0: self.direction = self.direction.normalize() self.hitbox.x += self.direction.x * speed self.collision('horizontal') self.hitbox.y += self.direction.y * speed self.collision('vertical') self.rect.center = self.hitbox.center <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435, \u043f\u043e\u0447\u0438\u043d\u0438\u043c \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438:<\/p>\n<pre><code class=\"python\">def collision(self, direction): if direction == 'horizontal': for sprite in self.obstacle_sprites: if sprite.hitbox.colliderect(self.hitbox): if self.direction.x > 0: #\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u0432\u043f\u0440\u0430\u0432\u043e self.hitbox.right = sprite.hitbox.left if self.direction.x &lt; 0: #\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u0432\u043b\u0435\u0432\u043e self.hitbox.left = sprite.hitbox.right  if direction == 'vertical': for sprite in self.obstacle_sprites: if sprite.hitbox.colliderect(self.hitbox): if self.direction.y > 0: #\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u0432\u043d\u0438\u0437 self.hitbox.bottom = sprite.hitbox.top if self.direction.y &lt; 0: #\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u0432\u0432\u0435\u0440\u0445 self.hitbox.top = sprite.hitbox.bottom <\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/a8\/og\/um\/a8ogumbvu9eyuwtraeiu6gegrjq.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/a8\/og\/um\/a8ogumbvu9eyuwtraeiu6gegrjq.gif\"\/><\/figure>\n<p>\u041b\u0438\u043d\u043a\u0443 \u043e\u0442\u0440\u044b\u0432\u0430\u0435\u0442 \u0448\u0430\u043f\u043a\u0443. \u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438. \u041a\u0430\u043a\u0438\u0435-\u0442\u043e \u0432\u044b\u0448\u0435, \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043d\u0438\u0436\u0435. \u041d\u0443\u0436\u043d\u043e \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c. \u0418\u0441\u043f\u0440\u0430\u0432\u0438\u043c \u044d\u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043b\u0430\u0441\u0441 YSort (\u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0436\u0435 \u0442\u0430\u043a \u043c\u044b \u043c\u044b \u043d\u0430\u0437\u0432\u0430\u043b\u0438 \u043a\u043b\u0430\u0441\u0441 YSortCameraGroup). \u041f\u043e\u043f\u0440\u0430\u0432\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<pre><code class=\"python\">for sprite in self.sprites(): <\/code><\/pre>\n<p>\u041d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<pre><code class=\"python\">for sprite in sorted(self.sprites(), key = lambda sprite: sprite.rect.centery): <\/code><\/pre>\n<p>\u041f\u043e \u0441\u0443\u0442\u0438, \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e y-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0435. \u041f\u0440\u043e \u043b\u044f\u043c\u0431\u0434\u0443 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e <a href=\"https:\/\/habr.com\/ru\/companies\/piter\/articles\/674234\/\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c<\/a>, \u043d\u043e \u0435\u0441\u043b\u0438 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0433\u0440\u0443\u0431\u043e \u2014 \u043b\u044f\u043c\u0431\u0434\u0430-\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0441 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438.<\/p>\n<p>\u0418\u0442\u043e\u0433:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ns\/ll\/7j\/nsll7jsj49uhu6edhvwepn_lau0.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ns\/ll\/7j\/nsll7jsj49uhu6edhvwepn_lau0.png\"\/><\/figure>\n<p><a href=\"https:\/\/disk.yandex.ru\/d\/yQ82HKzPyOlTMw\" rel=\"noopener noreferrer nofollow\">\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u044d\u0442\u0430\u043f \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/a>.<\/p>\n<h3>\u0413\u0440\u0430\u0444\u0438\u043a\u0430<\/h3>\n<p>\u0422\u0443\u0442 \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043e\u0441\u0432\u043e\u0438\u0442\u044c \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u043d\u043e\u0432\u0443\u044e \u043f\u0440\u043e\u0433\u0443. \u041e\u043d\u0430 \u0431\u044b\u043b\u0430 \u043e\u0447\u0435\u043d\u044c \u0434\u0440\u0443\u0436\u0435\u043b\u044e\u0431\u043d\u043e\u0439 \u0438 \u0441\u043e \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0430\u0437\u0430, \u044f \u0441\u043c\u043e\u0433 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0435 \u0438\u0433\u0440\u044b. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <a href=\"https:\/\/www.mapeditor.org\" rel=\"noopener noreferrer nofollow\">Tiled<\/a>. \u0412 \u043d\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0441 \u043b\u0451\u0433\u043a\u043e\u0441\u0442\u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u044b. \u0421\u0440\u0430\u0437\u0443 \u043e\u0433\u043e\u0432\u043e\u0440\u044e\u0441\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u043c\u043e\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u0430\u0440\u0442\u0430\u043c\u0438. \u042d\u0442\u043e \u0441\u044b\u0433\u0440\u0430\u043b\u043e \u0441\u043e \u043c\u043d\u043e\u0439 \u0437\u043b\u0443\u044e \u0448\u0443\u0442\u043a\u0443. \u0414\u0432\u0430\u0436\u0434\u044b.<\/p>\n<p>\u0427\u0443\u0442\u044c \u0440\u0430\u043d\u0435\u0435 \u044f \u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0430\u0441\u0441\u0435\u0442\u0430\u043c\u0438. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0430\u0439\u043b\u0430 64 \u043f\u0438\u043a\u0441\u0435\u043b\u044f. \u042d\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0438\u0433\u0440 \u0432 \u0440\u044f\u0434, \u043d\u043e \u044f \u043d\u0435 \u0443\u0447\u0451\u043b \u043e\u0434\u0438\u043d \u043c\u043e\u043c\u0435\u043d\u0442 \u2014 \u0432\u0441\u0435 \u0430\u0441\u0441\u0435\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0443 Ninja Adventure \u0431\u044b\u043b\u0438 \u0432 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0438 16 \u043d\u0430 16 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u042d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0438. \u0412 \u043e\u0431\u0449\u0435\u043c, \u0431\u044b\u043b\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435. \u041f\u043e\u043f\u0440\u0430\u0432\u043a\u0430 \u0431\u044b\u043b\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u2014 \u044f \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b \u0440\u0430\u0437\u043c\u0435\u0440 \u043d\u0443\u0436\u043d\u044b\u0445 \u043c\u043d\u0435 \u0442\u0430\u0439\u043b\u043e\u0432 \u0432 4 \u0440\u0430\u0437\u0430 \u0432 \u0444\u043e\u0442\u043e\u0448\u043e\u043f\u0435. \u0412 \u0438\u0442\u043e\u0433\u0435, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0438\u0437 \u044d\u0442\u043e\u0433\u043e:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/n7\/dx\/g0\/n7dxg0sqovm7qjtxmwfcmllmslw.png\" data-src=\"https:\/\/habrastorage.org\/webt\/n7\/dx\/g0\/n7dxg0sqovm7qjtxmwfcmllmslw.png\"\/><\/figure>\n<p>\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/yn\/ed\/x_\/ynedx_aereay58ujsm6-qi2f2pm.png\" data-src=\"https:\/\/habrastorage.org\/webt\/yn\/ed\/x_\/ynedx_aereay58ujsm6-qi2f2pm.png\"\/><\/figure>\n<p>\u0414\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0441\u0430\u043c\u043e\u0439 \u043a\u0430\u0440\u0442\u044b, \u044f \u0432\u0437\u044f\u043b 3 \u0444\u0430\u0439\u043b\u0430 (TilesetFloor.png, TilesetFloorDetails.png \u0438 TilesetWater.png):<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/uv\/j_\/ry\/uvj_rylxktzbe0rfsbuzrgyvzq0.png\" data-src=\"https:\/\/habrastorage.org\/webt\/uv\/j_\/ry\/uvj_rylxktzbe0rfsbuzrgyvzq0.png\"\/><\/figure>\n<blockquote>\n<p><strong>\u0427\u0442\u043e-\u0442\u043e \u0442\u0438\u043f\u0430 \u0432\u043e\u0440\u043d\u0438\u043d\u0433\u0430<\/strong>. \u0422\u0443\u0442 \u0431\u0443\u0434\u044c\u0442\u0435 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u044b. \u041c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u0443 \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0441 \u0442\u0430\u0439\u043b\u0430\u043c\u0438 \u043e\u0434\u043d\u0443. \u041d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0439\u0442\u0435 \u043c\u043e\u0438\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0438\u0436\u0435 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 &#171;\u041c\u043e\u043d\u0441\u0442\u0440\u044b&#187;.<\/p>\n<\/blockquote>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u043f\u0440\u043e\u0447\u0435\u0433\u043e, \u044f \u0441\u043e\u0437\u0434\u0430\u043b \u0437\u0435\u043b\u0451\u043d\u044b\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442 64 \u043d\u0430 64 \u0438 \u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0441 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0432 20%, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0441\u043f\u0430\u0443\u043d\u0430 \u041b\u0438\u043d\u043a\u0430 \u0438 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0435 \u0441\u0442\u0435\u043d\u044b \u0434\u043b\u044f \u043d\u0435\u0433\u043e. \u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043a\u0430\u0440\u0442\u044b.<\/p>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c Tiled \u0438 \u044f \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438. \u041e\u0440\u0442\u043e\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u043b\u0435\u0436\u0438\u0442 \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 x \u0438 y, \u0447\u0442\u043e \u043d\u0430\u043c \u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442. \u0421\u043b\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 CSV \u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043f\u0440\u0430\u0432\u0430 \u0441\u043d\u0438\u0437\u0443. \u0420\u0430\u0437\u043c\u0435\u0440\u044b \u043a\u0430\u0440\u0442\u044b \u0431\u0443\u0434\u0443\u0442 80 \u043d\u0430 60 \u0442\u0430\u0439\u043b\u043e\u0432, \u0430 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 80 \u043d\u0430 64 = 5120 \u0438 60 \u043d\u0430 64 = 3840 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/5z\/kr\/dh\/5zkrdhqj5afln9a-ct1y-agpems.png\" data-src=\"https:\/\/habrastorage.org\/webt\/5z\/kr\/dh\/5zkrdhqj5afln9a-ct1y-agpems.png\"\/><\/figure>\n<p>\u0421\u043e\u0437\u0434\u0430\u0432 \u043a\u0430\u0440\u0442\u0443, \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u0432\u043e\u0451 \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u043f\u043e\u043b\u0435 \u0438 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044e:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/rx\/ii\/s2\/rxiis2ufyukuxp3biikv5t80qzi.png\" data-src=\"https:\/\/habrastorage.org\/webt\/rx\/ii\/s2\/rxiis2ufyukuxp3biikv5t80qzi.png\"\/><\/figure>\n<p>\u0427\u0430\u0441 \u0440\u0430\u0431\u043e\u0442\u044b \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/pa\/cx\/qd\/pacxqd-6ulljrztjabn2lqzwcde.png\" data-src=\"https:\/\/habrastorage.org\/webt\/pa\/cx\/qd\/pacxqd-6ulljrztjabn2lqzwcde.png\"\/><\/figure>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0440\u0430\u0431\u043e\u0442\u0430 \u043e\u0447\u0435\u043d\u044c \u0433\u0440\u0443\u0431\u0430\u044f. \u041d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u0435\u0439. \u0417\u0430\u0439\u043c\u0451\u043c\u0441\u044f \u044d\u0442\u0438\u043c. \u0412\u043e\u0442 \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0441\u043f\u0443\u0441\u0442\u044f \u043c\u0438\u043d\u0443\u0442 20:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/qz\/l1\/ws\/qzl1ws40mjt3x8cnwfrv_y5jxyq.png\" data-src=\"https:\/\/habrastorage.org\/webt\/qz\/l1\/ws\/qzl1ws40mjt3x8cnwfrv_y5jxyq.png\"\/><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435, \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0442\u0430\u0439\u043b\u044b-\u0431\u043b\u043e\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0437\u0430 \u043d\u0438\u0445 \u041b\u0438\u043d\u043a \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043b\u0441\u044f (\u043a\u0443\u0434\u0430 \u0436 \u0431\u0435\u0437 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u0441\u0442\u0435\u043d). \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 \u0432\u0441\u0435 \u043f\u043e\u043b\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b, \u0447\u0442\u043e\u0431\u044b \u041b\u0438\u043d\u043a \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043d\u0435 \u0437\u0430\u043b\u0435\u0442\u0430\u043b. \u0423 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/2c\/60\/gg\/2c60ggttvct771gj8hn1r_fs0js.png\" data-src=\"https:\/\/habrastorage.org\/webt\/2c\/60\/gg\/2c60ggttvct771gj8hn1r_fs0js.png\"\/><\/figure>\n<p>\u041f\u043e\u0442\u043e\u043c \u044f \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u043b \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u043b\u043e\u0439, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043d\u0435 \u043e\u0442\u0432\u043b\u0435\u043a\u0430\u043b. \u0414\u0430\u043b\u0435\u0435, \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043c\u0435\u0441\u0442\u0430 \u0441\u043f\u0430\u0443\u043d\u0430 \u0432\u0440\u0430\u0433\u043e\u0432 (\u0431\u0435\u0431\u043e\u0432) \u0438 \u0413\u0413 (\u041b\u0438\u043d\u043a\u0430):<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/w_\/kp\/vm\/w_kpvmg-n4zcalfx9zmkzdhjgru.png\" data-src=\"https:\/\/habrastorage.org\/webt\/w_\/kp\/vm\/w_kpvmg-n4zcalfx9zmkzdhjgru.png\"\/><\/figure>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0430\u0440\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/hv\/sd\/gg\/hvsdgggeq6l11hoibdj9fgkn5d0.png\" data-src=\"https:\/\/habrastorage.org\/webt\/hv\/sd\/gg\/hvsdgggeq6l11hoibdj9fgkn5d0.png\"\/><\/figure>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043a\u0430\u0440\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0435\u0435 \u043f\u0440\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u0430, \u043d\u0443 \u0434\u0430 \u044d\u0442\u043e \u043d\u0435 \u043c\u043e\u044f \u0437\u0430\u0434\u0430\u0447\u0430. \u041c\u043e\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043a\u0430\u043a \u0442\u0430\u043c \u0438\u0433\u0440\u043e\u0434\u0435\u0432 \u043d\u0430 \u0437\u043c\u0435\u0439\u043a\u0435.<\/p>\n<p>\u0412\u0441\u044e \u0433\u0440\u0430\u0444\u0438\u043a\u0443 \u044f \u043f\u0435\u0440\u0435\u043d\u0451\u0441 \u0432 \u043f\u0430\u043f\u043a\u0443 graphic, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u043b \u043a\u0430\u0440\u0442\u0443 \u0432 <code>.csv<\/code>-\u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0432 \u043f\u0430\u043f\u043a\u0443 map.<\/p>\n<p>\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u043a\u043e\u0434\u0443. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u044f \u0441\u043a\u0438\u043d\u0443\u043b \u0432 \u043f\u0430\u043f\u043a\u0443 Test \u043d\u0430\u0448\u0435\u0433\u043e \u041b\u0438\u043d\u043a\u0430 \u0438 \u043a\u043e\u0440\u043e\u0431\u043a\u0443 \u0438 \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u043b \u043f\u0443\u0442\u0438 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0432 \u0444\u0430\u0439\u043b\u0430\u0445 <code>player.py<\/code> \u0438 <code>title.py<\/code>. \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c. \u0414\u0430\u043b\u0435\u0435, \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u043f\u043e\u0434\u043b\u043e\u0436\u043a\u043e\u0439 \u043d\u0430 \u0447\u0451\u0440\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d \u043d\u0430\u0448\u0443 \u043a\u0430\u0440\u0442\u0443. \u042f \u043f\u0440\u043e\u0441\u0442\u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0431\u0435\u0437 \u0441\u043f\u0430\u0443\u043d\u0430 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b \u0435\u0451 \u0432\u044b\u0448\u0435 \u0447\u0451\u0440\u043d\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430, \u043d\u043e \u043d\u0438\u0436\u0435 \u041b\u0438\u043d\u043a\u0430 \u0441 \u043a\u043e\u0440\u043e\u0431\u043a\u0430\u043c\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u0444\u0430\u0439\u043b\u0435 <code>level.py<\/code> \u044f \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u044a\u044f\u0432\u0438\u043b \u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0442\u0430\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u0432\u0443\u043c\u044f \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u043a\u043e\u0434\u0430 \u0432 \u0434\u0435\u043c\u043e\u043d\u0430\u0445 \u043a\u043b\u0430\u0441\u0441\u0430 <code>YSortCameraGroup<\/code>:<\/p>\n<pre><code class=\"python\">self.floor_surf = pygame.image.load('..\/graphic\/map+det.png').convert() #\u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0437\u0430\u0434\u043d\u0438\u043a \u043a\u0430\u0440\u0442\u044b self.floor_rect = self.floor_surf.get_rect(topleft = (0, 0)) #\u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u043a\u0430\u0440\u0442\u044b \u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 <\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>custom_draw<\/code> \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u0441 \u043e\u0444\u0441\u0435\u0442\u0430\u043c\u0438 \u0434\u043b\u044f \u043a\u0430\u043c\u0435\u0440\u0430\u043c\u0438 (\u0432\u0441\u0451 \u0440\u043e\u0432\u043d\u043e \u0442\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u0438 \u0440\u0430\u043d\u0435\u0435):<\/p>\n<pre><code class=\"python\">floor_offset_pos = self.floor_rect.topleft - self.offset self.display_surface.blit(self.floor_surf, floor_offset_pos) <\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/p-\/nv\/wp\/p-nvwpzivcfjtrzrmac6uexh46k.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/p-\/nv\/wp\/p-nvwpzivcfjtrzrmac6uexh46k.gif\"\/><\/figure>\n<p>\u041f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430\u0441\u043b\u043e\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0440\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u0438 \u043d\u043e\u0432\u043e\u0439. \u0418\u0441\u043f\u0440\u0430\u0432\u0438\u043c \u044d\u0442\u043e\u044e \u0423\u0434\u0430\u043b\u0438\u043c \u0432\u0441\u0451 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>create_map<\/code> \u0432 <code>level.py<\/code>. \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0432 \u043c\u0435\u0442\u043e\u0434, \u044f \u043f\u0440\u0438\u0432\u0451\u043b \u0435\u0433\u043e \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u0438\u0434\u0443:<\/p>\n<pre><code class=\"python\">def create_map(self): self.player = Player((1000, 1000), [self.visible_sprites], self.obstacle_sprites) <\/code><\/pre>\n<p>\u0412\u0441\u0451 \u0447\u0442\u043e \u044f \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u2014 \u044d\u0442\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u043c\u0435\u0441\u0442\u0430 \u041b\u0438\u043d\u043a\u0430 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435. \u041f\u0440\u043e\u0441\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u043b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/m9\/un\/o8\/m9uno82jupl3b2zj2jcmckewahu.png\" data-src=\"https:\/\/habrastorage.org\/webt\/m9\/un\/o8\/m9uno82jupl3b2zj2jcmckewahu.png\"\/><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u0440\u043e\u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u0444\u0430\u0439\u043b\u043e\u043c <code>tile.py<\/code> \u044d\u043c\u0443 \u043d\u0443\u0436\u043d\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430. \u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u043f\u043e\u043c\u0438\u043c\u043e \u043f\u0440\u043e\u0447\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0434\u0435\u043c\u043e\u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0434\u0432\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 <code>sprite_type<\/code> \u0438 <code>surface = pygame.Surface((TILESIZE, TILESIZE))<\/code>. \u0414\u0443\u043c\u0430\u044e, \u043f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0430\u043c \u0442\u0438\u043f \u0441\u043f\u0440\u0430\u0439\u0442\u0430 \u0438 \u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 <code>settings.py<\/code>. \u0415\u0449\u0451 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0441 \u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u043d\u0430 \u0441\u0435\u0431\u044f:<\/p>\n<pre><code class=\"python\">import pygame from settings import *  class Tile(pygame.sprite.Sprite): def __init__(self, pos, groups, sprite_type, surface = pygame.Surface((TILESIZE, TILESIZE))): super().__init__(groups) #\u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u0432\u0441\u0435 \u0433\u0440\u0443\u043f\u043f\u044b self.sprite_type = sprite_type self.image = surface self.rect = self.image.get_rect(topleft = pos) #\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 (\u043b\u0435\u0432\u044b\u0439 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0443\u0433\u043e\u043b) self.hitbox = self.rect.inflate(0, -10) #\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u043e 5 \u043f\u0438\u0441\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u0432\u0435\u0440\u0445\u0443 \u0438 \u0441\u043d\u0438\u0437\u0443 \u043e\u0442 \u0441\u0430\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0434\u043e \u0445\u0438\u0442\u0431\u043e\u043a\u0441\u0430 <\/code><\/pre>\n<p>\u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u0432 <code>creat_map<\/code>. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 csv-\u0444\u0430\u0439\u043b\u043e\u0432:<\/p>\n<pre><code class=\"python\">layout = { 'boundary': import_csv_layout('..\/map\/map_Block.csv') } <\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>import_csv_layout<\/code> \u043d\u0430\u043c \u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c. \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0435\u0433\u043e \u0432 \u043d\u043e\u0432\u043e\u0439 \u0444\u0430\u0439\u043b\u0435 <code>support.py<\/code>.<\/p>\n<pre><code class=\"python\">from csv import reader  def import_csv_layout(path): with open(path) as level_map: layout = reader(level_map, delimiter = ',') for row in layout: print(row)  import_csv_layout('..\/map\/map_Block.csv') <\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0438\u0434\u0451\u0442 \u0447\u0442\u0435\u043d\u0438\u0435 csv-\u0444\u0430\u0439\u043b\u0430. \u0410 \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 &#171;1&#187; \u2014 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0430\u043c \u0435\u0441\u0442\u044c, \u0430 &#171;-1&#187; \u2014 \u0435\u0433\u043e \u0442\u0430\u043c \u043d\u0435\u0442.<\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430 <code>support.py<\/code>:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/3n\/in\/aa\/3ninaaaabhjj56tkz55he6z7m5a.png\" data-src=\"https:\/\/habrastorage.org\/webt\/3n\/in\/aa\/3ninaaaabhjj56tkz55he6z7m5a.png\"\/><\/figure>\n<p>\u0427\u0443\u0442\u044c \u043f\u043e\u0434\u043f\u0440\u0430\u0432\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0443 \u043d\u0430\u0441 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0431\u044b\u043b\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 (\u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a) \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0433\u043e\u0442\u043e\u0432\u0430:<\/p>\n<pre><code class=\"python\">from csv import reader  def import_csv_layout(path): terrain_map = [] with open(path) as level_map: layout = reader(level_map, delimiter = ',') for row in layout: terrain_map.append(list(row)) return terrain_map <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a <code>creat_map<\/code> \u0438 \u0434\u043e\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0443\u044e \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0440\u0430\u043d\u0435\u0435 (\u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c support):<\/p>\n<pre><code class=\"python\">def create_map(self): layout = { 'boundary': import_csv_layout('..\/map\/map_Block.csv') } for style, layout in layout.items(): for row_index, row in enumerate(layout): for col_index, col in enumerate(row): if col != '-1': x = col_index * TILESIZE y = row_index * TILESIZE if style == 'boundary': Tile((x, y), [self.visible_sprites, self.obstacle_sprites], 'invisible') self.player = Player((1000, 1000), [self.visible_sprites], self.obstacle_sprites) <\/code><\/pre>\n<p>\u0418\u0442\u043e\u0433:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/fq\/cm\/ew\/fqcmewdiiqdrzhdd99epy1-kgwi.png\" data-src=\"https:\/\/habrastorage.org\/webt\/fq\/cm\/ew\/fqcmewdiiqdrzhdd99epy1-kgwi.png\"\/><\/figure>\n<p>\u0427\u0451\u0440\u043d\u044b\u0435 \u043a\u0440\u0430\u044f \u2014 \u044d\u0442\u043e \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0435 \u0441\u0442\u0435\u043d\u044b. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0438\u0445 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u043c\u0438. \u0423\u0434\u0430\u043b\u0438\u043c <code>self.visible_sprites<\/code>.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441\u0442\u0438\u043b\u044f \u2014 <code>objects<\/code>. \u0422\u0443\u0442 \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0445 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0432 <code>support.py<\/code> \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c \u043c\u043d\u043e\u0433\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 walk:<\/p>\n<pre><code class=\"python\">def import_folder(path): for _, __, img_files in walk(path): for image in img_files: full_path = path + '\/' + image print(full_path) <\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u043c \u0432\u044b\u0432\u043e\u0434:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/nr\/5i\/zt\/nr5iztoplq3uepre60axndgtsrq.png\" data-src=\"https:\/\/habrastorage.org\/webt\/nr\/5i\/zt\/nr5iztoplq3uepre60axndgtsrq.png\"\/><\/figure>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0434 pygame:<\/p>\n<pre><code class=\"python\">def import_folder(path): surface_list = [] for _, __, img_files in walk(path): for image in img_files: full_path = path + '\/' + image image_surf = pygame.image.load(full_path).convert_alpha() surface_list.append(image_surf) return surface_list <\/code><\/pre>\n<p>\u0421\u0430\u043c \u043c\u0435\u0442\u043e\u0434 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432:<\/p>\n<pre><code class=\"python\">if style == 'objects': surf = graphics['objects'][int(col)] Tile((x, y), [self.visible_sprites, self.obstacle_sprites], 'object', surf) <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u043e\u043c \u043f\u043e \u0432\u0441\u0435\u043c \u0444\u0430\u0439\u043b\u0430\u043c \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u0415\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0431\u044b\u043b\u0438 \u0434\u0440\u0443\u0433 \u0437\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u2014 \u043e\u043d\u0438 \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e \u0441\u0442\u0430\u0432\u044f\u0442\u0441\u044f. \u041d\u0443\u0436\u043d\u043e \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c. \u0418\u0441\u043f\u0440\u0430\u0432\u0438\u043c \u044d\u0442\u043e \u0432 <code>tile.py<\/code>:<\/p>\n<pre><code class=\"python\">if sprite_type == 'object': self.rect = self.image.get_rect(topleft = (pos[0], pos[1] - TILESIZE)) else: self.rect = self.image.get_rect(topleft = pos) #\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 (\u043b\u0435\u0432\u044b\u0439 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0443\u0433\u043e\u043b) <\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0435 \u043c\u044b \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0442\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0418\u0442\u043e\u0433\u043e, \u041b\u0438\u043d\u043a \u0433\u0443\u043b\u044f\u0435\u0442 \u0432 \u043b\u0435\u0441\u0443!<\/p>\n<p><a href=\"https:\/\/disk.yandex.ru\/d\/eKerCcYDe7tTqA\" rel=\"noopener noreferrer nofollow\">\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435<\/a>. \u041f\u043e\u043c\u0438\u043c\u043e \u043f\u0440\u043e\u0447\u0435\u0433\u043e, \u044f \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 Tiled, \u0447\u0442\u043e\u0431\u044b \u0432\u044b \u0441\u0430\u043c\u0438 \u043c\u043e\u0433\u043b\u0438 &#171;\u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c\u0441\u044f&#187; \u0441 \u043d\u0438\u043c. \u0414\u0430\u043b\u0435\u0435, \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e\u0431 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438.<\/p>\n<h3>\u0410\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u041b\u0438\u043d\u043a\u0430<\/h3>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0438 \u043a\u043d\u043e\u043f\u043a\u0443. \u041d\u0430 \u0430\u0442\u0430\u043a\u0443 \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u043e\u044f\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0430 &#171;\u041f\u0440\u043e\u0431\u0435\u043b&#187;. \u041f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u044d\u0442\u043e \u0432 <code>player.py<\/code>:<\/p>\n<pre><code class=\"python\">if keys[pygame.K_SPACE] and not self.attacking: self.attacking = True <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 <code>self.attacking<\/code>. \u0412 \u0434\u0435\u043c\u043e\u043d\u044b \u0444\u0430\u0439\u043b\u0430 \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0442\u0440\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430: \u0441\u0442\u0430\u0442\u0443\u0441 \u0430\u0442\u0430\u043a\u0438 (<code>self.attacking = False<\/code>), \u043a\u0443\u043b\u0434\u0430\u0443\u043d \u043f\u043e\u0441\u043b\u0435 \u0430\u0442\u0430\u043a\u0438 (<code>self.attack_cooldown = 400<\/code>) \u0438 \u0432\u0440\u0435\u043c\u044f \u0430\u0442\u0430\u043a\u0438 (<code>self.attack_time = None<\/code>).<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u0440\u0435\u043c\u044f \u043c\u0435\u0436\u0434\u0443 \u0430\u0442\u0430\u043a\u0430\u043c\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e, \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0430\u0442\u0430\u043a\u0438, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e: <code>self.attack_time = pygame.time.get_ticks()<\/code> \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0430\u0442\u0430\u043a\u0438 \u0444\u043b\u0430\u0433\u043e\u043c <code>True<\/code>. \u0414\u0430\u043b\u0435\u0435, \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 <code>cooldowns<\/code>. \u0421\u0430\u043c \u043c\u0435\u0442\u043e\u0434:<\/p>\n<pre><code class=\"python\">def cooldowns(self): current_time = pygame.time.get_ticks()  if self.attacking: if current_time - self.attack_time >= self.attack_cooldown: self.attacking = False <\/code><\/pre>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430. \u0415\u0441\u043b\u0438 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u043a\u0443\u043b\u0434\u0430\u0443\u043d\u0430 \u0430\u0442\u0430\u043a\u0438 (\u0432 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435 400 \u043c\u0441), \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0442\u044c \u0430\u0442\u0430\u043a\u0443. \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0437\u0430\u043a\u0438\u043d\u0443\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e cooldowns \u0432 update-\u0444\u0443\u043d\u043a\u0446\u0438\u044e.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435, \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u043c\u0435\u0442\u043e\u0434 <code>import_player_assets<\/code>:<\/p>\n<pre><code class=\"python\">def import_player_assets(self): character_path = '..\/graphic\/Link\/' self.animations = {'up': [], 'down': [], 'left': [], 'right': [], 'right_idle': [], 'left_idle': [], 'up_idle': [], 'down_idle': [], 'right_attack': [], 'left_attack': [], 'up_attack': [], 'down_attack': []} <\/code><\/pre>\n<p>\u0412 \u043d\u0451\u043c \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f. \u041e\u043d\u0438 \u043b\u0435\u0436\u0430\u0442 \u0432 \u043f\u0430\u043f\u043a\u0435 &#171;Link&#187;:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/dv\/bz\/7r\/dvbz7r9mulkwm_hifbrckujnmre.png\" data-src=\"https:\/\/habrastorage.org\/webt\/dv\/bz\/7r\/dvbz7r9mulkwm_hifbrckujnmre.png\"\/><\/figure>\n<p>\u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0437\u0430\u043a\u0438\u043d\u0443\u0442\u044c \u0432 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0434\u0435\u043c\u043e\u043d\u043e\u0432 Player-\u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0430\u0448\u0438 \u0430\u0441\u0441\u0435\u0442\u044b: <code>self.import_player_assets()<\/code>. \u0414\u0430\u043b\u0435\u0435, &#171;\u043f\u0440\u043e\u0431\u0435\u0436\u0438\u043c\u0441\u044f&#187; \u043f\u043e \u043d\u0430\u0448\u0438\u043c \u043f\u0430\u043f\u043a\u0430\u043c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043c\u0435\u0442\u043e\u0434\u0443 <code>import_folder<\/code> \u0432 <code>support.py<\/code>:<\/p>\n<pre><code class=\"python\">for animation in self.animations.keys(): full_path = character_path + animation self.animations[animation] = import_folder(full_path) <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0434\u0435\u043c \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b, \u043d\u043e \u0435\u0441\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u2014 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441\u044b \u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443. \u0421\u0442\u0430\u0442\u0443\u0441 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0443\u043a\u0430\u0436\u0435\u043c \u0432 \u0434\u0435\u043c\u043e\u043d\u0435 \u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u041b\u0438\u043d\u043a \u0431\u0443\u0434\u0435\u0442 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u043d\u0438\u0437 (<code>self.status = 'down'<\/code>). \u041d\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u043b\u043e. \u041d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0430 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434:<\/p>\n<pre><code class=\"python\">def get_status(self): if self.direction.x == 0 and self.direction.y == 0: self.status = self.status + '_idle' <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043c\u044b \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 &#171;\u0441\u0442\u043e\u044f\u043d\u0438\u044f&#187; \u0433\u0435\u0440\u043e\u044f. \u0421\u0442\u043e\u044f\u043d\u0438\u0435 \u2014 <code>_idle<\/code>, \u0430 \u0441\u0442\u0430\u0442\u0443\u0441 \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043e\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043e\u043a. \u0417\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c <code>get_status()<\/code> \u0432 update-\u043c\u0435\u0442\u043e\u0434.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435, \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441\u044b \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"python\">if keys[pygame.K_UP]: self.direction.y = -1 self.status = 'up' elif keys[pygame.K_DOWN]: self.direction.y = 1 self.status = 'down' else: self.direction.y = 0  if keys[pygame.K_LEFT]: self.direction.x = -1 self.status = 'left' elif keys[pygame.K_RIGHT]: self.direction.x = 1 self.status = 'right' <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0432\u0441\u0451 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e. \u0414\u0432\u0438\u0436\u0435\u043d\u0438\u0435 = \u0441\u0442\u0430\u0442\u0443\u0441\u0443. \u041f\u043e\u0434\u043f\u0440\u0430\u0432\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u0442\u0430\u0442\u0443\u0441\u0430:<\/p>\n<pre><code class=\"python\">if not 'idle' in self.status: self.status = self.status + '_idle' <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0435\u0441\u043b\u0438 \u043c\u044b \u043e\u0442\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u2014 \u0441\u0442\u0430\u0442\u0443\u0441 \u0440\u0430\u0432\u0435\u043d idle, \u0430 \u0435\u0441\u043b\u0438 \u0434\u0435\u0440\u0436\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0430\u043f\u0433\u0440\u0435\u0439\u0434\u0438\u043c \u043a\u043e\u0434 \u0434\u043b\u044f \u0430\u0442\u0430\u043a \u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 \u0441 &#171;_idle&#187;:<\/p>\n<pre><code class=\"python\">def get_status(self): if self.direction.x == 0 and self.direction.y == 0: if not 'idle' in self.status and not 'attack' in self.status: self.status = self.status + '_idle' if self.attacking: self.direction.x = 0 #\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043f\u043e x self.direction.y = 0 #\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043f\u043e y if not 'attack' in self.status: #\u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \"attack\" if 'idle' in self.status: #\u043d\u043e \u0435\u0441\u0442\u044c \"idle\" self.status = self.status.replace('_idle', '_attack') #\u0443\u0431\u0438\u0440\u0430\u0435\u043c _idle, \u043d\u043e \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c _attack else: self.status = self.status + '_attack' #\u0435\u0441\u043b\u0438 idle \u043d\u0435 \u0431\u044b\u043b\u043e, \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0430\u0432\u0438 attack else: if 'attack' in self.status: self.status = self.status.replace('_attack', '') #\u0443\u0434\u0430\u043b\u044f\u0435\u043c attack \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 <\/code><\/pre>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0437\u0430\u0430\u043d\u0438\u043c\u0438\u0440\u0443\u0435\u043c \u041b\u0438\u043d\u043a\u0430. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0434\u0432\u0430 \u043d\u043e\u0432\u044b\u0445 \u0434\u0435\u043c\u043e\u043d\u0430 <code>self.frame_index = 0<\/code> \u2014 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0441\u043c\u0435\u043d\u044b \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u2014 <code>self.animation_speed = 0.15<\/code>. \u0414\u0430\u043b\u0435\u0435, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434 <code>animate()<\/code>:<\/p>\n<pre><code class=\"python\">def animate(self): animation = self.animations[self.status] #\u0443\u0437\u043d\u0430\u0451\u043c \u0441\u0442\u0430\u0442\u0443\u0441 \u0434\u043b\u044f \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043d\u0443\u0436\u043d\u044b\u0439 \u0444\u0430\u0439\u043b self.frame_index += self.animation_speed #\u0434\u043e\u0431\u043e\u0432\u043b\u044f\u0435\u043c \u043d\u0430\u0448\u0443 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438 \u043a\u043e\u0433\u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0438\u0446\u0430 (\u0438\u0437 0.15), \u0441\u043c\u0435\u043d\u044f\u0435\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 if self.frame_index >= len(animation): #\u043f\u0440\u0438 \u0432\u044b\u043b\u0435\u0442\u0435 \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 self.frame_index = 0 #\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0437\u0430\u0446\u0438\u043a\u043b\u0438\u0432\u0430\u0435\u043c\u0441\u044f self.image = animation[int(self.frame_index)] #\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u0440\u0442\u0438\u043a\u0443 self.rect = self.image.get_rect(center = self.hitbox.center) #\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0445\u0438\u0442\u0431\u043e\u043a\u0441 <\/code><\/pre>\n<p>\u0412\u0441\u0451 \u0447\u0442\u043e \u0442\u0443\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043c\u044b \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0438 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 \u0438\u0445 \u0437\u0430\u0446\u0438\u043a\u043b\u0438\u0442\u044c, \u043a\u0430\u043a \u0432 \u0440\u0438\u043b\u0441\u0430\u0445. \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0432 update-\u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>self.animate()<\/code>.<\/p>\n<p>\u0422\u0443\u0442 \u0443 \u043c\u0435\u043d\u044f \u0437\u0430\u043b\u043e\u0433\u0430\u043b\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0430\u0442\u0430\u043a\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043a\u043d\u043e\u043f\u043a\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u043b\u0430 \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c\u0441\u044f. \u0418\u0441\u043f\u0440\u0430\u0432\u0438\u043c \u044d\u0442\u043e \u0432 input-\u043c\u0435\u0442\u043e\u0434\u0435:<\/p>\n<pre><code class=\"python\">def input(self): #\u0432\u0430\u0440\u044c\u0438\u0440\u0443\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0438 if not self.attacking: keys = pygame.key.get_pressed()  if keys[pygame.K_UP]: self.direction.y = -1 self.status = 'up' elif keys[pygame.K_DOWN]: self.direction.y = 1 self.status = 'down' else: self.direction.y = 0  if keys[pygame.K_LEFT]: self.direction.x = -1 self.status = 'left' elif keys[pygame.K_RIGHT]: self.direction.x = 1 self.status = 'right' else: self.direction.x = 0  if keys[pygame.K_SPACE]: self.attacking = True self.attack_time = pygame.time.get_ticks() <\/code><\/pre>\n<p>\u0418\u0442\u043e\u0433:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/mm\/r7\/pw\/mmr7pwjcipk6fzlcmnanaclguye.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/mm\/r7\/pw\/mmr7pwjcipk6fzlcmnanaclguye.gif\"\/><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435, \u043f\u0440\u043e\u0440\u0438\u0441\u0443\u0435\u043c \u043e\u0440\u0443\u0436\u0438\u0435. <a href=\"https:\/\/disk.yandex.ru\/d\/VVjRMFfvxHqLHg\" rel=\"noopener noreferrer nofollow\">\u0424\u0430\u0439\u043b\u044b \u044d\u0442\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430<\/a>.<\/p>\n<h3>\u041e\u0440\u0443\u0436\u0438\u0435 \u0433\u0435\u0440\u043e\u044f<\/h3>\n<p>\u0422\u0443\u0442 \u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u043b \u043a\u0430\u0440\u0442\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u041b\u0438\u043d\u043a \u0432\u0440\u0435\u0437\u0430\u043b\u0441\u044f \u0432 \u043c\u043e\u0441\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0442 \u043d\u0438\u0436\u043d\u0438\u0435 \u043e\u0441\u0442\u0440\u043e\u0432\u0430. \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u0435\u043b\u0430\u043b\u0430 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 Tiles \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b \u043a\u0430\u0440\u0442\u0443 \u0438 csv-\u0444\u0430\u0439\u043b\u044b. \u0427\u0442\u043e\u0431\u044b \u0432\u0441\u0451 \u0431\u044b\u043b\u043e \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u043d\u043e, \u041b\u0438\u043d\u043a\u0443 \u0432\u044b\u0434\u0430\u0434\u0438\u043c \u043c\u0435\u0447. \u0421\u043f\u0440\u0430\u0439\u0442\u044b \u043d\u0430 \u043c\u0435\u0447\u0438 \u044f \u0442\u043e\u0436\u0435 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043b. \u041e\u043d \u043b\u0435\u0436\u0438\u0442 \u0432 \u043f\u0430\u043f\u043a\u0435 weapons\/sword. \u0422\u0430\u043c 5 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u0433\u0434\u0435 full \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0441\u0430\u043c \u043c\u0435\u0447, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 4 \u2014 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0447\u0430. \u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u043a\u043e\u0434\u0443.<\/p>\n<p>\u0412 \u0444\u0430\u0439\u043b\u0435 <a href=\"http:\/\/setting.py\" rel=\"noopener noreferrer nofollow\">setting.py<\/a>, \u044f \u0441\u043e\u0437\u0434\u0430\u043b \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0438\u0437 \u043e\u0440\u0443\u0436\u0438\u0439. \u0423 \u043c\u0435\u043d\u044f \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043c\u0435\u0447, \u043d\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0440\u0443\u0436\u0438\u044f. \u0421\u0430\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u044c:<\/p>\n<pre><code class=\"python\">weapon_data = {'sword': {'cooldown': 300, 'damage': 15, 'graphic':'..\/graphic\/weapons\/sword\/full.png'}} <\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u0441 \u043d\u0430\u0441\u0442\u043e\u0439\u043a\u043e\u0439 \u043e\u0440\u0443\u0436\u0438\u044f <code>weapon.py<\/code>:<\/p>\n<pre><code class=\"python\">import pygame  class Weapon(pygame.sprite.Sprite): def __init__(self, player, groups): super().__init__(groups) self.image = pygame.Surface((40, 40)) #\u0441\u0430\u043c\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0430 self.rect = self.image.get_rect(center = player.rect.center) #\u043c\u0435\u0441\u0442\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0432\u0441\u0451 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u0438 \u0431\u0435\u0437 \u043d\u043e\u0432\u043e\u0433\u043e. \u041c\u044b \u0446\u0435\u043d\u0442\u0440\u0443\u0435\u043c\u0441\u044f \u043e\u0442 \u0441\u0430\u043c\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u0432 \u043a\u043e\u0434\u0435. \u0421\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0447\u0451\u0440\u043d\u044b\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442 40 \u043d\u0430 40 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u0432 Level \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>create_attack<\/code>.<\/p>\n<pre><code class=\"python\">def create_attack(self): Weapon(self.player, [self.visible_sprites]) <\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435, \u0432 \u0441\u0430\u043c\u043e\u0439 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0435 \u0438\u0433\u0440\u043e\u043a\u0430, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0430\u0448 \u043c\u0435\u0442\u043e\u0434 \u043a\u0430\u043a \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043d\u0435\u0433\u043e:<\/p>\n<pre><code class=\"python\">self.player = Player((1000, 1000), [self.visible_sprites], self.obstacle_sprites, self.create_attack) <\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435, \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u0432 \u0444\u0430\u0439\u043b <a href=\"http:\/\/player.py\" rel=\"noopener noreferrer nofollow\">player.py<\/a> \u0438 \u0442\u0430\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c create_attack \u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0435\u043c\u043e\u043d\u0430. \u0422\u0430\u043a\u0436\u0435, \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043f\u0440\u043e\u0431\u0435\u043b, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043c\u0435\u0442\u043e\u0434 <code>self.create_attak()<\/code>. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u043c \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u0440\u0443\u0436\u0438\u044f:<\/p>\n<pre><code class=\"python\">import pygame  class Weapon(pygame.sprite.Sprite): def __init__(self, player, groups): super().__init__(groups) direction = player.status.split('_')[0] #\u043e\u0431\u0440\u0435\u0437\u0430\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e \"_\" \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0443\u0434\u0430 \u043e\u043d \u0441\u043c\u043e\u0442\u0440\u0438\u0442 full_path = f'..\/graphic\/weapons\/{player.weapon}\/{direction}.png' #\u0430\u0434\u0440\u0435\u0441 \u043e\u0440\u0443\u0436\u0438\u044f self.image = pygame.image.load(full_path).convert_alpha() #\u0441\u0430\u043c\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0430 if direction == 'right': self.rect = self.image.get_rect(midleft = player.rect.midright + pygame.math.Vector2(-10, 16)) elif direction == 'left': self.rect = self.image.get_rect(midright = player.rect.midleft + pygame.math.Vector2(10, 16)) elif direction == 'down': self.rect = self.image.get_rect(midtop = player.rect.midbottom + pygame.math.Vector2(-15, 0)) else: self.rect = self.image.get_rect(midbottom = player.rect.midtop + pygame.math.Vector2(-15, 0)) <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043c\u044b \u043e\u0431\u0440\u0435\u0437\u0430\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e &#171;_&#187; \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0443\u0434\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u0433\u0435\u0440\u043e\u0439 (\u043d\u0435\u0432\u0430\u0436\u043d\u043e \u0441 &#171;attack&#187; \u0438\u043b\u0438 \u0431\u0435\u0437). \u0414\u0430\u043b\u0435\u0435, \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0447\u0442\u043e\u0431\u044b \u043c\u0435\u0447 \u0440\u0438\u0441\u043e\u0432\u0430\u043b\u0441\u044f \u0432 \u0440\u0443\u043a\u0435 \u0443 \u041b\u0438\u043d\u043a\u0430. \u042f \u0432\u044b\u0431\u0440\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434, \u0435\u0441\u043b\u0438 \u043c\u0435\u0447 \u0441\u043b\u0435\u0432\u0430, \u0442\u043e &#171;\u043f\u0440\u0438\u043a\u043b\u0435\u0438\u0442\u044c\u0441\u044f&#187; \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043f\u0440\u0430\u0432\u0430 \u043e\u0442 \u041b\u0438\u043d\u043a\u0430, \u0442\u043e \u0435\u0441\u0442\u044c <code>midleft = player.rect.midright + pygame.math.Vector2(-10, 16)<\/code>. \u0414\u0430\u043b\u0435\u0435, \u043f\u043b\u044e\u0441\u0443\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0447\u0442\u043e\u0431\u044b \u043c\u0435\u0447 \u0431\u044b\u043b \u0440\u043e\u0432\u043d\u043e \u0432 \u0440\u0443\u043a\u0435. \u0414\u0430\u043b\u0435\u0435, \u0432\u0441\u0451 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 <a href=\"http:\/\/player.py\" rel=\"noopener noreferrer nofollow\">player.py<\/a> \u043d\u043e\u0432\u044b\u0445 \u0434\u0435\u043c\u043e\u043d\u043e\u0432:<\/p>\n<pre><code class=\"python\">self.create_attak = create_attak #\u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0430\u0442\u0430\u043a\u0443 self.weapon_index = 0 #\u043d\u043e\u043c\u0435\u0440 \u043e\u0440\u0443\u0436\u0438\u044f (\u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0440\u0443\u0434\u0438\u0439 \u043f\u044b\u0442\u043e\u043a \u043c\u043e\u043d\u0441\u0442\u0440\u043e\u0432) self.weapon = list(weapon_data.keys())[self.weapon_index] #\u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u043e\u0440\u0443\u0436\u0438\u0435 \u0438 \u0432\u0441\u0435 \u0435\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0435\u0441\u0442\u044c \u043c\u0435\u0447, \u043d\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041c\u0435\u0447\u0438 \u043d\u0435 \u0438\u0441\u0447\u0435\u0437\u0430\u044e\u0442:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/-q\/pj\/7k\/-qpj7kfcf-hjzxg_qyjvekzbeye.png\" data-src=\"https:\/\/habrastorage.org\/webt\/-q\/pj\/7k\/-qpj7kfcf-hjzxg_qyjvekzbeye.png\"\/><\/figure>\n<p>\u0427\u0442\u043e \u0436, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432 <code>level.py<\/code>: <code>destroy_weapon<\/code>. \u041f\u043e\u043c\u0438\u043c\u043e \u043f\u0440\u043e\u0447\u0435\u0433\u043e, \u043d\u0443\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0441\u0430\u043c\u043e\u043c <code>level.py<\/code>. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u043e\u0433\u043e \u0434\u0435\u043c\u043e\u043d\u0430 <code>self.current_attack = None<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 <code>create_attack<\/code>.<\/p>\n<pre><code class=\"python\">def create_attack(self): self.current_attack = Weapon(self.player, [self.visible_sprites])  def destroy_weapon(self): if self.current_attack: self.current_attack.kill() self.current_attack = None <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0430\u0442\u0430\u043a\u0438, \u043c\u044b \u0443\u0431\u0438\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438 \u043e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0430\u0442\u0430\u043a\u0438 (<code>current_attak<\/code>). \u041d\u0443\u0436\u0435\u043d \u0435\u0449\u0451 \u043a\u0443\u043b\u0434\u0430\u0443\u043d. \u0422\u0430\u043a\u0436\u0435, \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0441\u043e\u0441\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0430 <code>self.destroy_weapon<\/code> \u0432 player:<\/p>\n<pre><code class=\"python\">self.player = Player((1000, 1000), [self.visible_sprites], self.obstacle_sprites, self.create_attack, self.destroy_weapon) <\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0432 <a href=\"http:\/\/player.py\" rel=\"noopener noreferrer nofollow\">player.py<\/a> \u0438 \u0432\u043d\u0435\u0441\u0451\u043c \u0432 \u043a\u0443\u043b\u0434\u0430\u0443\u043d \u043d\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e: <code>self.destroy_weapon()<\/code>. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/hx\/uz\/cf\/hxuzcfzagyusjhvnw6dqnlnzn2w.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/hx\/uz\/cf\/hxuzcfzagyusjhvnw6dqnlnzn2w.gif\"\/><\/figure>\n<p><a href=\"https:\/\/disk.yandex.ru\/d\/iNPvgc6Yu52cGg\" rel=\"noopener noreferrer nofollow\">\u0424\u0430\u0439\u043b\u044b \u044d\u0442\u0430\u043f\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0437\u0434\u0435\u0441\u044c<\/a>. \u0414\u0430\u043b\u0435\u0435, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<\/p>\n<h3>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/h3>\n<p>\u041d\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438\u0433\u0440\u044b. \u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c, \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0432\u0435\u0449\u0438 \u043a\u0430\u043a \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u0423 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440. \u042d\u0442\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u0421\u0435\u0439\u0447\u0430\u0441 \u0434\u043e\u043f\u0438\u0448\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u0412 \u0434\u0435\u043c\u043e\u043d\u044b \u0432 \u0444\u0430\u0439\u043b\u0435 <code>player.py<\/code> \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/p>\n<pre><code class=\"python\">self.stats = {'health': 100, 'energy': 60, 'attack': 10, 'speed': 5} #\u0432\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0433\u0435\u0440\u043e\u044f self.health = self.stats['health'] #\u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0441\u043e \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435\u043c self.energy = self.stats['energy'] #\u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0441 \u044d\u043d\u0435\u0440\u0433\u0438\u0435\u0439 self.exp = 4221 #\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0447\u043a\u043e\u0432 self.speed = self.stats['speed'] #\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u0430 <\/code><\/pre>\n<p>\u0412\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0438 \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0438\u0437 \u0434\u0435\u043c\u043e\u043d\u0430 \u0440\u0430\u043d\u0435\u0435. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u0447\u0442\u043e \u041b\u0438\u043d\u043a \u0443\u0436\u0435 \u043d\u0430\u0431\u0440\u0430\u043b 4221 \u043e\u0447\u043a\u0430 \u0437\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0441\u0435\u0431\u044f \u043d\u0430 \u044e\u0442\u044e\u0431\u0435 \u0443 \u0410\u0440\u0442\u0443\u0440\u0430 \u0438\u0437 \u0423\u0444\u044b. \u0412 \u0444\u0430\u0439\u043b\u0435 <a href=\"http:\/\/settings.py\" rel=\"noopener noreferrer nofollow\">settings.py<\/a> \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"python\">BAR_HEIGHT = 20 #\u0442\u043e\u043b\u0449\u0438\u043d\u0430 \u0432\u0441\u0435\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u043a HEALTH_BAR_WIDTH = 200  #\u0434\u043b\u0438\u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u044c\u043a\u0438 \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f ENERGY_BAR_WIDTH = 140 #\u0434\u043b\u0438\u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u044c\u043a\u0438 \u044d\u043d\u0435\u0440\u0433\u0438\u0438 ITEM_BOX_SIZE = 80 #\u0440\u0430\u0437\u043c\u0435\u0440 \u0437\u043d\u0430\u0447\u043a\u0430 \u043f\u043e\u0434 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 UI_FONT = '..\/graphic\/font\/joystix.ttf' #\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0448\u0440\u0438\u0444\u0442 UI_FONT_SIZE = 18 #\u043a\u0435\u0433\u0435\u043b\u044c \u0448\u0440\u0438\u0444\u0442\u0430  UI_BG_COLOR = '#222222' #\u0446\u0432\u0435\u0442 \u0437\u0430\u0434\u043d\u0438\u043a\u0430 UI_BORDER_COLOR = '#111111' #\u0446\u0432\u0435\u0442 \u043e\u0431\u0432\u043e\u0434\u043a\u0438 TEXT_COLOR = '#EEEEEE' #\u0446\u0432\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u0430  HEALTH_COLOR = 'red' #\u0446\u0432\u0435\u0442 \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f ENERGY_COLOR = 'green' #\u0446\u0432\u0435\u0442 \u044d\u043d\u0435\u0440\u0433\u0438\u0438 <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0441\u0430\u043c\u044b\u0439 \u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u2014 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0448\u0440\u0438\u0444\u0442. \u0421\u0430\u043c\u044b\u0439 \u0435\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u043b\u044e\u0441 \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u043e\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a. \u0422\u0435\u043f\u0435\u0440\u044c, \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0443\u0440\u043e\u0432\u043d\u044f \u0443\u043a\u0430\u0436\u0435\u043c \u043d\u043e\u0432\u043e\u0433\u043e \u0434\u0435\u043c\u043e\u043d\u0430 <code>self.ui = UI()<\/code> \u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u0430\u043c \u0444\u0430\u0439\u043b \u0432 \u043f\u0440\u043e\u0435\u043a\u0442. \u041f\u043e\u0434 \u043a\u043e\u043d\u0435\u0446, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 run-\u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438:<\/p>\n<pre><code class=\"python\">self.ui.display(self.player) <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b <code>ui.py<\/code>:<\/p>\n<pre><code class=\"python\">import pygame from settings import *  class UI: def __init__(self): self.display_surface = pygame.display.get_surface() #\u043f\u0440\u043e\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 self.font = pygame.font.Font(UI_FONT, UI_FONT_SIZE) #\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0448\u0440\u0438\u0444\u0442\u0430 self.healt_bar_rect = pygame.Rect(10, 10, HEALTH_BAR_WIDTH, BAR_HEIGHT) #\u043f\u0430\u043d\u0435\u043b\u044c\u043a\u0430 \u0434\u043b\u044f \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f self.energy_bar_rect = pygame.Rect(10, 34, ENERGY_BAR_WIDTH, BAR_HEIGHT) #\u043f\u0430\u043d\u0435\u043b\u044c\u043a\u0430 \u0434\u043b\u044f \u044d\u043d\u0435\u0440\u0433\u0438\u0438  def show_bar(self, current, max_amountm, bg_rect, color): pygame.draw.rect(self.display_surface, UI_BG_COLOR, bg_rect) #\u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u043d\u0438\u043a\u0430 \u043f\u0430\u043d\u0435\u043b\u044c\u043a\u0438 ratio = current \/ max_amountm current_with = bg_rect.width * ratio current_rect = bg_rect.copy() current_rect.width = current_with pygame.draw.rect(self.display_surface, color, current_rect) #\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u044c\u043a\u0438 pygame.draw.rect(self.display_surface, UI_BORDER_COLOR, bg_rect, 3) #\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0432\u043e\u0434\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u044c\u043a\u0438  def display(self, player): self.show_bar(player.health, player.stats['health'], self.healt_bar_rect, HEALTH_COLOR) #\u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f self.show_bar(player.energy, player.stats['energy'], self.energy_bar_rect, ENERGY_COLOR) #\u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u044d\u043d\u0435\u0440\u0433\u0438\u0438 <\/code><\/pre>\n<p>\u0418\u0437 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e, \u0442\u0443\u0442 \u0435\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438 \u0440\u0430\u0441\u0441\u0447\u0451\u0442\u043e\u0432:<\/p>\n<pre><code class=\"python\">ratio = current \/ max_amountm current_with = bg_rect.width * ratio current_rect = bg_rect.copy() current_rect.width = current_with <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043c\u044b \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0432 \u043f\u043e\u043b\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0434\u0430\u0436\u0435 140 \u043e\u0447\u043a\u043e\u0432 \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f \u0432 100%. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e, \u043c\u044b \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c <code>current<\/code> \u2014 \u043e\u0447\u043a\u0438 \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f \u0438 \u0434\u0435\u043b\u0438\u043c \u0438\u0445 \u043d\u0430 \u0434\u043b\u0438\u043d\u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u043e\u043b\u044f \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f (<code>max_amountm<\/code>), \u0434\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u044d\u0442\u043e \u0441 <code>bg_rect.width<\/code> \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u043b\u0435. \u042f \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0432 <a href=\"http:\/\/player.py\" rel=\"noopener noreferrer nofollow\">player.py<\/a> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f \u043d\u0430 -10 \u0438 -50 \u043d\u0430 \u044d\u043d\u0435\u0440\u0433\u0438\u044e:<\/p>\n<pre><code class=\"python\">self.health = self.stats['health'] - 10 #\u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0441\u043e \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435\u043c self.energy = self.stats['energy'] - 50 #\u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0441 \u044d\u043d\u0435\u0440\u0433\u0438\u0435\u0439 <\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/lo\/m-\/mx\/lom-mxxf6k8obbhxd6tbl8547qc.png\" data-src=\"https:\/\/habrastorage.org\/webt\/lo\/m-\/mx\/lom-mxxf6k8obbhxd6tbl8547qc.png\"\/><\/figure>\n<p>\u041d\u0430\u0440\u0438\u0441\u0443\u0435\u043c \u0436\u0435 \u043d\u0430\u0448\u0438 \u043e\u0447\u043a\u0438. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043e\u043f\u044f\u0442\u044c \u043a <code>ui.py<\/code> \u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>show_exp<\/code>:<\/p>\n<pre><code class=\"python\">def show_exp(self, exp): text_surf = self.font.render(str(int(exp)), False, TEXT_COLOR) #\u0440\u0435\u043d\u0434\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u0441 \u044d\u043a\u0441\u043f\u043e\u0439, \u0431\u0435\u0437 \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0438 \u0441 \u0446\u0432\u0435\u0442\u043e\u043c x = self.display_surface.get_size()[0] - 20 #\u043e\u0442\u0441\u0442\u0443\u043f \u0441\u043d\u0438\u0437\u0443 \u043d\u0430 20 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043f\u043e x y = self.display_surface.get_size()[1] - 20 #\u043e\u0442\u0441\u0442\u0443\u043f \u0441\u043d\u0438\u0437\u0443 \u043d\u0430 20 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043f\u043e y text_rect = text_surf.get_rect(bottomright = (x, y)) #\u0446\u0435\u043f\u043b\u044f\u0435\u043c\u0441\u044f \u0437\u0430 \u043d\u0438\u0437 \u044d\u043a\u0440\u0430\u043d\u0430 \u0441\u043f\u0440\u0430\u0432\u0430  pygame.draw.rect(self.display_surface, UI_BG_COLOR, text_rect.inflate(20, 20)) #\u0446\u0435\u043f\u043b\u044f\u0435\u043c\u0441\u044f \u0437\u0430 \u043d\u0438\u0437 \u044d\u043a\u0440\u0430\u043d\u0430 \u0441\u043f\u0440\u0430\u0432\u0430 self.display_surface.blit(text_surf, text_rect) #\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c \u043f\u0430\u043d\u0435\u043b\u044c\u043a\u0443 pygame.draw.rect(self.display_surface, UI_BORDER_COLOR, text_rect.inflate(20, 20), 3) #\u043e\u0431\u0432\u043e\u0434\u043a\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 <\/code><\/pre>\n<p>\u0418\u0437 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e, \u0442\u0443\u0442 \u0441\u0442\u043e\u0438\u0442 False \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>self.font.render<\/code>. \u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0443 \u043c\u0435\u043d\u044f \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0440\u0438\u0444\u0442. \u0410 \u0442\u0430\u043a\u0436\u0435, pygame \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043a\u0440\u0443\u0442\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 <code>text_rect.inflate<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0432\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u0432 \u043f\u0430\u043d\u0435\u043b\u044c\u043a\u0443. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u0435\u043d:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/nh\/ho\/oe\/nhhooenw_zub2mrxxsbbibq2hrc.png\" data-src=\"https:\/\/habrastorage.org\/webt\/nh\/ho\/oe\/nhhooenw_zub2mrxxsbbibq2hrc.png\"\/><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0448\u0430\u0433 \u2014 \u043f\u0440\u043e\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u043c\u0435\u0447\u0430 \u041b\u0438\u043d\u043a\u0430. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0434\u0435\u043c\u043e\u043d\u043e\u0432 \u043d\u0430\u0448 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0440\u0443\u0436\u0438\u044f. \u0423 \u043c\u0435\u043d\u044f \u0432 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u043e\u0440\u0443\u0436\u0438\u0435, \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043a\u0443\u0441\u043e\u043a \u043a\u043e\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c, \u043d\u043e \u044f \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u0435 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043e\u0440\u0443\u0436\u0438\u044f, \u0430 \u0437\u0430\u0442\u0435\u043c \u0438 \u0432 \u044d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a:<\/p>\n<pre><code class=\"python\">self.weapon_graphics = [] for weapon in weapon_data.values(): path = weapon['graphic'] weapon = pygame.image.load(path).convert_alpha() self.weapon_graphics.append(weapon) <\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435, \u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432:<\/p>\n<pre><code class=\"python\">def weapon_overlay(self, weapon_index): bg_rect = pygame.Rect(10, 630, ITEM_BOX_SIZE, ITEM_BOX_SIZE) pygame.draw.rect(self.display_surface, UI_BG_COLOR, bg_rect) weapon_surf = self.weapon_graphics[weapon_index] weapon_rect = weapon_surf.get_rect(center = bg_rect.center)  self.display_surface.blit(weapon_surf, weapon_rect) <\/code><\/pre>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435 \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043e\u0440\u0443\u0436\u0438\u044f \u0432 display-\u043c\u0435\u0442\u043e\u0434\u0435: <code>self.weapon_overlay(player.weapon_index)<\/code>.<\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/jy\/te\/cr\/jytecrdqzdmwjgtqv9jiacewklg.png\" data-src=\"https:\/\/habrastorage.org\/webt\/jy\/te\/cr\/jytecrdqzdmwjgtqv9jiacewklg.png\"\/><\/figure>\n<p><a href=\"https:\/\/disk.yandex.ru\/d\/WwhG3l8y5LrT5A\" rel=\"noopener noreferrer nofollow\">\u0424\u0430\u0439\u043b\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/a> \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u043e\u043d\u0441\u0442\u0440\u043e\u0432 (\u0431\u043e\u043b\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043a\u0430\u043a \u0431\u0435\u0431\u044b).<\/p>\n<h3>\u041c\u043e\u043d\u0441\u0442\u0440\u044b<\/h3>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u044f \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043b \u0440\u0435\u0444\u0435\u0440\u0435\u043d\u0441\u044b \u0434\u043b\u044f \u043c\u043e\u043d\u0441\u0442\u0440\u043e\u0432. \u041e\u043d\u0438 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043f\u0430\u043f\u043a\u0435 <code>graphic\/monsters<\/code>. \u0422\u0430\u043a\u0436\u0435, \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0437\u0432\u0443\u043a\u0438 \u0443\u0434\u0430\u0440\u043e\u0432 \u0438 \u0437\u0430\u043a\u0438\u043d\u0443\u043b \u0438\u0445 \u0432 \u043f\u0430\u043f\u043a\u0443 <code>audio\/attack<\/code> \u0414\u0430\u043b\u0435\u0435, \u0432 <a href=\"http:\/\/setting.py\" rel=\"noopener noreferrer nofollow\">setting.py<\/a> \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0438\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<pre><code class=\"python\">monster_data = { 'axalot': {'health': 200, 'exp': 400, 'damage': 40, 'attack_type': 'slash', 'attack_sound': '..\/audio\/attack\/slash.wav', 'speed': 3, 'resistance': 3, 'attack_radius': 80, 'notice_radius': 300}, 'lizard': {'health': 50, 'exp': 100, 'damage': 15,'attack_type': 'claw',  'attack_sound': '..\/audio\/attack\/claw.wav', 'speed': 2, 'resistance': 3, 'attack_radius': 100, 'notice_radius': 400}, 'snake': {'health': 100,'exp':100,'damage': 10,'attack_type': 'claw', 'attack_sound': '..\/audio\/attack\/claw.wav', 'speed': 4, 'resistance': 3, 'attack_radius': 80, 'notice_radius': 350}, 'spirit': {'health': 150,'exp':200,'damage': 15,'attack_type': 'claw', 'attack_sound': '..\/audio\/attack\/claw.wav', 'speed': 3, 'resistance': 3, 'attack_radius': 100, 'notice_radius': 400}} <\/code><\/pre>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0431\u0435\u0436\u0438\u043c\u0441\u044f \u043f\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c:<\/p>\n<ul>\n<li>\n<p><code>health<\/code> \u2014 \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u0431\u0435\u0431\u0430<\/p>\n<\/li>\n<li>\n<p><code>exp<\/code> \u2014 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0447\u043a\u043e\u0432 \u0437\u0430 \u0441\u043c\u0435\u0440\u0442\u044c \u0431\u0435\u0431\u0430<\/p>\n<\/li>\n<li>\n<p><code>damage<\/code>  \u2014 \u043a\u0430\u043a\u043e\u0439 \u0443\u0440\u043e\u043d \u043e\u043d \u043d\u0430\u043d\u0435\u0441\u0451\u0442 \u0433\u0435\u0440\u043e\u044e<\/p>\n<\/li>\n<li>\n<p><code>attack_type<\/code> \u2014 \u0442\u0438\u043f \u0430\u0442\u0430\u043a\u0438<\/p>\n<\/li>\n<li>\n<p><code>attack_sound<\/code> \u2014 \u0437\u0432\u0443\u043a \u0443\u0434\u0430\u0440\u0430<\/p>\n<\/li>\n<li>\n<p><code>speed<\/code> \u2014 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0437\u0432\u0435\u0440\u044c\u043a\u0430<\/p>\n<\/li>\n<li>\n<p><code>resistance<\/code> \u2014 \u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0430\u0433 \u043e\u0442\u043b\u0435\u0442\u0438\u0442 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0443\u0434\u0430\u0440\u0430<\/p>\n<\/li>\n<li>\n<p><code>attack_radius<\/code> \u2014 \u0440\u0430\u0434\u0438\u0443\u0441, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0435\u0431 \u043e\u043f\u0430\u0441\u0435\u043d \u0438 \u043c\u043e\u0436\u0435\u0442 \u0443\u0434\u0430\u0440\u0438\u0442\u044c<\/p>\n<\/li>\n<li>\n<p><code>notice_radius<\/code> \u2014 \u0440\u0430\u0434\u0438\u0443\u0441 \u0437\u0440\u0435\u043d\u0438\u044f \u0432\u0440\u0430\u0436\u0438\u043d\u044b<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u043b\u0435\u0435, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 (<code>entity.py<\/code>) \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u0443\u0434\u0430 \u0441\u0443\u043f\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u0430 \u0441 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0433\u0440\u0443\u043f\u043f:<\/p>\n<pre><code class=\"python\">import pygame  class Entity(pygame.sprite.Sprite): def __init__(self, groups): super().__init__(groups) <\/code><\/pre>\n<p>\u0421\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u044b <code>move<\/code> \u0438 <code>collision<\/code> \u0438\u0437 <code>player.py<\/code>. \u0422\u0435\u043f\u0435\u0440\u044c \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0438\u0437 <code>player.py<\/code> \u044d\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u0431\u0443\u0434\u0435\u043c \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 \u043d\u0435 \u043d\u0430 <code>pygame.sprite.Sprite<\/code>, \u0430 \u043d\u0430 <code>Entity<\/code> (\u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b). \u042d\u0442\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0442\u0430\u043d\u0446\u044b \u0441 \u0431\u0443\u0431\u043d\u043e\u043c \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0433\u0435\u0440\u043e\u044f \u0438 \u0432\u0440\u0430\u0433\u043e\u0432. \u0412\u0441\u0435 \u043e\u043d\u0438 \u2014 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438. \u0422\u0430\u043a\u0436\u0435 \u044f \u043f\u0435\u0440\u0435\u043d\u0451\u0441 \u0434\u0435\u043c\u043e\u043d\u043e\u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438, \u0444\u0440\u0435\u0439\u043c\u0430 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438. \u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0451 \u0441\u0434\u0435\u043b\u0430\u0435\u0442\u0435, \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u0447\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b <code>enemy.py<\/code>:<\/p>\n<pre><code class=\"python\">import pygame from settings import * from entity import Entity  class Enemy(Entity): def __init__(self, monster_name, pos, groups): super().__init__(groups) self.sprite_type = 'enemy' #\u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 \u2014 \u0432\u0440\u0430\u0433\u0438 self.image = pygame.Surface((64, 64)) #\u043d\u0430\u0448 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0430\u0439\u043b\u0430 self.rect = self.image.get_rect(topleft = pos) #\u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 <\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0443\u0440\u043e\u0432\u043d\u044f. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0448 \u0433\u0435\u0440\u043e\u0439 \u0441\u043f\u0430\u0443\u043d\u0438\u043b\u0441\u044f \u0442\u0430\u043c, \u0433\u0434\u0435 \u043d\u0430\u0434\u043e (\u0437\u0435\u043b\u0451\u043d\u044b\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435). \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 csv-\u0444\u0430\u0439\u043b \u0438\u0437 \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u044b <code>'entities': import_csv_layout('..\/map\/map_Spawn.csv')<\/code>. \u0418 \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>creat_map<\/code> \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442:<\/p>\n<pre><code class=\"python\">if style == 'entities': if col == '8': self.player = Player((x, y), [self.visible_sprites], self.obstacle_sprites, self.create_attack, self.destroy_weapon) <\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u0430\u0441 \u0443\u0434\u0438\u0432\u0438\u0442:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/dz\/bb\/m4\/dzbbm4lxnmod4ucsux9yj2etg08.png\" data-src=\"https:\/\/habrastorage.org\/webt\/dz\/bb\/m4\/dzbbm4lxnmod4ucsux9yj2etg08.png\"\/><\/figure>\n<p>\u0413\u0435\u0440\u043e\u0438 \u0425\u0430\u0439\u0440\u0443\u043b\u0430 \u0440\u0430\u0437\u043c\u043d\u043e\u0436\u0438\u043b\u0438\u0441\u044c. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044f \u043f\u0440\u043e\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u043b \u043a\u0430\u0440\u0442\u0443 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043d\u0430\u0431\u043e\u0440\u0430\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u041d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0439\u0442\u0435 \u043c\u043e\u0438\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0441\u0451 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u043e\u043c\u0435\u0440 \u0442\u0430\u0439\u043b\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439 Tiles, \u0430 \u044f \u0443\u043a\u0430\u0437\u0430\u043b, \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0430\u0439\u043b\u044b \u0438 \u043d\u043e\u043c\u0435\u0440\u0430 \u0437\u0430\u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u0443 \u043c\u0435\u043d\u044f \u0431\u044b\u043b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b Bebs.png \u0434\u043b\u044f \u0441\u043f\u0430\u0443\u043d\u0430 \u0432\u0440\u0430\u0433\u043e\u0432 \u0438 Link_and_block.png \u0434\u043b\u044f \u041b\u0438\u043d\u043a\u0430 \u0438 \u0431\u043b\u043e\u043a\u043e\u0432-\u0441\u0442\u0435\u043d. \u0422\u0435\u043f\u0435\u0440\u044c \u044f \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u043b \u0434\u0432\u0430 \u043d\u0430\u0431\u043e\u0440\u0430 \u0442\u0430\u0439\u043b\u043e\u0432 \u0438 \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u043b \u043b\u0438\u043d\u043a\u0443 \u043d\u043e\u043c\u0435\u0440 16. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/cf\/6z\/pz\/cf6zpzgvogebhablacrdfavisqs.png\" data-src=\"https:\/\/habrastorage.org\/webt\/cf\/6z\/pz\/cf6zpzgvogebhablacrdfavisqs.png\"\/><\/figure>\n<p>\u041b\u0438\u043d\u043a \u043d\u0430 \u0441\u0432\u043e\u0451\u043c \u0437\u0430\u043a\u043e\u043d\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u0441\u043f\u0430\u0443\u043c\u0438\u043c \u0432\u0440\u0430\u0433\u043e\u0432, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043b\u0438\u0448\u044c \u043e\u0434\u0438\u043d else:<\/p>\n<pre><code class=\"python\">else: Enemy('monster', (x, y), [self.visible_sprites]) <\/code><\/pre>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ey\/ed\/ql\/eyedqlpnxark47ej0p1ztoi8y3a.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ey\/ed\/ql\/eyedqlpnxark47ej0p1ztoi8y3a.png\"\/><\/figure>\n<p>\u041c\u043e\u043d\u0441\u0442\u0440\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u043b\u0438\u0441\u044c, \u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0438\u0445 \u0432\u0435\u0440\u043d\u043e. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u0444\u0430\u0439\u043b\u043e\u043c <code>enemy.py<\/code>:<\/p>\n<pre><code class=\"python\">import pygame from settings import * from entity import Entity from support import *  class Enemy(Entity): def __init__(self, monster_name, pos, groups): super().__init__(groups) self.sprite_type = 'enemy' #\u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 \u2014 \u0432\u0440\u0430\u0433\u0438 self.import_graphics(monster_name) #\u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u043d\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a self.status = 'idle' #\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0441\u0442\u0430\u0442\u0443\u0441 self.image = self.animations[self.status][self.frame_index] #\u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u043e\u043c\u0435\u0440 \u0444\u0440\u0435\u0439\u043c\u0430 \u0432 \u043f\u0430\u043f\u043a\u0435 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0438\u0436\u0435 self.rect = self.image.get_rect(topleft = pos) #\u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430  def import_graphics(self, monster_name): self.animations = {'idle': [], 'move': [], 'attack': []} #\u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 \u0432 \u043f\u0430\u043f\u043a\u0430\u0445 main_path = f'..\/graphic\/monsters\/{monster_name}\/' #\u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u043c\u043e\u043d\u0441\u0442\u0440\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 :) for animation in self.animations.keys(): #\u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 self.animations[animation] = import_folder(main_path + animation) #\u043f\u0435\u0440\u0435\u0431\u043e\u0440 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f support-\u0444\u0430\u0439\u043b\u0443 <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0432\u0441\u0451 \u0440\u043e\u0432\u043d\u043e \u0442\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u0438 \u0440\u0430\u043d\u0435\u0435, \u043d\u043e \u0435\u0441\u043b\u0438 \u0432 \u0444\u0430\u0439\u043b\u0435 <code>level.py<\/code> \u043c\u044b \u0432\u043d\u0435\u0441\u0451\u043c \u0438\u043c\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u043c\u043e\u043d\u0441\u0442\u0440\u0430, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u043c\u043e\u043d\u0441\u0442\u0440\u0430 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/8c\/qp\/nt\/8cqpntdcv9af2s9txpo8x6b9e2a.png\" data-src=\"https:\/\/habrastorage.org\/webt\/8c\/qp\/nt\/8cqpntdcv9af2s9txpo8x6b9e2a.png\"\/><\/figure>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0442\u044c \u043c\u043e\u043d\u0441\u0442\u0440\u043e\u0432 \u043f\u043e \u0438\u0445 \u043d\u043e\u043c\u0435\u0440\u0430\u043c \u0442\u0430\u0439\u043b\u043e\u0432 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435:<\/p>\n<pre><code class=\"python\">else: if col == '0': monster_name = 'axolot' elif col == '4': monster_name = 'lizard' elif col == '8': monster_name = 'snake' else: monster_name = 'spirit'  Enemy(monster_name, (x, y), [self.visible_sprites]) <\/code><\/pre>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/0d\/bx\/2v\/0dbx2vpdvrznqapup6a0dilsiji.png\" data-src=\"https:\/\/habrastorage.org\/webt\/0d\/bx\/2v\/0dbx2vpdvrznqapup6a0dilsiji.png\"\/><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <code>obstacle_sprites<\/code> \u0432 \u043d\u0430\u0448\u0443 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e, \u0447\u0442\u043e \u0431\u0435\u0431\u044b \u043c\u043e\u0433\u043b\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u041b\u0438\u043d\u043a\u043e\u043c. \u0414\u0430\u043b\u0435\u0435, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c update-\u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430 <code>enemy.py<\/code>:<\/p>\n<pre><code class=\"python\">def update(self): self.move(self.speed) <\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435, \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u043f\u043b\u043e\u0445\u0438\u0448\u0435\u0439. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0438\u0445 \u0432 \u0434\u0435\u043c\u043e\u043d\u043e\u0432 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430:<\/p>\n<pre><code class=\"python\">self.monster_name = monster_name #\u0438\u043c\u044f \u043c\u043e\u043d\u0441\u0442\u0440\u0430 monster_info = monster_data[self.monster_name] #\u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u043d\u0441\u0442\u0440\u0430 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 self.health = monster_info['health'] self.exp = monster_info['exp'] self.speed = monster_info['speed'] self.attack_damage = monster_info['damage'] self.resistance = monster_info['resistance'] self.attack_radius = monster_info['attack_radius'] self.notice_radius = monster_info['notice_radius'] self.attack_type = monster_info['attack_type'] <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043c\u044b \u0441\u0441\u044b\u043b\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u0444\u0430\u0439\u043b <a href=\"http:\/\/settings.py\" rel=\"noopener noreferrer nofollow\">settings.py<\/a> \u0438 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u043e\u043d\u0441\u0442\u0440\u043e\u0432 \u043e\u0442\u0442\u0443\u0434\u0430. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u0434\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u042f \u0434\u0443\u043c\u0430\u043b, \u0447\u0442\u043e \u044d\u0442\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441 \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e \u0443\u0433\u043b\u0430, \u0443 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 (\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438), \u0434\u0430 \u0435\u0449\u0451 \u0438 \u043d\u0443\u0436\u043d\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f &#171;\u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0447\u0438\u0442\u0430&#187; (\u043a\u0430\u043a \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0443 \u041b\u0438\u043d\u043a\u0430). \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u0435\u0441\u044c \u043c\u0435\u0442\u043e\u0434:<\/p>\n<pre><code class=\"python\">def get_player_distance_direction(self, player): enemy_vec = pygame.math.Vector2(self.rect.center) #\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u0432\u0440\u0430\u0433\u0430 player_vec = pygame.math.Vector2(player.rect.center) #\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u041b\u0438\u043d\u043a\u0430 distance = (player_vec - enemy_vec).magnitude() #\u0415\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u0430 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0430 if distance > 0: direction = (player_vec - enemy_vec).normalize() #\u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u044f else: direction = pygame.math.Vector2() #\u0442\u043e\u0447\u043a\u0430, \u043c\u044b \u0434\u0440\u0443\u0433 \u0432 \u0434\u0440\u0443\u0433\u0435 return(distance, direction) <\/code><\/pre>\n<p>\u042f \u0438\u0441\u043a\u0440\u0435\u043d\u043d\u0435 \u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u043b, \u0447\u0442\u043e \u044d\u0442\u043e <strong>\u0442\u0430\u043a<\/strong> \u043f\u0440\u043e\u0441\u0442\u043e. \u041f\u043e \u0441\u0443\u0442\u0438, \u0432\u0441\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0415\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u043e\u0439 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b \u043f\u043e \u043f\u043e\u0438\u0441\u043a\u0443 \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u043c\u044b \u043f\u0435\u0440\u0435\u043b\u043e\u0436\u0438\u043b\u0438 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>magnitude()<\/code>, \u0430 \u0441 \u0447\u0438\u0442\u0435\u0440\u0441\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>normalize()<\/code> \u0432\u044b \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b. \u0418 \u0437\u0430\u0447\u0435\u043c \u044f \u0443\u0447\u0438\u043b \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0443? \u0414\u0430\u043b\u0435\u0435, \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0431\u0435\u0431\u0430 \u043f\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044e \u043a \u041b\u0438\u043d\u043a\u0443:<\/p>\n<pre><code class=\"python\">def get_status(self, player): distance = self.get_player_distance_direction(player)[0] if distance &lt;= self.attack_radius: self.status = 'attack' elif distance &lt;= self.notice_radius: self.status = 'move' else: self.status = 'idle' <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043c\u044b \u043e\u0442\u0441\u0435\u043a\u0430\u0435\u043c \u0438\u0437\u043d\u0443\u0442\u0440\u0438 \u0432\u043e \u0432\u043d\u0435 &#171;\u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438&#187; \u0437\u0440\u0435\u043d\u0438\u044f (\u0431\u043b\u0438\u0437\u043a\u043e \u2014 \u0430\u0442\u0430\u043a\u0430, \u0441\u0440\u0435\u0434\u043d\u044f\u044f \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u044f \u2014 \u043f\u0440\u0435\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u0434\u0430\u043b\u0435\u043a\u043e \u2014 idle), \u043d\u043e \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u043e \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u0430\u043b\u0435 <code>level.py<\/code>:<\/p>\n<pre><code class=\"python\">def enemy_update(self, player): enemy_sprites = [sprite for sprite in self.sprites() if hasattr(sprite,'sprite_type') and sprite.sprite_type == 'enemy'] for enemy in enemy_sprites: enemy.enemy_update(player) <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0441\u0430\u043c\u0430\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u2014 \u0441\u0442\u0440\u043e\u043a\u0430 \u043f\u0440\u043e\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u043d\u0438\u044f \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u0440\u0430\u0433\u0430. \u0422\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a \u0432 \u0430\u043d\u0435\u043a\u0434\u043e\u0442\u0435: &#171;\u041f\u043e\u0442\u0435\u0440\u044f\u0434\u043b\u0441\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442? \u041d\u0438\u0447\u0435\u0433\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0433\u043e! \u0412\u0441\u0435\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>hasattr<\/code>&#171;. \u0414\u0430\u043b\u0435\u0435, \u0432 run-\u043c\u0435\u0442\u043e\u0434\u0435 \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 \u0432\u0440\u0430\u0433\u0430:<\/p>\n<pre><code class=\"python\">self.visible_sprites.enemy_update(self.player) <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044c \u0432\u0440\u0430\u0433\u0430 \u043d\u0430 \u0438\u0433\u0440\u043e\u043a\u0430, \u0430 \u0438\u0433\u0440\u043e\u043a\u0430 \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432 <code>enemy.py<\/code>:<\/p>\n<pre><code class=\"python\">def enemy_update(self, player): self.get_status(player) <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043d\u043e \u043c\u044b \u0441 \u043d\u0438\u043c\u0438 \u043d\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u043c. \u0418\u0441\u043f\u0440\u0430\u0432\u0438\u043c \u044d\u0442\u043e \u043d\u043e\u0432\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c:<\/p>\n<pre><code class=\"python\">def actions(self, player): if self.status == 'attack': print('attack') #\u0442\u0443\u0442 \u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0438\u0448\u0435\u043c \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u0430\u0442\u0430\u043a\u0443 elif self.status == 'move': self.direction = self.get_player_distance_direction(player)[1] #\u043d\u0430\u043d\u044e\u0445\u0438\u0432\u0430\u0442\u044c \u041b\u0438\u043d\u043a\u0430 else: self.direction = pygame.math.Vector2() #\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043f\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c <\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u0432\u0441\u0451 \u0440\u043e\u0432\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0440\u0430\u043d\u0435\u0435, \u043d\u043e \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0437\u0430\u043a\u0438\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0432\u044b\u0437\u043e\u0432 \u0432 <code>enemy_update<\/code>-\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>self.actions(player)<\/code>. \u0422\u0435\u0442\u0435\u0440\u044c \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e. \u041e\u043d\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u041b\u0438\u043d\u043a\u0430:<\/p>\n<pre><code class=\"python\">def animate(self): animation = self.animations[self.status] self.frame_index += self.animation_speed if self.frame_index >= len(animation): self.frame_index = 0 self.image = animation[int(self.frame_index)] self.rect = self.image.get_rect(center = self.hitbox.center) <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435, \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 animate \u0432 update-\u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0430\u0447\u0438\u0432\u043a\u0443: &#171;\u0421\u043e\u0431\u0440\u0430\u043b \u0432\u0441\u0435\u0445 \u0447\u0443\u0448\u043f\u0430\u043d\u043e\u0432 \u0441 \u0440\u0430\u0439\u043e\u043d\u0430&#187;:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/qz\/kv\/np\/qzkvnpmic_-_zq9edveqno6-dhg.png\" data-src=\"https:\/\/habrastorage.org\/webt\/qz\/kv\/np\/qzkvnpmic_-_zq9edveqno6-dhg.png\"\/><\/figure>\n<p>\u041d\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041e\u043d\u0438 \u0430\u0442\u0430\u043a\u0443\u044e\u0442 \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u043e\u0433\u043e \u041b\u0438\u043d\u043a\u0430 \u0442\u043e\u043b\u043f\u043e\u0439 \u0431\u0435\u0437 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0440\u0435\u043c\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u043a\u0443\u043b\u0434\u0430\u0443\u043d\u0430. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043d\u043e\u0432\u043e\u0433\u043e \u0434\u0435\u043c\u043e\u043d\u0430 <code>self.can_attack = True<\/code>. \u042d\u0442\u043e \u0444\u043b\u0430\u0433, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0431\u0435\u0431 \u043c\u043e\u0436\u0435\u0442 \u043f\u043d\u0443\u0442\u044c \u041b\u0438\u043d\u043a\u0430. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0430\u0442\u0430\u043a\u0438 \u0438 \u043f\u043e\u043c\u0438\u043c\u043e \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u0438, \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0444\u043b\u0430\u0433. \u0415\u0441\u043b\u0438 \u0432\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0444\u043b\u0430\u0433 \u043d\u0430 <code>True<\/code>, \u0442\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f (\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 <code>False<\/code>). \u0417\u0430\u043f\u0438\u0448\u0435\u043c \u044d\u0442\u043e\u0442 \u043f\u0443\u043d\u043a\u0442 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"python\">if self.frame_index >= len(animation): if self.status == 'attack': self.can_attack = False <\/code><\/pre>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435. \u0410\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0430\u0442\u0430\u043a\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0442\u044c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0438 \u0435\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0438 \u0432\u0435\u0441\u044c \u0446\u0438\u043a\u043b \u0438\u0437 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u043e\u0442 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043a \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435, \u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0444\u043b\u0430\u0433 \u043d\u0430 \u043e\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u041f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0432\u0441\u0435 \u0432\u0440\u0430\u0433\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0434\u0430\u0440\u0438\u0442\u044c \u043d\u0430\u0441 \u0442\u043e\u043b\u044c\u043a\u043e 1 \u0440\u0430\u0437, \u0442\u0430\u043a \u043a\u0430\u043a \u0444\u043b\u0430\u0433 \u043d\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e. \u041f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u0444\u043b\u0430\u0433 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e \u043a\u0443\u043b\u0434\u0430\u0443\u043d\u0443 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0443\u0437\u0443. \u0422\u043e \u0435\u0441\u0442\u044c, \u044f \u0434\u0430\u0431\u0430\u043b\u0432\u044e \u0434\u0432\u0430 \u0434\u0435\u043c\u043e\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0430\u0442\u0430\u043a\u0438 \u0438 \u043a\u0443\u043b\u0434\u0430\u0443\u043d \u043f\u043e\u0441\u043b\u0435 \u0430\u0442\u0430\u043a\u0438:<\/p>\n<pre><code class=\"python\">self.attack_time = None self.attack_cooldown = 400 <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u0441\u0430\u043c \u043c\u0435\u0442\u043e\u0434 \u043a\u0443\u043b\u0434\u0430\u0443\u043d\u0430 \u043f\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044e \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438:<\/p>\n<pre><code class=\"python\">def cooldown(self): if not self.can_attack: current_time = pygame.time.get_ticks() if current_time - self.attack_time >= self.attack_cooldown: self.can_attack = True <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u043f\u0440\u043e \u043c\u0435\u0441\u0442\u043e \u0441\u0442\u0430\u0440\u0442\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0430\u0442\u0430\u043a\u0438:<\/p>\n<pre><code class=\"python\">self.attack_time = pygame.time.get_ticks() <\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e, \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0437\u0430\u043a\u0438\u043d\u0443\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0432 update-\u043c\u0435\u0442\u043e\u0434. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/8y\/oj\/p7\/8yojp7whdb3ugbn1mdkc3fxtody.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/8y\/oj\/p7\/8yojp7whdb3ugbn1mdkc3fxtody.gif\"\/><\/figure>\n<p>\u041c\u044b \u043d\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0432\u0440\u0430\u0433\u0430\u043c\u0438, \u043d\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044e <a href=\"https:\/\/disk.yandex.ru\/d\/R_we7k1uGvTW7Q\" rel=\"noopener noreferrer nofollow\">\u0431\u044d\u043a\u0430\u043f \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/a> \u0441\u0435\u0439\u0447\u0430\u0441 \u0438 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0430\u0441 \u0441 \u0432\u0440\u0430\u0433\u0430\u043c\u0438 \u0438 \u0432\u0440\u0430\u0433\u043e\u0432 \u0441 \u043d\u0430\u043c\u0438.<\/p>\n<h3>\u0414\u0440\u0430\u043a\u0438 \u0441 \u0431\u0435\u0431\u0430\u043c\u0438<\/h3>\n<p>\u0418\u0442\u0430\u043a, \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0432\u0430 \u043d\u043e\u0432\u044b\u0445 \u0434\u0435\u043c\u043e\u043d\u0430 \u0434\u043b\u044f \u0430\u0442\u0430\u043a \u0432 <code>level.py<\/code>:<\/p>\n<pre><code class=\"python\">self.attack_sprites = pygame.sprite.Group() #\u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0438\u0439 \u0441\u043f\u0440\u0430\u0439\u0442 self.attackable_sprites = pygame.sprite.Group() #\u0430\u0442\u0430\u043a\u0443\u0435\u043c\u044b\u0439 \u0441\u043f\u0440\u0430\u0439\u0442 <\/code><\/pre>\n<p>\u0414\u0443\u043c\u0430\u044e, \u043f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0434\u0435\u043c\u043e\u043d\u044b \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0430\u0442\u0430\u043a\u0438. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u043c \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0437\u043e\u0432\u0430 \u0432\u0440\u0430\u0433\u043e\u0432 \u043f\u043e\u043c\u0438\u043c\u043e \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432, \u0430\u0442\u0430\u043a\u0443\u0435\u043c\u044b\u043c\u0438 \u0441\u043f\u0440\u0430\u0439\u0442\u0430\u043c\u0438 (<code>self.attack_sprites<\/code>):<\/p>\n<pre><code class=\"python\">Enemy(monster_name, (x, y), [self.visible_sprites, self.attackable_sprites], self.obstacle_sprites) <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u043c \u043c\u0435\u0442\u043e\u0434 <code>create_attack<\/code> \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0438\u043c \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u043c (<code>self.attack_sprites<\/code>) :<\/p>\n<pre><code class=\"python\">def create_attack(self): self.current_attack = Weapon(self.player, [self.visible_sprites, self.attack_sprites]) <\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435, \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0441 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u0430\u0442\u0430\u043a\u0438 \u0438\u0433\u0440\u043e\u043a\u0430:<\/p>\n<pre><code class=\"python\">def player_attack_logic(self): if self.attack_sprites: for attack_sprites in self.attack_sprites: collision_sprites = pygame.sprite.spritecollide(attack_sprites, self.attackable_sprites, False) if collision_sprites: for target_sprite in collision_sprites: target_sprite.kill() <\/code><\/pre>\n<p>\u0421\u0430\u043c\u0430\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0442\u0443\u0442, \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043f\u0430\u0439\u0433\u0435\u0439\u043c\u0430 <code>pygame.sprite.spritecollide<\/code>. \u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0441\u043f\u0440\u0430\u0439\u0442 \u0438\u0437 \u0433\u0440\u0443\u043f\u043f\u044b. \u041f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u2014 \u0441\u043f\u0440\u0430\u0439\u0442\u044b \u0434\u043b\u044f \u0430\u0442\u0430\u043a\u0438, \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u0433\u0440\u0443\u043f\u043f\u0430 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0441\u043f\u0440\u0430\u0439\u0442, \u0442\u0440\u0435\u0442\u0438\u0439 \u2014 DoKill. \u0415\u0441\u043b\u0438 \u0443 DoKill \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>True<\/code>, \u0432\u0441\u0435 \u0441\u043f\u0440\u0430\u0439\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0442\u0441\u044f, \u0431\u0443\u0434\u0443\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u044b \u0438\u0437 \u0433\u0440\u0443\u043f\u043f\u044b. \u0414\u0430\u043b\u0435\u0435, \u0432 run-\u043c\u0435\u0442\u043e\u0434\u0435 \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u043d\u0430\u0448 \u043c\u0435\u0442\u043e\u0434. \u0418\u0441\u0445\u043e\u0434:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/jq\/ev\/w0\/jqevw0gvyg0lioewqm7ddg_pu_k.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/jq\/ev\/w0\/jqevw0gvyg0lioewqm7ddg_pu_k.gif\"\/><\/figure>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u043c \u043c\u0435\u0442\u043e\u0434 <code>player_attack_logic<\/code>:<\/p>\n<pre><code class=\"python\">if target_sprite.sprite_type == 'enemy': target_sprite.get_damage(self.player, attack_sprites.sprite_type) <\/code><\/pre>\n<p>\u041c\u044b \u0441\u0442\u0430\u043b\u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430\u0448\u0438 \u0441\u043f\u0440\u0430\u0439\u0442\u044b \u043f\u043e \u0442\u0438\u043f\u0430\u043c. \u0412 \u043c\u043e\u0451\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u0442\u0438\u043f\u043e\u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0432\u0430 (enemy \u0438 weapon). \u042f \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043b \u0432 \u0444\u0430\u0439\u043b\u0435 <code>weapon.py<\/code> \u0432 \u0434\u0435\u043c\u043e\u043d\u0435 \u0441\u0442\u0440\u043e\u043a\u0443 \u0434\u043b\u044f \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f \u0435\u043c\u0443 \u043d\u043e\u0432\u043e\u0433\u043e \u0442\u0438\u043f\u0430:<\/p>\n<pre><code class=\"python\">self.sprite_type = 'weapon' <\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435, \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0432\u0440\u0430\u0433\u0430 \u043f\u0440\u0438 \u0443\u0434\u0430\u0440\u0435. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0435\u043c\u0443 \u0443\u0440\u043e\u043d \u043e\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u0440\u0443\u0436\u0438\u044f. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0432 \u0444\u0430\u0439\u043b\u0435 <a href=\"http:\/\/enemy.py\" rel=\"noopener noreferrer nofollow\">enemy.py<\/a> \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u2014 <code>get_damage<\/code>:<\/p>\n<pre><code class=\"python\">def get_damage(player, attack_type): if attack_type == 'weapon': self.health -= player.get_full_weapon_damage() <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043c\u044b \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 (<code>get_full_weapon_damage<\/code>), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u0443\u043c\u043c\u0443 \u0443\u0440\u043e\u043d\u0430 \u043e\u0442 \u043e\u0440\u0443\u0436\u0438\u044f \u0438 \u043e\u0442 \u0441\u0438\u043b\u044b \u0441\u0430\u043c\u043e\u0433\u043e \u041b\u0438\u043d\u043a\u0430 (\u043f\u0440\u044f\u043c\u043e \u043a\u0430\u043a \u0432 Dark Souls). \u041f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u0436\u0435 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432 <code>player.py<\/code>:<\/p>\n<pre><code class=\"python\">def get_full_weapon_damage(self): base_damage = self.stats['attack'] #\u0443\u0440\u043e\u043d \u0441\u0430\u043c\u043e\u0433\u043e \u041b\u0438\u043d\u043a\u0430 weapon_damage = weapon_data[self.weapon]['damage'] #\u0443\u0440\u043e\u043d \u043e\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0440\u0443\u0436\u0438\u044f return base_damage + weapon_damage <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0438 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u0443\u0440\u043e\u043d\u044b \u0438\u0445 \u043d\u0430\u0448\u0438\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0442\u0443\u0442 \u0432\u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441: &#171;\u0417\u0430\u0447\u0435\u043c \u0442\u0430\u043a \u0441\u043b\u043e\u0436\u043d\u043e, \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043c\u0435\u0447 \u0438 \u0432\u0441\u0451?&#187;. \u042f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0441 \u043d\u0438\u043c &#171;\u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c\u0441\u044f&#187;. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438 \u0446\u0435\u043b\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0435 \u043d\u043e\u043c\u0438\u043d\u0430\u0446\u0438\u044f &#171;\u0418\u0433\u0440\u0430 \u0433\u043e\u0434\u0430&#187; \u0432 The Game Awards, \u0430 \u043b\u0438\u0448\u044c \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u044f\u0437\u044b\u043a\u0430 Python \u043a\u0430\u043a \u043d\u0435\u043f\u043b\u043e\u0445\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430. \u041d\u0443 \u0434\u0430 \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u043a\u043e\u0434\u0443. \u041f\u043e\u043c\u0438\u043c\u043e \u0443\u0440\u043e\u043d\u0430, \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0443\u043b\u0434\u0430\u0443\u043d \u043e\u0440\u0443\u0436\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u043b \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<pre><code class=\"python\">if current_time - self.attack_time >= self.attack_cooldown <\/code><\/pre>\n<p>\u041d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<pre><code class=\"python\">if current_time - self.attack_time >= self.attack_cooldown + weapon_data[self.weapon]['cooldown'] <\/code><\/pre>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432 <code>enemy.py<\/code> \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0441\u043c\u0435\u0440\u0442\u0438 \u0432\u0440\u0430\u0436\u0438\u043d\u044b:<\/p>\n<pre><code class=\"python\">def check_death(self): if self.health &lt;= 0: self.kill() <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u044f \u0434\u0430\u0436\u0435 \u043d\u0435 \u0437\u043d\u0430\u044e \u0447\u0442\u043e \u0435\u0449\u0451 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u0438\u0442\u044c \u0432 \u043a\u043e\u0434\u0435 \ud83d\ude42 \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432 update-\u043c\u0435\u0442\u043e\u0434. \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0434\u0438\u043d \u0443\u0434\u0430\u0440 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0441\u043c\u0435\u0440\u0442\u0438 \u0432\u0440\u0430\u0433\u0430. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u0432, PyGame \u0441\u0447\u0438\u0442\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u043e\u043a\u0430 \u043e\u0440\u0443\u0436\u0438\u0435 \u0441\u043e\u043f\u0440\u0438\u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0441 \u0432\u0440\u0430\u0433\u043e\u043c (\u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439), \u0443\u0434\u0430\u0440\u044b \u043d\u0430\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0437\u0430 \u0434\u0440\u0443\u0433\u0438\u043c. \u041a\u0430\u043a \u0438\u0442\u043e\u0433 \u2014 \u041b\u0438\u043d\u043a \u0442\u0430\u043d\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0435\u0442 \u0432\u0441\u0451 \u043d\u0430 \u0441\u0432\u043e\u0451\u043c \u043f\u0443\u0442\u0438. \u0418\u0441\u043f\u0440\u0430\u0432\u0438\u043c \u044d\u0442\u043e. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0445 \u0434\u0435\u043c\u043e\u043d\u043e\u0432 <code>enemy.py<\/code>:<\/p>\n<pre><code class=\"python\">self.vulnerable = True #\u0444\u043b\u0430\u0433 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 self.hit_time = None #\u0432\u0440\u0435\u043c\u044f \u0443\u0434\u0430\u0440\u0430 self.invincibility_duration = 300 #\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0435\u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0435 \u0434\u0435\u043c\u043e\u043d\u044b. \u0412\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u2014 \u0444\u043b\u0430\u0433 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438. \u0415\u0441\u043b\u0438 \u043e\u043d \u043f\u043e\u0434\u043d\u044f\u0442 \u2014 \u0432\u0440\u0430\u0433 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0443\u0440\u043e\u043d. \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0442\u0440\u043e\u0438\u043c \u0438\u0445 \u0432 <code>get_damage<\/code>:<\/p>\n<pre><code class=\"python\">def get_damage(self, player, attack_type): if self.vulnerable: if attack_type == 'weapon': self.health -= player.get_full_weapon_damage() self.hit_time = pygame.time <\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u0434 cooldown-\u043c\u0435\u0442\u043e\u0434\u0430:<\/p>\n<pre><code class=\"python\">if not self.vulnerable: if current_time - self.hit_time >= self.invincibility_duration: self.vulnerable = True <\/code><\/pre>\n<p>\u0422\u0443\u0442, \u043a\u0430\u043a \u044f \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u0440\u0430\u043d\u0435\u0435, \u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u044e \u0444\u043b\u0430\u0433\u0430. \u0423 \u043d\u0430\u0441 \u0431\u044b\u043b\u043e \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u0444\u043b\u0430\u0433 \u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0432 cooldown-\u043c\u0435\u0442\u043e\u0434\u0435 \u043e\u043d \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0435\u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0435 \u0432\u0440\u0430\u0433\u0438 \u0443\u0431\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u0440\u0438\u044f\u0442\u043d\u043e. \u0422\u0435\u043f\u0435\u0440\u044c, \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0442\u0431\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0440\u0430\u0433\u0430 \u043d\u0430 \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u0430 \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u0440\u0430\u0433\u0430. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0435\u0449\u0451 \u043c\u0435\u0442\u043e\u0434:<\/p>\n<pre><code class=\"python\">def hit_reaction(self): if not self.vulnerable: self.direction *= -self.resistance <\/code><\/pre>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>get_damage<\/code>:<\/p>\n<pre><code class=\"python\">self.direction = self.get_player_distance_direction(player)[1] <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043c\u0435\u0440\u0446\u0430\u043d\u0438\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0443\u0434\u0430\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u0443\u0434\u0430\u0440 \u0431\u044b\u043b \u0441\u0434\u0435\u043b\u0430\u043d. \u0412 PyGame \u0432\u0441\u0435 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u044b (\u0441\u0438\u043d\u0443\u0441\u043e\u0438\u0434\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438) \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043e\u0442 -255 \u0434\u043e 255, \u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0443\u0434\u043e\u0431\u043d\u043e \u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u0441\u0438\u043d\u0443\u0441\u043e\u0438\u0434, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u044f \u0432 Python \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0442\u0435\u043f\u0435\u043d\u0435\u0439 (\u043a\u0430\u043a \u0438 \u043b\u044e\u0431\u043e\u0439 \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440), \u0430 \u0437\u0430\u0442\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u0441\u0438\u043d\u0443\u0441\u043e\u0438\u0434\u0435. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b \u0434\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043e\u0434 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0443\u043b\u044c\u0441\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"python\">def wave_value(self): value = sin(pygame.time.get_ticks()) if value >= 0: return 255 else: return 0 <\/code><\/pre>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0432 <code>entity.py<\/code>. \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c sin-\u043c\u0435\u0442\u043e\u0434 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 math. \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0437\u043e\u0432\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0438 \u0443\u0434\u0430\u0440\u0435 \u043f\u043e \u0432\u0440\u0430\u0433\u0443 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>animate<\/code>:<\/p>\n<pre><code class=\"python\">if not self.vulnerable: alpha = self.wave_value() self.image.set_alpha(alpha) else: self.image.set_alpha(255) <\/code><\/pre>\n<p>\u0418\u0442\u0430\u043a, \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0431\u044c\u0451\u043c \u0432\u0440\u0430\u0433\u043e\u0432 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0432\u0435\u0440\u043d\u043e \u0438 \u043c\u043e\u0436\u0435\u043c \u043e\u0442\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u043a\u043e\u0433\u0434\u0430 \u0432\u0440\u0430\u0433\u0438 \u0430\u0442\u0430\u043a\u0443\u044e\u0442 \u043d\u0430\u0441 (\u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 &#171;attack&#187;). \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u0446\u0430\u0435\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u041b\u0438\u043d\u043a\u0430. \u041f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u0435\u0433\u043e \u0432 <code>level.py<\/code>:<\/p>\n<pre><code class=\"python\">def damage_player(self, amount, attack_type): if self.player.vulnerable: self.player.health -= amount self.player.vulnerable = False self.player.hurt_time = pygame.time.get_ticks() <\/code><\/pre>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u043c \u0432 <code>create_map<\/code> \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u0430 \u0432\u0440\u0430\u0433\u043e\u0432 \u043d\u0430\u043d\u0435\u0441\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u043d\u0430 \u041b\u0438\u043d\u043a\u0443:<\/p>\n<pre><code class=\"python\">Enemy(monster_name, (x, y), [self.visible_sprites, self.attackable_sprites], self.obstacle_sprites, self.damage_player) <\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 Enemy-\u043a\u043b\u0430\u0441\u0441 \u043d\u0430\u0448 \u043d\u043e\u0432\u044b\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 (<code>damage_player<\/code>) \u0438 \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u043d\u043e\u0432\u043e\u0433\u043e \u0434\u0435\u043c\u043e\u043d\u0430 \u2014 <code>self.damage_player = damage_player<\/code>. \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0432\u044b\u0432\u043e\u0434\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f &#171;attack&#187; \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0432\u044b\u0437\u043e\u0432 \u043d\u0430\u0448\u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430:<\/p>\n<pre><code class=\"python\">self.damage_player(amount, attack_type) <\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0442\u0430\u0439\u043c\u0435\u0440\u043e\u0432 \u0432 \u0434\u0435\u043c\u043e\u043d\u043e\u0432 \u043d\u0430\u0448\u0435\u0433\u043e player-\u043a\u043b\u0430\u0441\u0441\u0430:<\/p>\n<pre><code class=\"python\">self.vulnerable = True self.hurt_time = None self.invulnerablity_duration = 500 <\/code><\/pre>\n<p>\u041e\u043d\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b \u0434\u0435\u043c\u043e\u043d\u0430\u043c \u0432 <code>enemy.py<\/code>. \u0414\u0430\u043b\u0435\u0435, \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u0441\u043c\u0435\u043d\u0443 \u0444\u043b\u0430\u0433\u0430 \u0432 \u043d\u0430\u0448 \u043a\u0443\u043b\u0434\u0430\u0443\u043d-\u043c\u0435\u0442\u043e\u0434:<\/p>\n<pre><code class=\"python\">if not self.vulnerable: if current_time - self.hurt_time >= self.invulnerablity_duration: self.vulnerable = True <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u043d\u0430\u0448\u0435 \u043c\u0435\u0440\u0446\u0430\u043d\u0438\u0435. \u0422\u0443\u0442 \u0432\u0441\u0451 \u0442\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u0438 \u0440\u0430\u043d\u0435\u0435. \u041f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u0432 animate-\u043c\u0435\u0442\u043e\u0434\u0435:<\/p>\n<pre><code class=\"python\">if not self.vulnerable: alpha = self.wave_value() self.image.set_alpha(alpha) else: self.image.set_alpha(255) <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u044d\u043d\u0435\u0440\u0433\u0438\u044e (\u043f\u043e\u0432\u0442\u043e\u0440\u0438\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0443 \u0438\u0437 Dark Souls). \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434 <code>energy_recover<\/code>:<\/p>\n<pre><code class=\"python\">def energy_recover(self): if self.energy &lt; self.stats['energy']: self.energy += 0.1 else: self.energy = self.stats['energy'] <\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435, \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u0443\u0434\u0430\u0440\u0435 \u0443 \u043d\u0430\u0441 \u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f 10 \u043e\u0447\u043a\u043e\u0432 \u0441\u0442\u0430\u043c\u0438\u043d\u044b, \u0430 \u0435\u0441\u043b\u0438 \u0435\u0451 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u2014 \u0430\u0442\u0430\u043a\u0430 \u043d\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442:<\/p>\n<pre><code class=\"python\">if keys[pygame.K_SPACE]: if self.energy >= 10: self.energy -= 10 self.attacking = True self.attack_time = pygame.time.get_ticks() self.create_attak() self.weapon_attack_sound.play() <\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435, \u0447\u0442\u043e \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u2014 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043a\u0441\u043f\u0443 \u0437\u0430 \u0443\u0431\u0438\u0439\u0441\u0442\u0432\u043e \u0432\u0440\u0430\u0433\u0430 \u0432 <code>level.py<\/code>:<\/p>\n<pre><code class=\"python\">def add_xp(self, amount): self.player.exp += amount <\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u044d\u0442\u043e\u0442 \u0436\u0435 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f <code>create_map<\/code> \u0432 <code>Enemy<\/code>. \u0414\u0430\u043b\u0435\u0435, \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u043c \u0432\u0441\u0451, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u043b\u0438 \u0440\u0430\u043d\u0435\u0435 \u0441 <code>damage_player<\/code>.<\/p>\n<p><a href=\"https:\/\/disk.yandex.ru\/d\/fH7ArtoIx-sQSw\" rel=\"noopener noreferrer nofollow\">\u0424\u0430\u0439\u043b\u044b \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u0442\u0443\u0442<\/a> \u0438 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c\u0443 \u0448\u0430\u0433\u0443 \u2014 \u043c\u0443\u0437\u044b\u043a\u0435.<\/p>\n<h3>\u041c\u0443\u0437\u044b\u043a\u0430<\/h3>\n<p>\u041c\u044b \u043d\u0430 \u0444\u0438\u043d\u0438\u0448\u043d\u043e\u0439 \u043f\u0440\u044f\u043c\u043e\u0439. \u0412 \u043d\u0430\u0448\u0435\u0433\u043e <code>player.py<\/code> \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0434\u0435\u043c\u043e\u043d\u043e\u0432:<\/p>\n<pre><code class=\"python\">self.weapon_attack_sound = pygame.mixer.Sound('..\/audio\/attack\/slash.wav') self.weapon_attack_sound.set_volume(0.4) <\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0434\u0435\u043c\u043e\u043d \u0443\u043a\u0430\u0436\u0435\u0442 \u043d\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u043d\u0430 \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c. \u0414\u0430\u043b\u0435\u0435, \u0432\u044b\u0437\u043e\u0432\u0435\u043c \u0437\u0432\u0443\u043a \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043a\u043b\u0430\u0432\u0438\u0448\u0443:<\/p>\n<pre><code class=\"python\">self.weapon_attack_sound.play() <\/code><\/pre>\n<p>\u041f\u043e\u0432\u0442\u043e\u0440\u0438\u043c \u0443\u0441\u043f\u0435\u0445 \u0441 \u0443\u0434\u0430\u0440\u043e\u043c \u043e\u0442 \u043c\u043e\u043d\u0441\u0442\u0440\u0430:<\/p>\n<pre><code class=\"python\">self.hit_sound = pygame.mixer.Sound('..\/audio\/attack\/claw.wav') self.hit_sound.set_volume(0.4) <\/code><\/pre>\n<pre><code class=\"python\">self.hit_sound.play() <\/code><\/pre>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u044f \u0432\u044b\u0437\u0432\u0430\u043b \u0432 get_damage \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u044f. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0441\u043b\u044b\u0448\u0438\u043c \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0438 \u0443\u0434\u0430\u0440\u0435. \u0410 \u0432\u0440\u0430\u0433? \u0421\u0435\u0439\u0447\u0430\u0441 \u0441\u0434\u0435\u043b\u0430\u0435\u043c. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0449\u0451 \u043f\u0430\u0440\u0443 \u0434\u0435\u043c\u043e\u043d\u043e\u0432 \u0438 \u0432\u044b\u0437\u043e\u0432:<\/p>\n<pre><code class=\"python\">self.attack_sound = pygame.mixer.Sound(monster_info['attack_sound']) self.attack_sound.set_volume(0.3) <\/code><\/pre>\n<pre><code class=\"python\">self.attack_sound.play() <\/code><\/pre>\n<p>\u0412\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 actions-\u043c\u0435\u0442\u043e\u0434\u0435 \u0432 <code>enemy.py<\/code>. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u043c\u0443\u0437\u044b\u043a\u0430 \u0438\u0433\u0440\u044b. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 <code>main.py<\/code>:<\/p>\n<pre><code class=\"python\">main_sound = pygame.mixer.Sound('..\/audio\/main.wav') main_sound.play(loops = -1) <\/code><\/pre>\n<p>\u042d\u0442\u043e \u0434\u0432\u0430 \u043d\u043e\u0432\u044b\u0445 \u0434\u0435\u043c\u043e\u043d\u0430. \u041e\u0442\u043b\u0438\u0447\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u2014 \u043c\u0435\u0442\u043e\u0434 <code>play(loops = -1)<\/code>. \u0422\u0443\u0442 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043c\u0443\u0437\u044b\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0433\u0440\u0430\u0442\u044c \u0441\u043d\u043e\u0432\u0430 \u0438 \u0441\u043d\u043e\u0432\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0433\u0440\u044b \u0438 \u043d\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f \u0434\u043e \u0432\u044b\u0445\u043e\u0434\u0430.<\/p>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435, \u044f \u0437\u0430\u0431\u044b\u043b, \u0447\u0442\u043e \u0438\u0433\u0440\u0430 \u043d\u0435 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u042f \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043b \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>final<\/code> \u0432 <code>level.py<\/code>:<\/p>\n<pre><code class=\"python\">def final(self): if self.player.health &lt;= 0: print('\\n', '\\n', '\u041b\u0438\u043d\u043a \u0443\u043c\u0435\u0440. \u0425\u0430\u043d\u0430 \u0425\u0430\u0439\u0440\u0443\u043b\u0443') exit() if self.player.exp > 5000: print('\\n', '\\n', '\u041b\u0438\u043d\u043a \u043f\u043e\u0431\u0435\u0434\u0438\u043b') exit() <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e. \u041f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0431\u043e\u043b\u0435\u0435 5000 \u043e\u0447\u043a\u043e\u0432 \u2014 \u0432\u044b \u043f\u043e\u0431\u0435\u0434\u0438\u043b\u0438, \u043c\u0435\u043d\u0435\u0435 \u2014 \u043f\u0440\u043e\u0438\u0433\u0440\u0430\u043b\u0438. \u041d\u0443 \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u0435\u0440\u043d\u0443\u043b \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u0438 \u044d\u043d\u0435\u0440\u0433\u0438\u044e \u043d\u0430 100%, \u0430 \u044d\u043a\u0441\u043f\u0443 \u043d\u0430 0. <a href=\"https:\/\/disk.yandex.ru\/d\/iTkKdIS_vjVurA\" rel=\"noopener noreferrer nofollow\">\u0412\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0441 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u043c\u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u0442\u0443\u0442<\/a>. \u0412\u043e\u0442 \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c:<\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/658018c3ff7a7276961493bd\" data-style=\"\" id=\"658018c3ff7a7276961493bd\" width=\"\"><\/div>\n<h3>\u0418\u0442\u043e\u0433\u0438<\/h3>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0438\u0433\u0440\u0443 \u043d\u0430 \u0433\u043e\u043b\u043e\u043c Python \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 PyGame. \u0411\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e \u0435\u0449\u0451 \u043f\u0430\u0440\u043e\u0447\u043a\u0430 \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438 \u0431\u0435\u0437 \u043d\u0438\u0445. \u0412\u044b\u0432\u043e\u0434\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u0442\u044c \u043c\u044b\u0441\u043b\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e Python \u0441\u043a\u043e\u0440\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442 C# \u0441 Unity \u0438 Unreal. \u0426\u0435\u043b\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Python \u043a\u0430\u043a \u0441 \u0434\u0432\u0438\u0436\u043a\u043e\u043c \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0433\u0440. \u0412 \u0420\u043e\u0441\u0441\u0438\u0438, \u044f \u0434\u0443\u043c\u0430\u044e, \u044d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438\u0433\u0440 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u0435\u043d. \u041d\u0435 \u0438\u0437-\u0437\u0430 World Of Tanks, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Python, \u0430 \u0438\u0437-\u0437\u0430 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u044f \u043c\u043e\u0433\u0443 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0438\u0437 \u043b\u044e\u0431\u043e\u0439 Unix-\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u044d\u0442\u043e \u043a\u0440\u0443\u0442\u043e. \u041d\u043e \u0432\u0441\u0442\u0430\u0451\u0442 \u043f\u0430\u0440\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432:<\/p>\n<ol>\n<li>\n<p><strong>\u041d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0433\u0440\u0443 \u0441\u0430\u043c\u043e\u043c\u0443 \u0441 \u043d\u0443\u043b\u044f?<\/strong> \u0415\u0441\u043b\u0438 \u0432\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0445\u043e\u0434\u0438\u0442\u0435 \u0432 \u0433\u0435\u0439\u043c\u0434\u0435\u0432 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435 \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u0438\u0433\u0440\u0430\u043c\u0438 \u2014 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043f\u0438\u0442\u043e\u043d. \u0414\u0430\u043d\u043d\u044b\u0439 \u0441\u0435\u043a\u0442\u043e\u0440 \u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u0447\u0435\u043d\u044c \u0443\u0437\u043e\u043a \u0438 \u0432\u0440\u044f\u0434 \u043b\u0438 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u0439\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u0443 (\u043a\u0430\u043a \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0432 \u0433\u0435\u0439\u043c\u0434\u0435\u0432\u0435). \u0412\u044b\u0431\u0438\u0440\u0430\u0439\u0442\u0435 Unity. \u041e\u043d \u043f\u0440\u043e\u0449\u0435 Unreal Engine, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0435\u0441\u044c\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0432\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Python \u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0433\u0440\u0443 \u2014 \u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u0435\u0451 \u043d\u0430 Python. \u041d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u0432\u044b\u0443\u0447\u0438\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u044f\u0437\u044b\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u0433\u0440\u044b. Python \u0432\u0435\u0441\u044c\u043c\u0430 \u043d\u0430 \u043c\u043d\u043e\u0433\u043e\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432 \u043c\u043e\u0438\u0445 \u0441\u043b\u043e\u0432, \u043c\u043e\u0433\u0443 \u0441\u043e\u0441\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0438\u0433\u0440\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 Python, \u0430 \u043c\u043e\u0433\u0443 \u0438 \u043d\u0430 3D-\u0434\u0432\u0438\u0436\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u043e\u0431\u043e\u0440\u043e\u0442\u044b \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 <a href=\"https:\/\/www.harfang3d.com\/en_US\/\" rel=\"noopener noreferrer nofollow\">HARFANG<\/a>. \u041e\u043d \u043d\u0438\u0447\u0435\u043c \u043d\u0435 \u0445\u0443\u0436\u0435 Unity.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0443 \u0430 \u043a\u0430\u043a \u0431\u044b\u0442\u044c \u0441 \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432?<\/strong> \u041d\u0430 Unity \u0438 Unreal \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0441\u0435\u0442\u043e\u0432. \u042d\u0442\u043e \u043f\u0440\u0430\u0432\u0434\u0430. \u041d\u043e \u0438 \u043d\u0430 Python \u043d\u0435 \u043c\u0435\u043d\u044c\u0448\u0435. \u042f \u043d\u0435 \u0433\u0435\u0439\u043c\u0434\u0435\u0432\u0435\u0440, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0438\u0437 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0430\u0442\u044c\u044e. \u042f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0441\u043e \u0437\u043d\u0430\u043d\u0438\u0435\u043c Python \u043d\u0430 +\/- Middle-\u0443\u0440\u043e\u0432\u043d\u0435 (\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u044f\u0442 \u043c\u0435\u043d\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u044b). \u042f \u043f\u0438\u0441\u0430\u043b \u043a\u043e\u0434 \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0441\u0435\u0442\u044f\u0445, \u0430 \u0432\u043e\u0442 \u0441 \u0438\u0433\u0440\u0430\u043c\u0438 \u0437\u043d\u0430\u043a\u043e\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u043a \u0438\u0433\u0440\u043e\u043a \u0441\u043e \u0441\u0442\u0430\u0436\u0435\u043c \u0438\u043b\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u043a\u0440\u0435\u0441\u0442\u0438\u043a\u043e\u0432-\u043d\u043e\u043b\u0438\u043a\u043e\u0432. \u0412\u0441\u0451 \u0447\u0442\u043e \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u2014 \u044f \u043d\u0430\u0447\u0430\u043b \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441. \u0418 \u043a\u0430\u043a\u043e\u0432\u043e \u0431\u044b\u043b\u043e \u043c\u043e\u0451 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043a\u0443\u0447\u0430 \u043b\u044e\u0434\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0433\u0440\u0443 \u043d\u0430 Python. \u041b\u0438\u0447\u043d\u043e \u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0433\u0430\u0439\u0434\u0430\u043c\u0438 \u043e\u0442 <a href=\"https:\/\/www.youtube.com\/@ClearCode\" rel=\"noopener noreferrer nofollow\">Clear Code<\/a> (\u0447\u0443\u0432\u0430\u043a \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043a\u0430\u043a\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 PyGame \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f), \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, <a href=\"https:\/\/www.pygame.org\" rel=\"noopener noreferrer nofollow\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u043c\u0430\u043d\u0443\u0430\u043b\u043e\u043c \u043f\u043e PyGame<\/a> \u0438 \u043a\u043d\u0438\u0433\u043e\u0439 Making Games with Python &amp; Pygame (\u0432\u043d\u0443\u0442\u0440\u0438 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u0438\u0433\u0440). \u042d\u0442\u0438 \u0442\u0440\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u0438 \u043c\u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0433\u0440\u0443 \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0435\u043c \u0437\u0430 \u043c\u0435\u0441\u044f\u0446.<\/p>\n<\/li>\n<\/ol>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e \u041f\u0443\u0417\u0435\u043b\u044c\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u043b\u0433\u043e \u0434\u043e\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c. \u041c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0444\u043e\u043d \u0438\u0437 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432, \u0447\u0442\u043e\u0431\u044b \u044d\u043a\u0440\u0430\u043d \u043d\u0435 \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0441\u044f \u0447\u0451\u0440\u043d\u044b\u043c, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u044f, \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0435\u043c\u044b\u0445 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432. \u041c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0431\u043e\u0441\u0441\u043e\u0432. \u041c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0435\u043d\u044e\u0448\u043a\u0443 \u0441 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u0438 \u0432\u044b\u0445\u043e\u0434\u043e\u043c \u0438\u0437 \u0438\u0433\u0440\u044b. \u0412 \u043e\u0431\u0449\u0435\u043c, \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0442\u043e\u0447\u0435\u043a \u0440\u043e\u0441\u0442\u0430. \u0412\u0435\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u044f <a href=\"https:\/\/disk.yandex.ru\/d\/6FQ_XjY2nwg5LQ\" rel=\"noopener noreferrer nofollow\">\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e<\/a> \u0432\u0430\u043c \u043d\u0430 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041d\u0430\u0434\u0435\u044e\u0441\u044c \u0431\u044b\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e! \u0417\u0430\u043a\u043e\u043d\u0447\u0443 \u043a\u0430\u043a \u043e\u0434\u0438\u043d \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0432\u044b\u043f\u0443\u0441\u043a\u043d\u0438\u043a 13 \u0448\u043a\u043e\u043b\u044b.<\/p>\n<p>\u0418\u0438\u0438\u0438\u0438\u0438\u0438\u0438\u0438\u0438\u0438\u0438\u0438\u0438\u0438\u0438\u0438\u0438\u0438\u0438\u0438\u0438\u0438\u0438\u0438\u0438 \u043f\u043e\u043c\u043d\u0438\u0442\u0435! \u041f\u0438\u0442\u043e\u043d \u2014 \u0438\u0433\u0440\u0438\u0432\u0430\u044f \u0437\u043c\u0435\u044f!<\/p>\n<\/div>\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\/781130\/\"> https:\/\/habr.com\/ru\/articles\/781130\/<\/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<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"\"><\/figure>\n<h3>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0425\u0430\u0431\u0440\u044b \u0438 \u0425\u0430\u0431\u0440\u043e\u0447\u043a\u0438, \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u0435\u0440\u0435\u0434 \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0451\u0439 \u043e\u0431\u0441\u0443\u0434\u0438\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441 \u0446\u0435\u043b\u0435\u0441\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e\u0441\u0442\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0434\u0432\u0438\u0436\u043e\u043a, \u0432\u043c\u0435\u0441\u0442\u043e \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439. \u0415\u0441\u0442\u044c \u043a\u0443\u0447\u0430 \u0441\u0442\u0430\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0438\u0448\u0443\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0434\u0432\u0438\u0436\u043a\u0438 \u043e\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0434\u043e \u043c\u0435\u043d\u0435\u0435. \u042f \u0431\u044b \u0445\u043e\u0442\u0435\u043b \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0432\u043e\u043f\u0440\u043e\u0441: &#171;\u041a\u0430\u043a \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0437\u0443\u0447\u0430\u043b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043d\u043e\u0433\u043e \u043b\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0433\u0435\u0439\u043c\u0434\u0435\u0432\u043e\u043c?&#187;. \u041e\u0431\u044b\u0447\u043d\u043e, \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043f\u0443\u0442\u0438 \u0432 \u0433\u0435\u0439\u043c\u0434\u0435\u0432:<\/p>\n<ol>\n<li>\n<p>\u0423\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u0443\u0442\u044c. \u042d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0433\u0440\u0430\u0435\u0442 \u0432 \u0438\u0433\u0440\u044b \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u0440\u0435\u0448\u0438\u0442 \u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u0442\u044c. \u0422\u043e\u0433\u0434\u0430, \u043e\u043d \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0433\u0434\u0435 \u0435\u043c\u0443 \u0443\u0447\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u043e\u043c\u0443 \u0438 \u0432\u044b\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0438\u0433\u0440\u043e\u0432\u044b\u0435 \u0434\u0432\u0438\u0436\u043a\u0438 \u0438 C-\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u043a \u043d\u0438\u043c (\u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e, C#).<\/p>\n<\/li>\n<li>\n<p>\u041f\u0443\u0442\u044c \u043f\u0440\u043e\u0433\u0435\u0440\u043e\u0432. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0443\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u043e\u0439 \u0438 \u043f\u0438\u0448\u0435\u0442 \u043a\u043e\u0434. \u0422\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435, \u0432\u0435\u0437\u0434\u0435 \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u043a\u043e\u0434 \u2014 \u0435\u0441\u0442\u044c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440. \u0426\u0438\u0444\u0440\u043e\u0432\u044b\u0435 \u0440\u0430\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0438\u0433\u0440\u044b) \u043d\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u043c\u0438\u043c\u043e \u0442\u0435\u0445 \u043b\u044e\u0434\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043f\u0438\u0448\u0443\u0442 \u043a\u043e\u0434. \u0422\u0430\u043a, <a href=\"https:\/\/www.stxnext.com\/blog\/python-for-game-development\/\" rel=\"noopener noreferrer nofollow\">\u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u0435\u0440\u043e\u0432 \u0440\u0435\u0448\u0430\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0438\u0433\u0440\u0443<\/a> \u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043f\u0443\u0442\u044c \u0432 \u0433\u0435\u0439\u043c\u0434\u0435\u0432. \u041e\u0431 \u044d\u0442\u043e\u043c \u043f\u0443\u0442\u0438 \u043c\u044b \u0438 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c.<\/p>\n<\/li>\n<\/ol>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0442\u044b \u0445\u043e\u0447\u0435\u0448\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u2014 \u0438\u0434\u0438 \u0443\u0447\u0438\u0441\u044c \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0439 \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u0432\u044b\u043a\u0438. \u041e\u0441\u0432\u0430\u0438\u0432\u0430\u0439 Unity \u0438\u043b\u0438 Unreal \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0439 \u0432 \u043a\u0440\u0443\u0442\u043e\u0439 <a href=\"https:\/\/dtf.ru\/gameindustry\/1033019-igrovye-studii-i-mesta-ih-obitaniya-v-rossii\" rel=\"noopener noreferrer nofollow\">\u0433\u0435\u0439\u043c\u0434\u0435\u0432-\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438<\/a>. \u0412 \u044d\u0442\u043e\u043c \u0435\u0441\u0442\u044c \u0434\u043e\u043b\u044f \u043f\u0440\u0430\u0432\u0434\u044b. \u041e\u0434\u043d\u0430\u043a\u043e, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u0441\u0432\u043e\u0451 \u0445\u043e\u0431\u0431\u0438 \u0432 \u0440\u0430\u0431\u043e\u0442\u0443 \u2014 \u0434\u0435\u043b\u043e \u043d\u0435 \u0431\u043b\u0430\u0433\u043e\u0440\u0430\u0437\u0443\u043c\u043d\u043e\u0435. \u0412\u044b\u0433\u043e\u0440\u0430\u043d\u0438\u0435 \u0441\u043a\u0430\u0436\u0435\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u0422\u043e\u0433\u0434\u0430 \u0432\u0430\u043c \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043b\u0438\u0431\u043e \u043c\u043e\u0434 \u043d\u0430 \u0438\u0433\u0440\u0443 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/skillbox.ru\/media\/gamedev\/7-igr-na-source-sozdannykh-za-predelami-valve\/\" rel=\"noopener noreferrer nofollow\">\u043d\u0430 \u0434\u0432\u0438\u0436\u043a\u0435 Source<\/a>) \u0438\u043b\u0438 \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c \u0432 <a href=\"https:\/\/dtf.ru\/games\/51311-interaktivnye-grezy-kak-ustroen-redaktor-dreams-i-chto-tam-mozhno-sozdat\" rel=\"noopener noreferrer nofollow\">\u0413\u0440\u0451\u0437\u044b<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u043e\u0436\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430. \u0422\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442, \u043d\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: &#171;\u0412\u044b\u0431\u043e\u0440 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u044b&#187;.<\/p>\n<h3>\u0412\u044b\u0431\u043e\u0440 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u044b<\/h3>\n<p>\u0412\u0441\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0434 \u0438\u0433\u0440\u043e\u0439:<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u0433\u0440\u0443 \u043d\u0430 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u043c \u0434\u0432\u0438\u0436\u043a\u0435-\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435<\/p>\n<\/li>\n<li>\n<p>\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u043e\u0434 \u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0434\u0432\u0438\u0436\u043e\u043a<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0433\u0440\u0443<\/p>\n<\/li>\n<\/ol>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0445\u043e\u0440\u043e\u0448 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443, \u043d\u043e \u0438 \u0438\u043c\u0435\u0435\u0442 \u0440\u044f\u0434 \u043d\u0435\u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043e\u043a. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b\u0431\u0440\u0430\u0432 \u043f\u0443\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u0433\u0440\u044b \u043d\u0430 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u043c \u0434\u0432\u0438\u0436\u043a\u0435 \u0432\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0451\u0442\u0435\u0441\u044c \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430, \u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438 \u043c\u043e\u043d\u0435\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0415\u0441\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u043e\u0434\u043e\u043f\u0443\u0442\u044c \u2014 \u0432\u044b \u0441\u0440\u0430\u0437\u0443 \u0441\u0442\u043e\u043b\u043a\u043d\u0451\u0442\u0435\u0441\u044c \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u043e\u0442\u043a\u0440\u044b\u0442 \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438\u0433\u0440, \u0430 \u0442\u0430\u043a\u0436\u0435, \u043d\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u043e\u0434 \u0445\u043e\u0442\u044c \u0437\u0430 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0446\u0435\u043d\u0443. \u041f\u0443\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0432 \u0433\u0435\u0439\u043c\u0434\u0435\u0432\u0435 \u0434\u0438\u043a\u0438\u0439 \u043f\u0440\u0438\u043f\u0430\u0434\u043e\u043a, \u043c\u043e\u043b &#171;\u0414\u0430 \u0437\u0430\u0447\u0435\u043c \u043e\u043f\u044f\u0442\u044c \u0438\u0434\u0442\u0438 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0441\u0440\u043e\u043a\u0438 \u0433\u043e\u0440\u044f\u0442, \u0430 \u0441\u0430\u043c \u0442\u044b \u0435\u0449\u0451 \u043d\u0435 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e?&#187;. \u0414\u0430\u043d\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u0432\u0435\u0441\u044c\u043c\u0430 \u043d\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u0435\u043d \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 \u0438\u0437-\u0437\u0430 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0445\u043e\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0432\u0435\u0434\u044c \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 \u0434\u0432\u0438\u0436\u043e\u043a, \u043a\u043e\u043c\u0443-\u0442\u043e \u0441 \u043d\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p>\u0422\u0430\u043a \u0437\u0430\u0447\u0435\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c &#171;\u0441\u043b\u043e\u0436\u043d\u044b\u0439&#187; \u043f\u0443\u0442\u044c? \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043d\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u043d \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u041b\u0438\u0447\u043d\u043e \u043c\u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 C# \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Unity, \u0447\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 Python. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043b\u044e\u0434\u0438 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442 \u0441\u0430\u043c \u0434\u0432\u0438\u0436\u043e\u043a. \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u043f\u0440\u0435\u043f\u043e\u0434\u0430\u044e \u0432 <a href=\"https:\/\/obe.ru\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0441\u0442\u0438\u0442\u0443\u0442\u0435 &#171;\u0411\u0438\u0437\u043d\u0435\u0441\u0430 \u0438 \u0414\u0438\u0437\u0430\u0439\u043d\u0430&#187;<\/a>. \u042d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u043f\u0440\u043e\u0444\u0438\u043b\u044c\u043d\u044b\u0445 \u0443\u0447\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0439, \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0433\u0435\u0439\u043c\u0434\u0435\u0432\u043e\u043c. \u0418 \u0432\u043e\u0442 \u0443 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u044f \u0441\u043f\u0440\u043e\u0441\u0438\u043b \u0437\u0430\u0447\u0435\u043c \u0438\u043c \u0434\u0432\u0438\u0436\u043e\u043a. \u041a\u0430\u043a\u043e\u0432\u043e \u0431\u044b\u043b\u043e \u043c\u043e\u0451 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u0432\u043e\u043e\u0431\u0449\u0435 \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u043d\u0443\u0436\u0435\u043d. \u0421\u043f\u043e\u0439\u043b\u0435\u0440, \u043d\u0435 \u0438\u0437-\u0437\u0430 \u043f\u0440\u0435\u0441\u0435\u0442\u043e\u0432.<\/p>\n<h3>\u0417\u0430\u0447\u0435\u043c \u0432\u0430\u043c \u0434\u0432\u0438\u0436\u043e\u043a?!<\/h3>\n<p>\u041f\u043e \u0441\u0443\u0442\u0438, \u0434\u0432\u0438\u0436\u043e\u043a \u0440\u0435\u0448\u0430\u0435\u0442 \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0442\u0440\u0438, \u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u0430:<\/p>\n<ol>\n<li>\n<p><strong>\u0424\u0438\u0437\u0438\u043a\u0430<\/strong>. \u0415\u0441\u043b\u0438 \u0432\u044b \u043e\u043a\u043e\u043d\u0447\u0438\u043b\u0438 \u0444\u0438\u0437\u043c\u0430\u0442, \u0432\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435 \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043a\u043b\u044f\u043d\u043d\u043e\u0433\u043e \u0448\u0430\u0440\u0430 \u0432\u0435\u0441\u043e\u043c \u0432 2 \u043a\u0438\u043b\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430 \u0434\u043e\u0441\u043a\u0443 \u0438\u0437 \u0434\u0443\u0431\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043b\u0435\u0436\u0438\u0442 \u043f\u043e\u0434 \u0443\u0433\u043b\u043e\u043c 32 \u0433\u0440\u0430\u0434\u0443\u0441\u0430. \u0422\u0430\u043a\u0436\u0435, \u043d\u0443\u0436\u043d\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441 \u043a\u0430\u043a\u043e\u0439 \u0432\u044b\u0441\u043e\u0442\u044b \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043f\u0430\u0441\u0442\u044c \u0448\u0430\u0440, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0431\u0438\u0442\u044c\u0441\u044f. \u0414\u0432\u0438\u0436\u043e\u043a \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u044d\u0442\u0443 \u0444\u0438\u0437\u0438\u043a\u0443 \u0437\u0430 \u0432\u0430\u0441, \u0430 \u0432\u044b \u043b\u0438\u0448\u044c \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0435\u0441\u044c \u043a \u0442\u0435\u043c \u0438\u043b\u0438 \u0438\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c.<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u0430\u0439\u043b\u0441\u0435\u0442\u044b<\/strong>. \u0422\u0430\u0439\u043b \u2014 \u044d\u0442\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 (\u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e, \u043a\u0430\u0440\u0442). \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u0439\u043b\u043e\u0432 <a href=\"https:\/\/habr.com\/ru\/articles\/470099\/\" rel=\"noopener noreferrer nofollow\">\u0432\u0435\u0441\u044c\u043c\u0430 \u044d\u043d\u0435\u0440\u0433\u043e\u0437\u0430\u0442\u0440\u0430\u0442\u043d\u044b\u0439<\/a>, \u0430 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u0442\u0430\u0439\u043b\u043e\u0432 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0434\u0435\u043b\u043e. \u041f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0433\u0434\u0435 \u043b\u0435\u0436\u0438\u0442 \u043a\u0430\u043c\u0435\u043d\u044c, \u0430 \u0433\u0434\u0435 \u0437\u0435\u043c\u043b\u044f \u0438\u043b\u0438 \u0432\u043e\u0434\u0430. \u0412 \u0434\u0432\u0438\u0436\u043a\u0430\u0445 \u0442\u0438\u043f\u0430 Unreal \u0438\u043b\u0438 Unity \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0441\u043b\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u0438 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0435\u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u0438\u0437 \u0442\u0430\u0439\u0442\u043b\u043e\u0432 \u043a\u0430\u0440\u0442\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>\u0410\u043d\u0438\u043c\u0430\u0446\u0438\u044f<\/strong>. \u0421\u0430\u043c\u044b\u0439 \u0441\u043f\u043e\u0440\u043d\u044b\u0439 \u043f\u0443\u043d\u043a\u0442. \u0412 \u0434\u0432\u0438\u0436\u043a\u0430\u0445 \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u2014 \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u041a\u0430\u0436\u0434\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u043c\u0435\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u043f\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c x, y, z \u0438 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0432 \u0441\u0430\u043c\u043e\u043c \u0434\u0432\u0438\u0436\u043a\u0435 \u043f\u0443\u0442\u0451\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f, \u0441\u0436\u0430\u0442\u0438\u044f \u0438\u043b\u0438 \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u041d\u043e \u0432\u0430\u0436\u043d\u043e\u0435 \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435, \u043f\u0440\u043e\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u043f\u043e x, y, z \u2014 \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u0438\u0434\u0435\u044f. \u041a\u0443\u0434\u0430 \u043d\u0430\u0434\u0451\u0436\u043d\u0435\u0435, \u043a\u0440\u0430\u0441\u0438\u0432\u0435\u0435 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0448\u0430\u0433 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u0443\u0442\u0451\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e \u043f\u0440\u0435\u0441\u0435\u0442\u0443 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u043f\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0435.<\/p>\n<\/li>\n<\/ol>\n<p>\u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0441\u0430\u043c \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u2014 \u044d\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443. \u041e\u0434\u043d\u0430\u043a\u043e, \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u0432\u0438\u0436\u043a\u0430 \u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445. \u041c\u043e\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438\u0433\u0440\u044b \u043f\u043e \u0441\u0430\u043c\u043e\u043c\u0443 \u0441\u043b\u043e\u0436\u043d\u043e\u043c\u0443 \u043f\u0443\u0442\u0438, \u0445\u043e\u0442\u044f Python \u0438 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0447\u0430\u0441\u0442\u044c \u0432\u0435\u0449\u0435\u0439. \u0427\u0442\u043e \u0436, \u0445\u0432\u0430\u0442\u0438\u0442 \u0441\u043b\u043e\u0432 \u0438 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043a \u0434\u0435\u043b\u0443!<\/p>\n<h3>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/h3>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0430\u043f\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u042f \u043d\u0430\u0437\u0432\u0430\u043b \u043f\u0440\u043e\u0435\u043a\u0442 PyZelda \u0438 \u0432 \u043f\u0430\u043f\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0435\u0441\u0442\u044c \u0435\u0449\u0451 4 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438: audio, code, graphic \u0438 map.<\/p>\n<figure class=\"\"><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435, \u0432 \u043f\u0430\u043f\u043a\u0435 code \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u0430:<\/p>\n<ul>\n<li>\n<p><a href=\"http:\/\/main.py\" rel=\"noopener noreferrer nofollow\">main.py<\/a> \u2014 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0430\u0439\u043b \u0438\u0433\u0440\u044b<\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/settings.py\" rel=\"noopener noreferrer nofollow\">settings.py<\/a> \u2014 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u0433\u0440\u044b (\u0442\u0443\u0442 \u043c\u044b \u0443\u043a\u0430\u0436\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043e\u043b\u0435\u0439 \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u043e\u043a\u043d\u0443 \u0438 \u043f\u0440\u043e\u0440\u0438\u0441\u043e\u0432\u043a\u0435)<\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/debug.py\" rel=\"noopener noreferrer nofollow\">debug.py<\/a> \u2014 \u0444\u0430\u0439\u043b \u0434\u0435\u0431\u0430\u0433\u0438\u043d\u0433\u0430<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0440\u0430\u0431\u043e\u0442\u043e\u0439, \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 PyGame (<code>pip install pygame<\/code>)<\/p>\n<figure class=\"\"><\/figure>\n<p>\u0424\u0430\u0439\u043b main:<\/p>\n<pre><code class=\"python\">import pygame, sys #\u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 PyGame \u0438 Sys from settings import * #\u0438\u043c\u043f\u043e\u0440\u0442 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 settings  class Game: #\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0438\u0433\u0440\u044b def __init__(self): #\u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 pygame.init() #\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 PyGame self.screen = pygame.display.set_mode((WIDTH,HEIGTH)) #\u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044d\u043a\u0440\u0430\u043d \u0432 \u0432\u0438\u0434\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 \u0438 \u0432\u044b\u0441\u043e\u0442\u0443 pygame.display.set_caption(\"PyZelda\") #\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u043a\u043d\u0430 self.clock = pygame.time.Clock() #\u0430 \u0442\u0430\u043a\u0436\u0435, \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432\u0440\u0435\u043c\u044f  def run(self): #\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438\u0433\u0440\u044b while True: #\u0434\u043e \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0438\u0433\u0440\u044b \u043e\u043d\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u0430 for event in pygame.event.get(): #\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u0438\u0433\u0440\u0435 if event.type == pygame.QUIT: #\u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0439\u0442\u0438 \u0438 \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435: pygame.quit() #\u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0438\u0433\u0440\u044b sys.exit() #\u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043e\u043a\u043d\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u044b self.screen.fill('green') #\u043f\u043e\u043c\u0438\u043c\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0446\u0432\u0435\u0442 \u044d\u043a\u0440\u0430\u043d\u0430 pygame.display.update() #\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u044d\u043a\u0440\u0430\u043d self.clock.tick(FPS) #\u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c FPS  if __name__ == '__main__': #\u0437\u0430\u043f\u0443\u0441\u043a \u0438\u0433\u0440\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 main-\u0444\u0430\u0439\u043b\u0430 game = Game() #\u0415\u0441\u043b\u0438 \u0444\u0430\u0439\u043b main, \u0442\u043e \u0441\u0430\u043c\u0430 \u0438\u0433\u0440\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441... game.run() #...\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e run \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 <\/code><\/pre>\n<p>\u0412 \u0444\u0430\u0439\u043b\u0435 main \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0430\u043c\u0443 \u0438\u0433\u0440\u0443. \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043d\u0430 \u0431\u0430\u0437\u0435 PyGame \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u0432\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<p>\u0424\u0430\u0439\u043b <a href=\"http:\/\/setting.py\" rel=\"noopener noreferrer nofollow\">setting.py<\/a>:<\/p>\n<pre><code class=\"python\">WIDTH = 1280 #\u0428\u0438\u0440\u0438\u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0430 HEIGTH = 720 #\u0412\u044b\u0441\u043e\u0442\u0430 \u044d\u043a\u0440\u0430\u043d\u0430 FPS = 60 #\u0427\u0438\u0441\u043b\u043e FPS TILESIZE = 64 #\u0420\u0430\u0437\u043c\u0435\u0440 \u0442\u0430\u0439\u043b\u0430 (\u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b)  WORLD_MAP = [ #\u041a\u0430\u0440\u0442\u0430 \u043c\u0438\u0440\u0430 \u0438\u0433\u0440\u044b. \u041e\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 20\u044520 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043e\u0432 ['x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', 'x'], ['x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'], ] <\/code><\/pre>\n<p>\u0412 <a href=\"http:\/\/settings.py\" rel=\"noopener noreferrer nofollow\">settings.py<\/a> \u0431\u0443\u0434\u0443\u0442 \u0432\u0441\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u0433\u0440\u044b. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0448\u0438\u0440\u0438\u043d\u0430 \u0438 \u0432\u044b\u0441\u043e\u0442\u0430 \u043e\u043a\u043d\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0447\u0438\u0441\u043b\u043e FPS (\u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u043a\u043d\u0430) \u0438 \u0441\u0430\u043c\u0430\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u2014 \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0430\u0439\u043b\u0430. \u041a\u0430\u043a \u044f \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u0440\u0430\u043d\u0435\u0435, \u0442\u0430\u0439\u043b \u2014 \u044d\u0442\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u043c\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c\u0438. \u0412\u044b\u0441\u043e\u0442\u0430 \u0438 \u0448\u0438\u0440\u0438\u043d\u0430 \u043a\u0430\u0434\u0440\u0430 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445 (\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b 1280 \u043d\u0430 720), \u043a\u0430\u043a \u0438 \u0441\u0430\u043c \u0442\u0430\u0439\u043b, \u043d\u043e \u0435\u0441\u0442\u044c \u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u2014 \u0442\u0430\u0439\u043b \u0432\u0441\u0435\u0433\u0434\u0430 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u043c\u044b \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 \u0442\u0430\u0439\u043b\u0430 (\u043e\u043d \u0443 \u043d\u0430\u0441 64 \u043d\u0430 64 \u043f\u0438\u043a\u0441\u0435\u043b\u044f). \u0414\u0430\u043b\u0435\u0435, \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u0430\u0440\u0442\u0443 \u043c\u0438\u0440\u0430. \u0421\u0435\u0439\u0447\u0430\u0441 \u043e\u043d\u0430 20 \u043d\u0430 20 \u0442\u0430\u0439\u043b\u043e\u0432 (\u0434\u0430\u043b\u0435\u0435, \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0451 \u0442\u0430\u0439\u043b\u0430\u043c\u0438). \u042f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043b, \u0447\u0442\u043e <code>'x'<\/code> \u2014 \u044d\u0442\u043e \u043a\u043e\u043d\u0435\u0446 \u043a\u0430\u0440\u0442\u044b, \u0430 <code>','<\/code> \u2014 \u043f\u0443\u0441\u0442\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u0438\u0433\u0440\u044b.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435, \u0444\u0430\u0439\u043b <a href=\"http:\/\/debug.py\" rel=\"noopener noreferrer nofollow\">debug.py<\/a>:<\/p>\n<pre><code class=\"python\">import pygame #\u0421\u043d\u043e\u0432\u0430 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a PyGame pygame.init() #\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 font = pygame.font.Font(None, 30) #\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0448\u0440\u0438\u0444\u0442  def debug(info, y = 10, x = 10):  #\u0421\u0430\u043c\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u0435\u0431\u0430\u0433\u0430 display_surface = pygame.display.get_surface() #\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u0443\u044e \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0438\u0433\u0440\u0435 debug_surf = font.render(str(info), True, \"Red\") #\u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043c \u0442\u0435\u043a\u0441\u0442 (\u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0435\u0433\u043e \u043a\u0440\u0430\u0441\u043d\u044b\u043c) debug_rect = debug_surf.get_rect(topleft = (x, y)) #\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u043c\u0435\u043c \u043c\u0435\u0441\u0442\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u044b \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 (\u043b\u0435\u0432\u044b\u0439 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0443\u0433\u043e\u043b) pygame.draw.rect(display_surface, \"White\", debug_rect) #\u0414\u0435\u043b\u0430\u0435\u043c \u043c\u0438\u043a\u0440\u043e-\u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0432 \u0432\u0438\u0434\u0435 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 (\u0438 \u0434\u0430 \u043e\u043d \u0431\u0435\u043b\u044b\u0439, \u0431\u0443\u0434\u0435\u0442 \u0431\u0435\u043b\u0430\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0441 \u043a\u0440\u0430\u0441\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c) display_surface.blit(debug_surf, debug_rect) #\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0430\u0448\u0443 \u043c\u0438\u043a\u0440\u043e-\u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 <\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0435\u0431\u0430\u0433 \u0438\u0433\u0440\u044b. \u042d\u0442\u043e \u043f\u043e\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0432\u0432\u0435\u0440\u0445\u0443 \u0441\u043b\u0435\u0432\u0430 \u044d\u043a\u0440\u0430\u043d\u0430 \u0438 \u0432 \u043d\u0451\u043c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c \u0442\u0435\u043a\u0441\u0442. \u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0434\u0435\u0431\u0430\u0433\u0430, \u043d\u0443\u0436\u043d\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c debug \u0432 main-\u0444\u0430\u0439\u043b \u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043e\u043a\u043d\u0430. \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a (\u0444\u0430\u0439\u043b <a href=\"http:\/\/main.py\" rel=\"noopener noreferrer nofollow\">main.py<\/a>):<\/p>\n<pre><code class=\"python\">import pygame, sys #\u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 PyGame \u0438 <\/code><\/pre>\n<\/div>\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-363152","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/363152","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=363152"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/363152\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=363152"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=363152"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=363152"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}