{"id":363114,"date":"2024-05-21T01:49:09","date_gmt":"2024-05-21T01:49:09","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=363114"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=363114","title":{"rendered":"<span>\u0423\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e 2D \u0434\u0432\u0438\u0436\u043a\u0430 Flame \u0434\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 FPS \u043d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430\u0445 \u0438 \u041f\u041a<\/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<h4>\u0425\u043e\u0442\u044f \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u0441\u044f \u0438\u043c\u0435\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u0432 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u043a \u0436\u0435 \u043e\u0449\u0443\u0449\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u043d\u043e<\/h4>\n<p>\u0411\u043e\u043b\u044c\u0448\u0435 \u0433\u043e\u0434\u0430 \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e \u0441\u0432\u043e\u044e \u0438\u0433\u0440\u0443 \u043d\u0430 \u0434\u0432\u0438\u0436\u043a\u0435 Flame, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 dart \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0432\u043e Flutter. \u0425\u043e\u0447\u0443 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0430\u043c \u043f\u0430\u0440\u0443 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u043a\u0430\u043a \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0441\u0451 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e25\/24e\/ecd\/e2524eecd5dd36c61f60829344eeca9d.png\" width=\"1285\" height=\"812\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e25\/24e\/ecd\/e2524eecd5dd36c61f60829344eeca9d.png\"\/><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/10f\/996\/778\/10f9967789206e7725fc3ba9057ae5e3.png\" width=\"1285\" height=\"906\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/10f\/996\/778\/10f9967789206e7725fc3ba9057ae5e3.png\"\/><\/figure>\n<p>\u0412\u0441\u0451 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c: Tiled \u0438 \u0434\u0432\u0438\u0436\u043e\u043a Flame.<\/p>\n<p>\u0412\u043e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 gameDev\u2019\u0430, \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u2014 \u043f\u0443\u0442\u0438 \u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f. (\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043f\u043e\u043b\u043e\u0436\u0443 \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0438\u0437\u0443)<\/p>\n<h2>Tiled<\/h2>\n<p>\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u043a\u0430\u0440\u0442. \u0422\u0430\u043a\u0436\u0435 \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0438 \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0439 \u0441\u00a0\u043b\u044e\u0431\u044b\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438. \u042f \u0434\u0443\u043c\u0430\u044e, \u043e\u043d\u0430 \u0432\u0441\u0435\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u00a0\u2014 \u0441\u0443\u043f\u0435\u0440 \u0443\u0434\u043e\u0431\u043d\u0430\u044f, \u043f\u0440\u0435\u0442\u0435\u043d\u0437\u0438\u0439 \u043a\u00a0\u043d\u0435\u0439 \u043d\u0435\u0442.<\/p>\n<p>\u041a\u0430\u0440\u0442\u0430 \u043d\u0430\u00a0\u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0443\u00a0\u043c\u0435\u043d\u044f \u0442\u0430\u043a\u0430\u044f: 297*297\u00a0\u0442\u0430\u0439\u043b\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u0439\u043b \u2014 \u044d\u0442\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442 32*32\u00a0\u043f\u0438\u043a\u0441\u0435\u043b\u044f, \u0442.\u00a0\u0435. \u043c\u043e\u044f \u043a\u0430\u0440\u0442\u0430 9504\u00a0\u043f\u0438\u043a\u0441\u0435\u043b\u044f \u043d\u0430 9504. \u041f\u043b\u044e\u0441 \u043a\u00a0\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 14\u00a0\u0441\u043b\u043e\u0451\u0432 \u0442\u0430\u0439\u043b\u043e\u0432 \u0438 4\u00a0\u0441\u043b\u043e\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0418 \u0432\u043e\u0442 \u0442\u0443\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u00a0\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e.<\/p>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a\u0443\u044e \u0440\u0435\u043c\u0430\u0440\u043a\u0443: \u0432\u043e\u00a0Flame \u0435\u0441\u0442\u044c \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 Tiled \u043f\u0440\u044f\u043c\u043e \u0438\u0437\u00a0\u043a\u043e\u0440\u043e\u0431\u043a\u0438. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u0441\u0430\u043c \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0442\u044f\u0436\u0451\u043b\u044b\u043c. \u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u0434\u0430\u0436\u0435 \u043f\u0440\u043e\u0435\u043a\u0442 30*30 \u0442\u0430\u0439\u043b\u043e\u0432 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u043a\u043e\u043b\u043e 300 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441\u00a0\u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438, \u043a\u0430\u043a\u00a0\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f \u0432\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043d\u0430\u00a0\u0441\u0430\u0439\u0442\u0435 Flame, \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u0432\u044b\u0433\u043e\u0434\u043d\u043e. \u0442.\u00a0\u0435. \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u00a0Tiled \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043d\u0443\u043c\u0435\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u0440\u0442 \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0438\u0445 \u043f\u0440\u044f\u043c\u043e \u0432\u043e\u00a0\u0432\u0440\u0435\u043c\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043f\u043e\u0434\u0431\u0435\u0433\u0430\u0435\u0442\u0435 \u0431\u043b\u0438\u0437\u043a\u043e \u043a\u00a0\u043a\u0440\u0430\u044e \u044d\u043a\u0440\u0430\u043d\u0430. \u0418\u0433\u0440\u0430 \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u0437\u0430\u0444\u0440\u0438\u0437\u0438\u0442\u0441\u044f \u043d\u0430\u00a0\u043f\u043e\u043b\u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0438 \u0432\u044b, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u044d\u0442\u043e \u0443\u0432\u0438\u0434\u0438\u0442\u0435. \u042f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b \u044d\u0442\u043e, \u0438 \u0434\u0430\u0436\u0435 \u043f\u0440\u0438\u00a0\u0434\u0432\u0443\u0445 \u0441\u043b\u043e\u044f\u0445 \u0442\u0430\u0439\u043b\u043e\u0432 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u0430. \u0418\u0433\u0440\u0430\u0442\u044c \u0442\u0430\u043a \u0434\u043e\u043b\u0433\u043e \u0442\u043e\u0447\u043d\u043e \u043d\u0438\u043a\u0442\u043e \u043d\u0435\u00a0\u0437\u0430\u0445\u043e\u0447\u0435\u0442 \u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u044f\u0442\u044c \u043c\u0438\u043d\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0444\u0440\u0438\u0437\u0438\u0449\u0443\u044e\u0441\u044f \u043f\u043e\u0434\u0435\u043b\u043a\u0443.<\/p>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u043e\u0441\u043b\u0435 \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u043b\u0433\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f *.tmx\u00a0\u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e\u00a0\u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043a\u0430\u0440\u0442\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430\u00a0\u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043f\u043e\u043b\u043e\u0442\u043d\u0435 \u0432\u00a0Tiled. \u0410\u00a0\u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u00a0\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 Tiled \u043e\u0433\u0440\u043e\u043c\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0443 \u043d\u0430\u00a0\u0447\u0430\u0441\u0442\u0438 \u043d\u0435\u043b\u044c\u0437\u044f. \u0418 \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043c\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043c\u00a0\u2014 \u043d\u0435\u00a0\u0440\u0435\u0448\u0438\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0434\u043e\u043b\u0433\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043e\u0442\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c \u0435\u0451 \u0432 PNG \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b Tiled \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u043c Flame.images.load(&#8216;name&#8217;), \u043d\u043e \u0442\u0443\u0442 \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043d\u044e\u0430\u043d\u0441: \u0442\u0430\u043a\u0430\u044f \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u0430\u0440\u0442\u0430, \u043a\u0430\u043a 9500\u00a0\u043d\u0430 9500,\u00a0\u0431\u0443\u0434\u0435\u0442 \u0436\u0440\u0430\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 FPS \u043d\u0430\u00a0\u0430\u043d\u0434\u0440\u043e\u0438\u0434\u0435 \u043f\u0440\u0438\u00a0\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438. Flame \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 PositionComponent.<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u043a\u0430\u0436\u0443, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u0445\u043e\u043b\u0441\u0442\u0435. \u042d\u0442\u043e \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u043d\u044b\u0439 \u043a\u0443\u0441\u043e\u043a:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/685\/16a\/8ee\/68516a8ee5a8434e521afad824b27203.png\" width=\"2560\" height=\"1392\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/685\/16a\/8ee\/68516a8ee5a8434e521afad824b27203.png\"\/><\/figure>\n<p>\u0410 \u0432\u043e\u0442 \u044d\u0442\u043e \u0432\u0441\u044f \u043a\u0430\u0440\u0442\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c (\u043f\u0435\u0440\u0432\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0432\u043e\u043d \u0442\u0430\u043c \u0441\u0432\u0435\u0440\u0445\u0443 \u0441\u043b\u0435\u0432\u0430):<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7c3\/654\/5ba\/7c36545ba592a07dd30e3548719e9203.png\" width=\"2560\" height=\"1392\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7c3\/654\/5ba\/7c36545ba592a07dd30e3548719e9203.png\"\/><\/figure>\n<p>\u0412\u043e\u0442 \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0435 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0438 \u0433\u0434\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u0432\u043e\u0435\u0439 \u0438\u0433\u0440\u0435 \u0438 \u043c\u043e\u0436\u0435\u0448\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043c\u0438\u0440.<\/p>\n<h2>\u0420\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 Tiled<\/h2>\n<p>\u041d\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u043f\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432\u0441\u0435\u0439 \u043a\u0430\u0440\u0442\u044b \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 *.tmx \u0432 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043c\u0435\u043b\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u0440\u0430\u0437\u0431\u0438\u0442\u044b\u0445 \u043f\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c \u0438 \u044f\u0447\u0435\u0439\u043a\u0430\u043c.<\/p>\n<p>\u042f \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u0437\u0434\u0435\u0441\u044c \u043d\u0430 <a href=\"https:\/\/habr.com\/ru\/articles\/682452\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u044e<\/a> \u043f\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0430\u0439\u043b\u043e\u0432 \u0432\u043e Flame. \u042d\u0442\u043e \u043d\u0435 \u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0434\u043e\u043b\u0433\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043a\u0430\u0440\u0442, \u043d\u043e \u0434\u0430\u0451\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u043a\u043b\u0430\u0441\u0441\u043e\u043c ImageBatchCompiler \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 flame_tiled_utils (<a href=\"https:\/\/pub.dev\/packages\/flame_tiled_utils\" rel=\"noopener noreferrer nofollow\">https:\/\/pub.dev\/packages\/flame_tiled_utils<\/a>).<\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043d\u0430 \u0445\u043e\u0434\u0443 \u0447\u0438\u0442\u0430\u0442\u044c *.tmx \u043e\u0447\u0435\u043d\u044c \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u043e, \u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0451 \u0432\u00a0\u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u00a0\u0445\u043e\u0434\u0443 \u0438\u0445 \u0447\u0438\u0442\u0430\u0442\u044c. \u0422\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0434\u0440\u043e\u0431\u0438\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443 \u043a\u0430\u0440\u0442\u044b \u043d\u0430\u00a0\u044f\u0447\u0435\u0439\u043a\u0438. \u0412\u00a0\u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043e\u043a ImageBatchCompiler \u043f\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u043a\u0430\u0440\u0442\u0443 \u0432\u00a0PNG \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432\u0430\u0448\u0438\u0445 \u044f\u0447\u0435\u0435\u043a \u0441\u00a0\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u0432\u0430\u0448\u0438\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0438 \u044f\u0447\u0435\u0435\u043a. \u042d\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433. \u041f\u043b\u044e\u0441 \u043a\u00a0\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043b \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u044b \u0442\u0430\u0439\u043b\u043e\u0432 \u043d\u0430\u00a0\u0442\u0435, \u0447\u0442\u043e\u00a0\u043d\u0430\u0434 \u0438\u0433\u0440\u043e\u043a\u043e\u043c \u0438 \u043d\u0430\u00a0\u0442\u0435 \u0447\u0442\u043e\u00a0\u043f\u043e\u0434\u00a0\u043d\u0438\u043c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c6d\/107\/a59\/c6d107a598fd932a5ba1aaf4ff804254.png\" width=\"627\" height=\"287\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c6d\/107\/a59\/c6d107a598fd932a5ba1aaf4ff804254.png\"\/><\/figure>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u044f \u0432\u044b\u0434\u0435\u043b\u0438\u043b \u0442\u043e, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0434 \u0438\u0433\u0440\u043e\u043a\u043e\u043c. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043d\u0430\u00a0\u044f\u0447\u0435\u0439\u043a\u0443: \u0442\u0443, \u0447\u0442\u043e\u00a0\u043f\u043e\u0434\u00a0\u0438\u0433\u0440\u043e\u043a\u043e\u043c:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/37d\/05b\/3fb\/37d05b3fb60cbadde29ad2119c551b3f.png\" width=\"352\" height=\"288\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/37d\/05b\/3fb\/37d05b3fb60cbadde29ad2119c551b3f.png\"\/><\/figure>\n<p>\u0418 \u0442\u0443, \u0447\u0442\u043e \u043d\u0430\u0434:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bbd\/8fd\/7da\/bbd8fd7da61f1c7b6f0cf76616f06a9f.png\" width=\"352\" height=\"288\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bbd\/8fd\/7da\/bbd8fd7da61f1c7b6f0cf76616f06a9f.png\"\/><\/figure>\n<p>\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0445 \u043e\u0431\u044b\u0447\u043d\u044b\u043c Sprite \u0438 \u0434\u043b\u044f \u043d\u0438\u0436\u043d\u0438\u0445 \u0441\u0442\u0430\u0432\u0438\u0442\u044c priority = 0, \u0430 \u0434\u043b\u044f \u0432\u0435\u0440\u0445\u043d\u0438\u0445 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u2014 priority = max<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u043a\u0443\u0441\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/053\/3d7\/e20\/0533d7e20ea280d5b4cffe6632446e8d.png\" width=\"1285\" height=\"906\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/053\/3d7\/e20\/0533d7e20ea280d5b4cffe6632446e8d.png\"\/><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b52\/505\/1a8\/b525051a8ff4bfc95fe295296a177c51.png\" width=\"1285\" height=\"906\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b52\/505\/1a8\/b525051a8ff4bfc95fe295296a177c51.png\"\/><\/figure>\n<p>\u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u0430\u043c \u043d\u0430\u0434\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0443\u0441\u0442\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u0436\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0435\u0451 \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 PNG. \u041f\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043e\u043d\u0430 \u043e\u0431\u0440\u0435\u0437\u0430\u0435\u0442\u0441\u044f \u0434\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432, \u0438 \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u0432\u0435\u0440\u0445\u0443\u0448\u043a\u0430 \u0434\u0435\u0440\u0435\u0432\u0430, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 32*32, \u0430 \u043a\u0443\u0434\u0430 \u0435\u0451 \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u043d\u0430 \u0438\u0433\u0440\u043e\u0432\u0443\u044e \u043a\u0430\u0440\u0442\u044b \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u044f\u0441\u043d\u043e. <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0434\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0430\u0439\u043b\u0430\u043c\u0438. \u041e\u043d\u0438 \u043f\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0442\u0430\u043a \u0436\u0435 \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b: \u0444\u0430\u0439\u043b\u044b \u041d\u0410\u0414 \u0438\u0433\u0440\u043e\u043a\u043e\u043c \u0438 \u0444\u0430\u0439\u043b\u044b \u041f\u041e\u0414 \u043d\u0438\u043c. \u042f \u0441\u0434\u0435\u043b\u0430\u043b \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u0444\u0430\u0439\u043b\u043e\u0432 *_high.anim \u0438 *_down.anim. \u0412\u043d\u0443\u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u043e\u0432\u00a0\u2014 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 xml, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0443\u0442\u044c \u043a\u00a0\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e, \u0432\u044b\u0441\u043e\u0442\u0443\/\u0448\u0438\u0440\u0438\u043d\u0443 \u0442\u0430\u0439\u043b\u0430, \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0435\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435, \u0435\u0441\u043b\u0438 \u0442\u0430\u043c \u043c\u043d\u043e\u0433\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439. \u041f\u0440\u0438 \u0438\u0433\u0440\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c SpriteAnimationComponent \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432. \u041a\u0430\u043a \u043d\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u043e &#8212; \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 SpriteAnimationComponent \u043d\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u0443\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0438 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043e\u043d\u0438 \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u043b\u043e\u044f\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 Tiled. \u042f \u043f\u043e\u0434\u0445\u043e\u0436\u0443 \u0437\u0434\u0435\u0441\u044c \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435: \u043f\u043e\u043e\u0447\u0435\u0440\u0451\u0434\u043d\u043e \u043f\u0440\u043e\u0445\u043e\u0436\u0443 \u043f\u043e \u0432\u0441\u0435\u043c \u044f\u0447\u0435\u0439\u043a\u0430\u043c \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u0432\u0441\u0435 \u043b\u0438\u043d\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0445\u043e\u0434\u044f\u0442 \u0432 \u044d\u0442\u0443 \u044f\u0447\u0435\u0439\u043a\u0443, \u0435\u0441\u043b\u0438 \u043b\u0438\u043d\u0438\u044f \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u044f\u0447\u0435\u0439\u043a\u0443\u00a0\u2014 \u043d\u0430\u0445\u043e\u0436\u0443 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u044d\u0442\u0443 \u0442\u043e\u0447\u043a\u0443 \u043a\u0430\u043a \u043d\u0443\u0436\u043d\u0443\u044e. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u044f \u043f\u043e\u043b\u0443\u0447\u0430\u044e \u043a\u0440\u0430\u0442\u043a\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u0441\u0435 \u0438\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u043f\u0440\u043e\u0447\u0435\u0435 \u0432 \u043c\u043e\u0451\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 *.objXml. \u042d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u044f \u0431\u0443\u0434\u0443 \u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0430 \u0445\u043e\u0434\u0443. \u041e\u043d\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 Tiled \u0438 \u0432\u0441\u0435 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0447\u0430\u043b\u0430. \u041e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0432 \u043c\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043b\u0438\u0441\u0442 \u0442\u043e\u0447\u0435\u043a \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f, \u0443\u043c\u043d\u043e\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0432\u0435\u043a\u0442\u043e\u0440 \u0438 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e &#8212; \u043c\u043e\u0436\u0435\u0442 \u043b\u0438 \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u0451 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e &#8212; \u0431\u041e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c (\u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u041e\u043b\u044c\u0448\u0430\u044f) \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439 \u0432 \u0438\u0433\u0440\u0435 &#8212; \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 PolygonHitbox, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043a, \u0438 \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043a\u0443\u0447\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u041d\u0430\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0434\u043e \u0437\u043d\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u0447\u0435\u043a \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u0438\u043d\u0438\u0438 \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043e\u043a\u0430\u0436\u0435\u043c\u0441\u044f \u0438\u0433\u0440\u043e\u043a\u043e\u043c \u0432 \u0431\u043b\u0438\u0437\u043e\u0441\u0442\u0438 \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<h2>Flame<\/h2>\n<p>\u041e\u0431\u0441\u0447\u0451\u0442 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439\u00a0\u2014 \u0441\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435 \u0438 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u0438\u0433\u0440\u0435. \u042d\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0438 \u0432 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0439 \u0432\u044b\u0448\u0435 <a href=\"https:\/\/habr.com\/ru\/articles\/682452\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a>. <\/p>\n<p>\u0412\u043e\u2011\u043f\u0435\u0440\u0432\u044b\u0445, \u0432\u0441\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0443\u00a0Flame \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0438\u0435. \u041d\u0435\u00a0\u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u044d\u0442\u043e \u0438\u00a0\u043a\u043b\u0430\u0441\u0441 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439 (ShapeHitbox). \u0422\u0430\u043c \u0438 \u0440\u0435\u0442\u0440\u0435\u0439\u0441\u0438\u043d\u0433 \u0441\u0440\u0430\u0437\u0443 \u0432\u0448\u0438\u0442, \u0438 \u043f\u0440\u043e\u0447\u0435\u0435, \u043f\u0440\u043e\u0447\u0435\u0435. <\/p>\n<p>\u0412\u043e\u2011\u0432\u0442\u043e\u0440\u044b\u0445, \u0432\u043e\u00a0Flame \u041d\u0415\u041b\u042c\u0417\u042f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443\u00a0\u043b\u0438\u043d\u0438\u044e \u043a\u0430\u043a\u00a0\u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f\u00a0\u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u0440 \u0432\u044b\u043f\u0443\u043a\u043b\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0442.\u0435 \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0438\u0437 \u0442\u0440\u0451\u0445 \u0442\u043e\u0447\u0435\u043a. <\/p>\n<p>\u0412\u2011\u0442\u0440\u0435\u0442\u044c\u0438\u0445, \u043d\u0435\u0442 \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043d\u0430\u00a0\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432, \u0442.\u00a0\u0435., \u043f\u043e\u043f\u0430\u0432 \u0432\u00a0\u0443\u0437\u043a\u0438\u0439 \u043f\u0435\u0440\u0435\u0443\u043b\u043e\u043a, \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u043e\u0442\u00a0\u0438\u0433\u0440\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u00a0\u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u0441\u043b\u0435\u0432\u0430, \u043f\u043e\u0442\u043e\u043c \u0441\u043f\u0440\u0430\u0432\u0430. \u0412\u0441\u0451 \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a\u00a0\u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a\u0438\u043c\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043d\u0435\u00a0\u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430.<\/p>\n<p>\u0412 \u0447\u0435\u0442\u0432\u0451\u0440\u0442\u044b\u0445: \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0432\u0430\u043c \u0434\u0430\u044e\u0442 \u043d\u0435 \u0442\u0435 \u0442\u043e\u0447\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u0430\u0448\u0435\u0433\u043e \u0442\u0435\u043b\u0430, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u043e\u0447\u043a\u0443 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0441 \u0432\u0430\u0448\u0435\u0439 \u043b\u0438\u043d\u0438\u0435\u0439. \u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 &#8212; \u0447\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u044f\u0441\u044c \u043d\u0430 \u044d\u0442\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043a\u0440\u043e\u043c\u0435 \u043a\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e \u0434\u0430 &#8212; \u043c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0441 \u0447\u0435\u043c-\u0442\u043e \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c. \u042d\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043d\u0435 \u043d\u0435\u0441\u0451\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430, \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f. \u0414\u043e\u043b\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u0447\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u043e\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0441\u043c\u0435\u043d\u0438\u043b \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0432 \u0441\u0435\u0431\u044f \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u043c\u043e\u0435\u0433\u043e \u0445\u0438\u0442\u0431\u043e\u043a\u0441\u0430.<\/p>\n<p>\u041c\u0438\u043d\u0443\u0441\u044b \u043e\u0442\u00a0\u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0432\u0435\u0449\u0438\u00a0\u2014 \u0432\u0441\u0435 \u0437\u0430\u0431\u043e\u0440\u044b \u0438\u043b\u0438\u00a0\u043b\u0438\u043d\u0438\u0438 \u0431\u0435\u0440\u0435\u0433\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0443\u0431\u0438\u043a\u0430\u043c\u0438, \u0447\u0442\u043e\u00a0\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u0447\u0435\u043a \u0438\u00a0\u043b\u0438\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439 \u0432\u00a0\u0434\u0432\u0430 \u0440\u0430\u0437\u0430! \u0418 \u0440\u043e\u0432\u043d\u043e \u0432\u043e\u00a0\u0441\u0442\u043e\u043b\u044c\u043a\u043e\u00a0\u0436\u0435 \u0440\u0430\u0437 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0441\u0447\u0451\u0442 \u043d\u0430\u00a0\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439. \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u041d\u0415\u0432\u044b\u043f\u0443\u043a\u043b\u044b\u0435 \u043c\u043d\u043e\u0433\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0440\u043e\u0431\u0438\u0442\u044c \u0437\u0430\u043a\u0443\u0442\u043a\u0438 \u0438 \u0434\u043e\u043c\u0430 \u0441\u00a0\u043e\u0434\u043d\u0438\u043c \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0432\u0445\u043e\u0434\u043e\u043c \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u043a\u043e\u043c\u043d\u0430\u0442\u044b, \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438 \u0442.\u0434. \u0438 \u0442.\u043f. \u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0430\u0447\u043d\u0451\u0442\u0443 \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 &#8212; \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0432\u0435 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u0432\u0430\u0441, \u0430 \u043d\u0435 \u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u0430\u0448\u0435\u0433\u043e \u0445\u0438\u0442\u0431\u043e\u043a\u0441\u0430. \u0412\u043e\u0442 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430: <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/269\/2f1\/6cb\/2692f16cb20fe1759027a33579f84fb0.png\" width=\"651\" height=\"604\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/269\/2f1\/6cb\/2692f16cb20fe1759027a33579f84fb0.png\"\/><\/figure>\n<p>\u0416\u0435\u043b\u0442\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u0434\u0430\u0441\u0442 \u043d\u0430\u043c Flame \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438. \u0417\u0435\u043b\u0451\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 &#8212; \u044d\u0442\u0430 \u0442\u043e\u0447\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0432\u043d\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0442\u0435\u043b\u0430. \u0424\u0438\u043e\u043b\u0435\u0442\u0430\u0432\u0430\u044f \u043b\u0438\u043d\u0438\u044f &#8212; \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0446\u0435\u043d\u0442\u0440\u0430, \u043d\u0430\u0448\u0435\u0439 \u0442\u043e\u0447\u043a\u0438 \u0438 \u043b\u044e\u0431\u043e\u0439 \u0433\u0440\u0430\u043d\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u0442\u0435\u043b\u0430. \u0427\u0451\u0440\u043d\u0430\u044f \u0441\u0442\u0440\u0435\u043b\u043a\u0430 &#8212; \u043d\u043e\u0440\u043c\u0430\u043b\u044c \u044d\u0442\u043e\u0439 \u0433\u0440\u0430\u043d\u0438, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f. \u042f \u0434\u0430\u044e \u0432 \u0441\u0432\u043e\u0451\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0435 \u0444\u0438\u043e\u043b\u0435\u0442\u043e\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 (\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0430 \u043e\u0442 \u0437\u0435\u043b\u0451\u043d\u043e\u0439 \u0438 \u0436\u0451\u043b\u0442\u043e\u0439), \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u0438 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u043a \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043a\u0443\u0434\u0430 \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f, \u043b\u0438\u0431\u043e \u0432\u043b\u0435\u0432\u043e, \u043b\u0438\u0431\u043e \u0432\u043d\u0438\u0437 \u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436 \u0437\u0430\u0441\u0442\u0440\u0435\u0432\u0430\u0435\u0442 \u0443 \u043a\u0440\u0430\u044f \u0441\u0442\u0435\u043d\u044b. \u0424\u0438\u043e\u043b\u0435\u0442\u043e\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u044e\u0442 \u044d\u0442\u043e \u0438 \u0442\u0430\u043a\u0438\u0445 \u0441\u043a\u043b\u0435\u0435\u043a \u043d\u0435\u0442.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8bd\/cc8\/53e\/8bdcc853e4a95d4eed9b17ff43613b40.png\" alt=\"\u0416\u0435\u043b\u0442\u044b\u0435 - \u0447\u0442\u043e \u0434\u0430\u0441\u0442 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 Flame. \u041a\u0440\u0430\u0441\u043d\u0430\u044f - \u0447\u0442\u043e \u0434\u0430\u044e \u044f\" title=\"\u0416\u0435\u043b\u0442\u044b\u0435 - \u0447\u0442\u043e \u0434\u0430\u0441\u0442 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 Flame. \u041a\u0440\u0430\u0441\u043d\u0430\u044f - \u0447\u0442\u043e \u0434\u0430\u044e \u044f\" width=\"511\" height=\"707\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8bd\/cc8\/53e\/8bdcc853e4a95d4eed9b17ff43613b40.png\"\/><\/p>\n<div><figcaption>\u0416\u0435\u043b\u0442\u044b\u0435 &#8212; \u0447\u0442\u043e \u0434\u0430\u0441\u0442 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 Flame. \u041a\u0440\u0430\u0441\u043d\u0430\u044f &#8212; \u0447\u0442\u043e \u0434\u0430\u044e \u044f<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u0434\u0430\u043b\u0438\u043b \u0438\u0437 \u0438\u0433\u0440\u044b \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0438 \u0441\u043e\u0437\u0434\u0430\u043b \u0441\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u0447\u0435\u043a \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443. \u0410 \u0432 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043e\u0431\u0441\u0447\u0451\u0442\u0430 \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432\u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0434\u0432\u0438\u0433\u0430\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432\u0441\u0435\u0445 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439 \u0441 \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u044f\u043c\u0438, \u0430 \u043f\u043e\u0442\u043e\u043c \u0443\u0436\u0435 \u0432\u044b\u0437\u043e\u0432 \u0435\u0433\u043e \u043a\u043e\u043b\u0431\u044d\u043a\u0430 \u0441 \u0441\u043e\u0432\u043e\u043a\u0443\u043f\u043d\u043e\u0441\u0442\u044c\u044e \u044d\u0442\u0438\u0445 \u0442\u043e\u0447\u0435\u043a. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u043b\u0438 \u0432\u044b \u0443\u0434\u0430\u0440\u044f\u0435\u0442\u0435\u0441\u044c \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438 \u0441\u043f\u0440\u0430\u0432\u0430, \u0438 \u0441\u043b\u0435\u0432\u0430 \u2014 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0434\u0432\u0430: \u043b\u0438\u0431\u043e \u0432\u0432\u0435\u0440\u0445, \u043b\u0438\u0431\u043e \u0432\u043d\u0438\u0437.<\/p>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043b\u044e\u0441 \u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u043e \u044f\u0447\u0435\u0439\u043a\u0430\u043c &#8212; \u043e\u0442\u0441\u0435\u043a\u0430\u0442\u044c \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0434\u0440\u0443\u0433\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0435.<\/p>\n<p>\u0412\u00a0\u0438\u0442\u043e\u0433\u0435 \u044f \u043f\u0440\u0438\u0448\u0451\u043b \u043a\u00a0\u0442\u0430\u043a\u043e\u043c\u0443 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0443, \u0447\u0442\u043e \u0443\u00a0\u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u0430: \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0438 \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u00a0\u2014 \u043c\u0435\u0447 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430 \u0438 \u043f\u0440\u043e\u0447\u0435\u0435, \u0447\u0442\u043e\u00a0\u043d\u0435\u00a0\u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u00a0\u0432\u0441\u0435\u0445 \u0442\u043e\u0447\u043a\u0430\u0445 \u0441\u043e\u043f\u0440\u0438\u043a\u043e\u0441\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0438 \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u043b\u0431\u044d\u043a \u0441\u0440\u0430\u0437\u0443. \u0422\u043e\u0447\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u00a0\u043c\u0430\u0441\u0441\u0438\u0432, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f, \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\u043c\u0438 \u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443.<\/p>\n<h2>\u0418\u0442\u043e\u0433\u0438<\/h2>\n<p>Tiled\u00a0\u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0434\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0445 \u0438 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043a\u0430\u0440\u0442. \u041d\u043e\u00a0\u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u0441\u0451 \u044d\u0442\u043e \u043f\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u042d\u0442\u043e \u043d\u0435\u0434\u043e\u043b\u0433\u043e \u0438 \u043d\u0435\u0441\u0442\u0440\u0430\u0448\u043d\u043e, \u043d\u043e\u00a0\u043e\u0442\u00a0\u044d\u0442\u043e\u0433\u043e \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435\u00a0\u0434\u0435\u0442\u044c\u0441\u044f, \u043f\u0440\u0438\u00a0\u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u0430\u0440\u0442\u0435 \u0432\u0430\u043c \u043d\u0430\u0434\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0443\u0437\u043a\u0443 *.tmx. \u0414\u0430\u00a0\u0438 \u0447\u0435\u0441\u0442\u043d\u043e\u00a0\u2014 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0443 \u0440\u0430\u0437, \u0438 \u043a\u0430\u0440\u0442\u0430 \u043e\u0441\u043e\u0431\u043e \u0447\u0430\u0441\u0442\u043e \u043d\u0435\u00a0\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u0443\u0436 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u00a0\u043f\u043e\u043f\u0430\u0434\u0451\u0442 \u0432\u00a0google play.<\/p>\n<p>Flame\u00a0\u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u0441\u00a0\u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u0435\u0441\u0442\u044c \u0435\u0434\u0438\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u043a\u0430\u043c\u0435\u0440\u044b, \u043a\u044d\u0448\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f HUD \u043f\u0440\u044f\u043c\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 Flutter (class Joystick extends StatelessWidget => return Center(child: joystick())). \u041c\u0438\u043d\u0443\u0441\u044b\u00a0\u2014 \u0432\u0441\u0451, \u0447\u0442\u043e\u00a0\u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441\u00a0\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u041a\u00a0\u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u0440\u043e\u0449\u0435 \u0441\u0430\u043c\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u0435\u0441\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u043d\u043e\u00a0\u043f\u043e\u0432\u0435\u0440\u044c\u0442\u0435\u00a0\u2014 \u044d\u0442\u043e \u0432\u0441\u0451 \u0441\u0443\u043f\u0435\u0440 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e.<\/p>\n<h2>\u0410 \u0447\u0442\u043e \u0442\u0430\u043c \u0443 \u043c\u0435\u043d\u044f \u0432 \u0438\u0433\u0440\u0435<\/h2>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0443 \u043c\u0435\u043d\u044f 2699 \u0444\u0430\u0439\u043b\u043e\u0432 \u043e\u0431\u0449\u0438\u043c \u0432\u0435\u0441\u043e\u043c 20 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442.<\/p>\n<p>\u0418\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a asset&#8217;\u0430\u043c \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u043d\u0430 android, \u043c\u043d\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u0430\u0430\u0430\u0430\u0430\u0430\u043c\u043e\u043c \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0438\u0433\u0440\u044b \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c *.anim \u0438 *.objXml \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0445 \u0434\u0432\u0443\u043c\u044f \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u044d\u0442\u043e \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0434\u043b\u044f \u043a\u044d\u0448\u0430. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 3 \u0441\u0435\u043a\u0443\u043d\u0434\u044b. \u041f\u043e\u0442\u043e\u043c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0438\u0433\u0440\u0430, \u0438 \u043c\u044b \u0432\u0438\u0434\u0438\u043c 9 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432 \u0432\u043e\u043a\u0440\u0443\u0433 \u0438\u0433\u0440\u043e\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0435\u0441\u0448\u043e\u0432\u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u0445\u043e\u0434\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u0438. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a 352*288 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u041d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435 FPS \u0432 \u0441\u0430\u043c\u044b\u0445 \u0442\u044f\u0436\u0451\u043b\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u0445 \u043d\u0435 \u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0438\u0436\u0435 40 FPS, \u0430 \u0442\u0430\u043a \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e 60. \u041d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0433\u043b\u0430\u0437\u0443 \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u0445 \u043f\u0440\u0438\u0444\u0440\u0438\u0437\u043e\u0432 \u0438 \u043f\u0440\u043e\u0447\u0435\u0433\u043e \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f\u0445.<\/p>\n<h2>\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438<\/h2>\n<p>\u041c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438 \u043a\u0440\u0443\u0442\u0438\u0442\u044c\/\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c  \u041b\u042e\u0411\u042b\u0415 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c\u0441\u044f \u0445\u043e\u0440\u043e\u0448\u043e \u043a\u043b\u0430\u0441\u0441\u043e\u043c MapObstacle \u0438\u043b\u0438 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044f \u043e\u0442 \u043d\u0435\u0433\u043e. \u0421\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0432\u0441\u0435 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c \u043e\u0442\u0434\u0430\u0451\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443. \u0412 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432\u0445\u043e\u0434\u044f\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0447\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430. \u0422.\u0435. \u043b\u043e\u0433\u0438\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u0430 \u0442\u043e\u0447\u043a\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u0432\u0430\u0448\u0435\u0433\u043e \u0434\u0432\u0438\u0433\u0430\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u0442\u0435\u043b\u0430.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u0432\u043e\u043e\u0431\u0449\u0435 \u043a\u0430\u0440\u0443, \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435\u0435 9600*9600 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0432 Tiled, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0434\u0430\u0441\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u0430\u043c Flame. \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u044b \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0451 \u043d\u0430 \u043c\u0438\u043d\u0438\u0444\u0430\u0439\u043b\u044b \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c \u0432\u0430\u0448\u0435\u0439 \u044f\u0447\u0435\u0439\u043a\u0438. \u0418 \u0432\u0441\u0451, \u043f\u043e\u0442\u043e\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0441\u043c\u0435\u043d\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u043c\u0435\u043d\u044f\u0442\u044c \u044f\u0447\u0435\u0439\u043a\u0438.<\/p>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442 \u0435\u0441\u0442\u044c \u0431\u0430\u0433 \u0432 \u043f\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 &#8212; \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u044b\u0440\u0430 \u043f\u0440\u0438 \u0434\u0440\u043e\u0431\u043b\u0435\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u0437 \u043a\u0430\u0440\u0442\u044b *.tmx \u0432 ObjXml. \u041d\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0437\u0434\u0435\u0441\u044c \u0447\u0438\u0441\u0442\u043e \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f, \u0438 \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f. \u041c\u043e\u0436\u0435\u0442 \u0432\u044b\u043b\u043e\u0436\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u0433\u0434\u0430 \u0434\u043e\u0431\u0435\u0440\u0443\u0441\u044c \u0434\u043e \u043d\u0435\u0433\u043e: <\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/292\/73d\/2d9\/29273d2d9985f12e3fd0fe189bd56c6d.png\" width=\"502\" height=\"341\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/292\/73d\/2d9\/29273d2d9985f12e3fd0fe189bd56c6d.png\"\/><\/figure>\n<h2>\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438<\/h2>\n<details class=\"spoiler\">\n<summary>\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">class LoadedColumnRow {   LoadedColumnRow(this.column, this.row);   int column;   int row;    @override   bool operator ==(Object other) {     return other is LoadedColumnRow &amp;&amp; other.column == column &amp;&amp; other.row == row;   }    @override   int get hashCode => column.hashCode ^ row.hashCode; }  Vector2 f_pointOfIntersect(Vector2 a1, Vector2 a2, Vector2 b1, Vector2 b2) {   double s1_x, s1_y, s2_x, s2_y;   s1_x = a2.x - a1.x;   s1_y = a2.y - a1.y;   s2_x = b2.x - b1.x;   s2_y = b2.y - b1.y;    double s, t;   s = (-s1_y * (a1.x - b1.x) + s1_x * (a1.y - b1.y)) \/       (-s2_x * s1_y + s1_x * s2_y);   t = (s2_x * (a1.y - b1.y) - s2_y * (a1.x - b1.x)) \/       (-s2_x * s1_y + s1_x * s2_y);    if (s >= 0 &amp;&amp; s &lt;= 1 &amp;&amp; t >= 0 &amp;&amp; t &lt;= 1) {     return Vector2(a1.x + (t * s1_x), a1.y + (t * s1_y));   }   return Vector2.zero(); }  class PointCust extends PositionComponent {   PointCust({required super.position,this.color});   final ShapeHitbox hitbox = CircleHitbox();   Color? color;    @override   void onLoad()   {     priority = 800;     size = Vector2(5, 5);     hitbox.paint.color = color ?? BasicPalette.green.color;     hitbox.renderShape = true;     add(hitbox);      Future.delayed(const Duration(milliseconds: 30),(){       removeFromParent();     });   } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041a\u043b\u0430\u0441\u0441 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">import 'dart:io'; import 'dart:ui'; import 'package:flame\/components.dart'; import 'package:flame\/experimental.dart'; import 'package:flame\/extensions.dart'; import 'package:flame\/flame.dart'; import 'package:flame_tiled\/flame_tiled.dart'; import 'package:flame_tiled_utils\/flame_tiled_utils.dart'; import 'package:game_flame\/components\/physic_vals.dart';  enum RenderCompileMode{   Background,   Foreground,   All }  Future processTileType(     {required RenderableTiledMap tileMap,       required TileProcessorFunc addTiles,       required List&lt;String> layersToLoad,       required RenderCompileMode renderMode,       bool clear = true}) async {   for (final layer in layersToLoad) {     final tileLayer = tileMap.getLayer&lt;TileLayer>(layer);     final tileData = tileLayer?.data;     if (tileData != null) {       int xOffset = 0;       int yOffset = 0;       for (var tileId in tileData) {         bool isNeedAdd = true;         if (tileId != 0) {           final tileset = tileMap.map.tilesetByTileGId(tileId);           final firstGid = tileset.firstGid;           if (firstGid != null) {             tileId = tileId - firstGid; \/\/+ 1;           }           final tileData = tileset.tiles[tileId];           if(renderMode == RenderCompileMode.Background &amp;&amp; (tileData.class_ == 'high' || tileLayer!.name.startsWith('xx'))) {             isNeedAdd = false;           }           if(renderMode == RenderCompileMode.Foreground){             if(tileData.class_ != 'high' &amp;&amp; !tileLayer!.name.startsWith('xx')) {               isNeedAdd = false;             }           }           if(isNeedAdd){             final position = Vector2(xOffset.toDouble() * tileMap.map.tileWidth,                 yOffset.toDouble() * tileMap.map.tileWidth);             final tileProcessor = TileProcessor(tileData, tileset);             await addTiles(                 tileProcessor,                 position,                 Vector2(tileMap.map.tileWidth.toDouble(),                     tileMap.map.tileWidth.toDouble()));           }         }         xOffset++;         if (xOffset == tileLayer?.width) {           xOffset = 0;           yOffset++;         }       }     }   }   if (clear) {     tileMap.map.layers         .removeWhere((element) => layersToLoad.contains(element.name));     for (var rl in tileMap.renderableLayers) {       rl.refreshCache();     }   } }  class IntPoint {   IntPoint(this.x, this.y);   int x; \/\/column   int y; \/\/row    @override   bool operator ==(other)   {     if(other is IntPoint){       if(x != other.x || y != other.y){         return false;       }       return true;     }else{       return false;     }   }    @override   int get hashCode => x.hashCode + y.hashCode;  }  class AnimationPos {   String sourceImg = '';   final List&lt;IntPoint> spritePos = [];   final List&lt;double> stepTimes = [];   int width = 0;   int height = 0;    @override   operator ==(other)   {     if(other is AnimationPos){       if(spritePos.length == other.spritePos.length){         for(int i=0;i&lt;spritePos.length;i++){           if(spritePos[i] != other.spritePos[i]){             return false;           }         }       }else{         return false;       }       if(stepTimes.length == other.stepTimes.length){         for(int i=0;i&lt;stepTimes.length;i++){           if(stepTimes[i] != other.stepTimes[i]){             return false;           }         }       }else{         return false;       }       if(sourceImg != other.sourceImg){         return false;       }     }else{       return false;     }     return true;   }   @override   int get hashCode => sourceImg.hashCode + spritePos[0].hashCode + stepTimes[0].hashCode; }  class MySuperAnimCompiler { \/\/\u0414\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 ImageBatchCompiler   List&lt;Map&lt;Sprite?, List&lt;Vector2>>> _mapsSprite = [];   Map&lt;Sprite?, List&lt;Vector2>> _allSpriteMap = {};   Map&lt;AnimationPos, List&lt;Vector2>> _animations = {};    Future addTile(Vector2 position, TileProcessor tileProcessor) async   {     var animation = await tileProcessor.getSpriteAnimation();     if (animation == null) {       var sprite = await tileProcessor.getSprite();       _allSpriteMap.putIfAbsent(sprite, () => []);       _allSpriteMap[sprite]!.add(position);     } else {       AnimationPos pos = AnimationPos();       pos.sourceImg = tileProcessor.tileset.image!.source!;       pos.width = tileProcessor.tileset.tileWidth!;       pos.height = tileProcessor.tileset.tileHeight!;       Image image = await Flame.images.load(pos.sourceImg);       int maxColumn = image.width ~\/ pos.width;       for (final frame in tileProcessor.tile.animation) {         pos.stepTimes.add(frame.duration \/ 1000);         pos.spritePos.add(             IntPoint(frame.tileId % maxColumn, frame.tileId ~\/ maxColumn));       }       _animations.putIfAbsent(pos, () => []);       _animations[pos]!.add(position);     }   }    void addLayer() {     _mapsSprite.add(_allSpriteMap);     _allSpriteMap = {};   }    Future&lt;void> compile(String path) async   {     print('start compile! $path');     final nullImage = await Flame.images.load('null_image-352px.png');     for (int cols = 0; cols &lt; GameConsts.maxColumn; cols++) {       for (int rows = 0; rows &lt; GameConsts.maxRow; rows++) {         bool isWas = false;         var position = Vector2(cols * GameConsts.lengthOfTileSquare.x,             rows * GameConsts.lengthOfTileSquare.y);         Rectangle rec = Rectangle.fromPoints(position, Vector2(             position.x + GameConsts.lengthOfTileSquare.x,             position.y + GameConsts.lengthOfTileSquare.y));         final composition = ImageCompositionExt();         for (int i = 0; i &lt; _mapsSprite.length; i++) {           var currentSprites = _mapsSprite[i];           for (final spr in currentSprites.keys) {             if (spr == null) {               continue;             }             for (final pos in currentSprites[spr]!) {               if (!rec.containsPoint(pos + Vector2.all(1))) {                 continue;               }               composition.add(spr.image, pos - position, source: spr.src);               isWas = true;             }           }         }         if (isWas) {           composition.add(               nullImage, Vector2.all(0), source: nullImage.getBoundingRect());           final composedImage = composition.compose();           var byteData = await composedImage.toByteData(               format: ImageByteFormat.png);           File file = File('assets\/metaData\/$cols-${rows}_$path.png');           file.writeAsBytesSync(byteData!.buffer.asUint8List());         }       }     }     for (int cols = 0; cols &lt; GameConsts.maxColumn; cols++) {       for (int rows = 0; rows &lt; GameConsts.maxRow; rows++) {         var position = Vector2(cols * GameConsts.lengthOfTileSquare.x,             rows * GameConsts.lengthOfTileSquare.y);         Rectangle rec = Rectangle.fromPoints(position, Vector2(             position.x + GameConsts.lengthOfTileSquare.x,             position.y + GameConsts.lengthOfTileSquare.y));         bool isStartFile = false;         for (final anim in _animations.keys) {           String animText = '';           List&lt;Vector2> currentPoints = _animations[anim]!;           for (final point in currentPoints) {             if (!rec.containsPoint(point + Vector2.all(1))) {               continue;             }             if (animText == '') {               animText = '&lt;an src=\"${anim.sourceImg}\" w=\"${anim.width}\" h=\"${anim.height}\" >\\n';               for (int i = 0; i &lt; anim.stepTimes.length; i++) {                 animText +=                 '&lt;fr dr=\"${anim.stepTimes[i]}\" cl=\"${anim.spritePos[i]                     .x}\" rw=\"${anim.spritePos[i].y}\"\/>\\n';               }             }             animText +=             '&lt;ps x=\"${point.x}\" y=\"${point.y}\"\/>\\n';           }           if (animText != '') {             File file = File('assets\/metaData\/$cols-${rows}_$path.anim');             if(!isStartFile){               isStartFile = true;               file.writeAsStringSync('&lt;p>\\n', mode: FileMode.append);             }             file.writeAsStringSync(animText, mode: FileMode.append);             file.writeAsStringSync('&lt;\/an>\\n', mode: FileMode.append);           }         }         if (isStartFile) {           File file = File('assets\/metaData\/$cols-${rows}_$path.anim');           file.writeAsStringSync('&lt;\/p>\\n', mode: FileMode.append);         }       }     }   } } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041a\u043b\u0430\u0441\u0441 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">abstract class DCollisionEntity extends Component {   List&lt;Vector2> _vertices;   DCollisionType collisionType;   bool isSolid;   bool isStatic;   bool isLoop;   double angle = 0;   Vector2 scale = Vector2(1, 1);   Vector2 _center = Vector2(0, 0);   Set&lt;Vector2> obstacleIntersects = {};   LoadedColumnRow? _myCoords;   KyrgyzGame game;   int? column;   int? row;   double width = 0;   double height = 0;   bool onlyForPlayer = false;   Vector2 _minCoords = Vector2(0, 0);   Vector2 _maxCoords = Vector2(0, 0);   Vector2? transformPoint;    List&lt;Vector2> get vertices => _vertices;     DCollisionEntity(this._vertices,       {required this.collisionType, required this.isSolid, required this.isStatic         , required this.isLoop, required this.game, this.column, this.row, this.transformPoint})   {     if (isStatic) {       int currCol = column ?? vertices[0].x ~\/ GameConsts.lengthOfTileSquare.x;       int currRow = row ?? vertices[0].y ~\/ GameConsts.lengthOfTileSquare.y;       _myCoords = LoadedColumnRow(currCol, currRow);       game.gameMap.collisionProcessor.addStaticCollEntity(           LoadedColumnRow(currCol, currRow), this);     } else {       game.gameMap.collisionProcessor.addActiveCollEntity(this);     }     for (int i = 0; i &lt; vertices.length; i++) {       if (vertices[i].x &lt; _minCoords.x) {         _minCoords.x = vertices[i].x;       }       if (vertices[i].x > _maxCoords.x) {         _maxCoords.x = vertices[i].x;       }       if (vertices[i].y &lt; _minCoords.y) {         _minCoords.y = vertices[i].y;       }       if (vertices[i].y > _maxCoords.y) {         _maxCoords.y = vertices[i].y;       }     }     width = _maxCoords.x - _minCoords.x;     height = _maxCoords.y - _minCoords.y;     _center = (_maxCoords + _minCoords) \/ 2;     transformPoint ??= _center;   }    Vector2 getMinVector()   {     if(isStatic){       return _minCoords;     }     var par = parent as PositionComponent;     if(par.isFlippedHorizontally){       return Vector2(_getPointFromRawPoint(_maxCoords).x, _getPointFromRawPoint(_minCoords).y);     }else{       return _getPointFromRawPoint(_minCoords);     }   }    Vector2 getMaxVector()   {     if(isStatic){       return _maxCoords;     }     var par = parent as PositionComponent;     if(par.isFlippedHorizontally){       return Vector2(_getPointFromRawPoint(_minCoords).x, _getPointFromRawPoint(_maxCoords).y);     }else{       return _getPointFromRawPoint(_maxCoords);     }   }    doDebug(Color? color) {     for (int i = 0; i &lt; vertices.length; i++) {       if(parent == null){         return;       }       PointCust p = PointCust(           position: getPoint(i), color: color);       game.gameMap.add(p);     }   }    @override   void onRemove() {     if (!isStatic) {       game.gameMap.collisionProcessor.removeActiveCollEntity(this);     } else {       game.gameMap.collisionProcessor.removeStaticCollEntity(_myCoords);     }   }    bool onComponentTypeCheck(DCollisionEntity other);    void onCollisionStart(Set&lt;Vector2> intersectionPoints,       DCollisionEntity other);    void onCollisionEnd(DCollisionEntity other);    void onCollision(Set&lt;Vector2> intersectionPoints, DCollisionEntity other);    Vector2 _getPointFromRawPoint(Vector2 rawPoint)   {     if(isStatic){       return rawPoint;     }else {       var temp = parent as PositionComponent;       Vector2 posAnchor = temp.positionOfAnchor(temp.anchor);       Vector2 point = rawPoint - transformPoint!;       if(temp.isFlippedHorizontally){         point.x *= -1;       }       point.x *= scale.x;       point.y *= scale.y;       if(angle != 0){         point = _rotatePoint(point,temp.isFlippedHorizontally);       }       point += transformPoint!;       return point + posAnchor;     }   }    Vector2 getCenter() {     return _getPointFromRawPoint(_center);   }    int getVerticesCount() {     return vertices.length;   }    Vector2 getPoint(int index) {     return _getPointFromRawPoint(vertices[index]);       }    Vector2 _rotatePoint(Vector2 point, bool isHorizontalFlip) {     double radian = angle * pi \/ 180;     isHorizontalFlip ? radian *= -1 : radian;     point.x = point.x * cos(radian) - point.y * sin(radian);     point.y = point.x * sin(radian) + point.y * cos(radian);     return point;   }    @override   void update(double dt) {     \/\/ doDebug();     super.update(dt);   }  }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u044b *.tmx \u0432 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0438 \u043b\u044e\u0431\u044b\u0435 \u043a\u0430\u043a\u0438\u0435 \u0443\u0433\u043e\u0434\u043d\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u044b<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">Future compileAll(LoadedColumnRow colRow) async   {     if (colRow.column != 0 &amp;&amp; colRow.row != 0) {       return;     }     var fileName = 'top_left_bottom-slice.tmx'; \/\/\u0418\u043c\u044f \u0432\u0430\u0448\u0435\u0439 \u043a\u0430\u0440\u0442\u044b \u0438\u0437 Tiled     var tiled = await TiledComponent.load(fileName, Vector2.all(320));     var layersLists = tiled.tileMap.renderableLayers;     if (true) {       MySuperAnimCompiler compilerAnimationBack = MySuperAnimCompiler();       MySuperAnimCompiler compilerAnimation = MySuperAnimCompiler();       for (var a in layersLists) {         if (a.layer.type != LayerType.tileLayer) {           continue;         }         await processTileType(             clear: false,             renderMode: RenderCompileMode.Background,             tileMap: tiled.tileMap,             addTiles: (tile, position, size) async {               compilerAnimationBack.addTile(position, tile);             },             layersToLoad: [a.layer.name]);         compilerAnimationBack.addLayer();         await processTileType(             clear: false,             renderMode: RenderCompileMode.Foreground,             tileMap: tiled.tileMap,             addTiles: (tile, position, size) async {               compilerAnimation.addTile(position, tile);             },             layersToLoad: [a.layer.name]);         compilerAnimation.addLayer();       }       print('start compile!');       await compilerAnimation.compile('high');       await compilerAnimationBack.compile('down');     }     \/\/ tiled = await TiledComponent.load(fileName, Vector2.all(320));     Set&lt;String> loadedFiles = {};     for(var layer in layersLists){       if(layer.layer.type == LayerType.objectGroup){         var objs = tiled.tileMap.getLayer&lt;ObjectGroup>(layer.layer.name);         if (objs != null) {           for (int cols = 0; cols &lt; GameConsts.maxColumn; cols++) {             for (int rows = 0; rows &lt; GameConsts.maxRow; rows++) {               var positionCurs = Vector2(                   cols * GameConsts.lengthOfTileSquare.x,                   rows * GameConsts.lengthOfTileSquare.y);               String newObjs = '';               Rectangle rec = Rectangle.fromPoints(positionCurs, Vector2(                   positionCurs.x + GameConsts.lengthOfTileSquare.x,                   positionCurs.y + GameConsts.lengthOfTileSquare.y));               for (final obj in objs.objects) {                 if (obj.name == '') {                   continue;                 }                 Rectangle objRect = Rectangle.fromPoints(                     Vector2(obj.x, obj.y),                     Vector2(obj.x + obj.width, obj.y + obj.height));                 if (isIntersect(rec, objRect)) {                   newObjs +=                   '&lt;o nm=\"${obj.name}\" cl=\"${obj.type}\" x=\"${obj                       .x}\" y=\"${obj.y}\" w=\"${obj.width}\" h=\"${obj                       .height}\"';                   for(final props in obj.properties){                     newObjs += ' ${props.name}=\"${props.value}\"';                   }                   newObjs += '\/>';                   newObjs += '\\n';                 }               }               if (newObjs != '') {                 File file = File('assets\/metaData\/$cols-$rows.objXml');                 if (!loadedFiles.contains('assets\/metaData\/$cols-$rows.objXml')) {                   loadedFiles.add('assets\/metaData\/$cols-$rows.objXml');                   file.writeAsStringSync('&lt;p>\\n', mode: FileMode.append);                 }                 file.writeAsStringSync(newObjs, mode: FileMode.append);               }             }           }         }         print('END OF OBJS COMPILE');         print('start grounds compile');         if (objs != null) {           Map&lt;LoadedColumnRow, List&lt;GroundSource>> objsMap = {};           for (final obj in objs.objects) {             if (obj.name != '') {               continue;             }             bool isLoop = false;             List&lt;Vector2> points = [];             if (obj.isPolygon) {               isLoop = true;               for (final point in obj.polygon) {                 points.add(Vector2(point.x + obj.x, point.y + obj.y));               }             }             if (obj.isPolyline) {               for (final point in obj.polyline) {                 points.add(Vector2(point.x + obj.x, point.y + obj.y));               }             }             if (obj.isRectangle) {               isLoop = true;               points.add(Vector2(obj.x, obj.y));               points.add(Vector2(obj.x, obj.y + obj.height));               points.add(Vector2(obj.x + obj.width, obj.y + obj.height));               points.add(Vector2(obj.x + obj.width, obj.y));             }             int minCol = GameConsts.maxColumn;             int minRow = GameConsts.maxRow;             int maxCol = 0;             int maxRow = 0;              for (final point in points) {               minCol = min(minCol, point.x ~\/ (GameConsts.lengthOfTileSquare.x));               minRow = min(minRow, point.y ~\/ (GameConsts.lengthOfTileSquare.y));               maxCol = max(maxCol, point.x ~\/ (GameConsts.lengthOfTileSquare.x));               maxRow = max(maxRow, point.y ~\/ (GameConsts.lengthOfTileSquare.y));             }             bool isReallyLoop = minCol == maxCol &amp;&amp; minRow == maxRow &amp;&amp; isLoop;             for (int currColInCycle = minCol; currColInCycle &lt;= maxCol; currColInCycle++) {               for (int currRowInCycle = minRow; currRowInCycle &lt;= maxRow; currRowInCycle++) {                 Vector2 topLeft = Vector2(currColInCycle * GameConsts.lengthOfTileSquare.x,                     currRowInCycle * GameConsts.lengthOfTileSquare.y);                 Vector2 topRight = Vector2(                     (currColInCycle + 1) * GameConsts.lengthOfTileSquare.x,                     currRowInCycle * GameConsts.lengthOfTileSquare.y);                 Vector2 bottomLeft = Vector2(currColInCycle * GameConsts.lengthOfTileSquare.x,                     (currRowInCycle + 1) * GameConsts.lengthOfTileSquare.y);                 Vector2 bottomRight = Vector2(                     (currColInCycle + 1) * GameConsts.lengthOfTileSquare.x,                     (currRowInCycle + 1) * GameConsts.lengthOfTileSquare.y);                 List&lt;Vector2> coord = [];                 for (int i = -1; i &lt; points.length - 1; i++) {                   if (!isLoop &amp;&amp; i == -1) {                     continue;                   }                   int tF, tS;                   if (i == -1) {                     tF = points.length - 1;                     tS = 0;                   } else {                     tF = i;                     tS = i + 1;                   }                   List&lt;Vector2> tempCoord = [];                   if (points[tF].x >= topLeft.x &amp;&amp; points[tF].x &lt;= topRight.x                       &amp;&amp; points[tF].y >= topLeft.y &amp;&amp; points[tF].y &lt;= bottomLeft                       .y) {                     coord.add(points[tF]);                   }                   Vector2 answer = f_pointOfIntersect(                       topLeft, topRight, points[tF], points[tS]);                   if (answer != Vector2.zero()) {                     tempCoord.add(answer);                   }                   answer = f_pointOfIntersect(                       topRight, bottomRight, points[tF], points[tS]);                   if (answer != Vector2.zero()) {                     tempCoord.add(answer);                   }                   answer = f_pointOfIntersect(                       bottomRight, bottomLeft, points[tF], points[tS]);                   if (answer != Vector2.zero()) {                     tempCoord.add(answer);                   }                   answer = f_pointOfIntersect(                       bottomLeft, topLeft, points[tF], points[tS]);                   if (answer != Vector2.zero()) {                     tempCoord.add(answer);                   }                   if (tempCoord.length == 1) {                     coord.add(tempCoord[0]);                     if(coord.length > 1){                       GroundSource newPoints = GroundSource();                       newPoints.isLoop = false;                       newPoints.points = List.unmodifiable(coord);                       objsMap.putIfAbsent(LoadedColumnRow(currColInCycle, currRowInCycle), () => []);                       objsMap[LoadedColumnRow(currColInCycle, currRowInCycle)]!.add(newPoints);                       coord.clear();                     }                   } else {                     if (tempCoord.length == 2) {                       coord.clear();                       if (points[tF].distanceTo(tempCoord[0]) >                           points[tF].distanceTo(tempCoord[1])) {                         coord.add(tempCoord[1]);                         coord.add(tempCoord[0]);                       } else {                         coord.add(tempCoord[0]);                         coord.add(tempCoord[1]);                       }                       GroundSource newPoints = GroundSource();                       newPoints.isLoop = false;                       newPoints.points = List.unmodifiable(coord);                       objsMap.putIfAbsent(LoadedColumnRow(currColInCycle, currRowInCycle), () => []);                       objsMap[LoadedColumnRow(currColInCycle, currRowInCycle)]!.add(newPoints);                       coord.clear();                     } else if(tempCoord.length > 2){                       print('CRITICAL ERROR IN PRECOMPILE GROUND!!!');                     }                   }                 }                 if (points[points.length - 1].x >= topLeft.x &amp;&amp;                     points[points.length - 1].x &lt;= topRight.x                     &amp;&amp; points[points.length - 1].y >= topLeft.y &amp;&amp;                     points[points.length - 1].y &lt;= bottomLeft.y &amp;&amp; !isLoop) {                   coord.add(points[points.length - 1]);                 }                 if(coord.isNotEmpty) {                   GroundSource newPoints = GroundSource();                   newPoints.isLoop = isReallyLoop;                   newPoints.points = List.unmodifiable(coord);                   objsMap.putIfAbsent(                       LoadedColumnRow(currColInCycle, currRowInCycle), () =>                   [                   ]);                   objsMap[LoadedColumnRow(currColInCycle, currRowInCycle)]!.add(                       newPoints);                 }               }             }           }           for(final key in objsMap.keys){             File file = File('assets\/metaData\/${key.column}-${key.row}.objXml');             if(!loadedFiles.contains('assets\/metaData\/${key.column}-${key.row}.objXml')){               file.writeAsStringSync('&lt;p>\\n', mode: FileMode.append);               loadedFiles.add('assets\/metaData\/${key.column}-${key.row}.objXml');             }             for(int i=0;i&lt;objsMap[key]!.length;i++){               if(objsMap[key]![i].points.isEmpty){                 continue;               }               file.writeAsStringSync('\\n&lt;o lp=\"${objsMap[key]![i].isLoop ? '1' : '0'}\" nm=\"\" p=\"', mode: FileMode.append);               for(int j=0;j&lt;objsMap[key]![i].points.length;j++){                 if(j > 0){                   file.writeAsStringSync(' ', mode: FileMode.append);                 }                 file.writeAsStringSync('${objsMap[key]![i].points[j].x},${objsMap[key]![i].points[j].y}', mode: FileMode.append);               }               file.writeAsStringSync('\"\/>', mode: FileMode.append);             }           }         }       }     }      for(final key in loadedFiles){       File file = File(key);       file.writeAsStringSync('\\n&lt;\/p>', mode: FileMode.append);     }   }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u0443 \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430 \u043b\u0435\u0442\u0443 \u043d\u0430 \u043d\u0430\u0448 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u044d\u043a\u0440\u0430\u043d \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430:<\/p>\n<details class=\"spoiler\">\n<summary>\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">\/\/custMap - \u044d\u0442\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \/\/\u0418\u043c\u0435\u043d\u043e \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0430\u043c \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0442\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u043f\u0430\u043b\u0438 \u0438\u0437 \u0432\u0438\u0434\u0430 \/\/\u0414\u0432\u0438\u0433\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0443\u0434\u0430\u043b\u044f\u044e\u0442 \u0441\u0435\u0431\u044f \u0441\u0430\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c - \u043d\u0435 \u0431\u044b\u043b \u043b\u0438 \u043e\u043d \u0443\u0436\u0435  \/\/\u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d  Future&lt;void> generateMap(LoadedColumnRow colRow) async   {     if (colRow.column >= GameConsts.maxColumn || colRow.row >= GameConsts.maxRow) {       return;     }     if (colRow.column &lt; 0 || colRow.row &lt; 0) {       return;     }         custMap.allEls.putIfAbsent(colRow, () => []);     if (KyrgyzGame.cachedMapPngs.contains('${colRow.column}-${colRow.row}_down.png')) {       Image _imageDown = await Flame.images.load(           'metaData\/${colRow.column}-${colRow.row}_down.png'); \/\/KyrgyzGame.cachedImgs['$column-${row}_down.png']!;       var spriteDown = SpriteComponent(         sprite: Sprite(_imageDown),         position: Vector2(colRow.column * GameConsts.lengthOfTileSquare.x,             colRow.row * GameConsts.lengthOfTileSquare.y),         size: GameConsts.lengthOfTileSquare + Vector2.all(1),         priority: 0,       );       custMap.allEls[colRow]!.add(spriteDown);       custMap.add(spriteDown);     }     if (KyrgyzGame.cachedAnims.containsKey('${colRow.column}-${colRow.row}_down.anim')) {       var objects = KyrgyzGame.cachedAnims['${colRow.column}-${colRow.row}_down.anim']!;       for (final obj in objects) {         Vector2 sourceSize = Vector2(double.parse(obj.getAttribute('w')!),double.parse(obj.getAttribute('h')!));         Image srcImage = KyrgyzGame.cachedImgs[obj.getAttribute('src')!]!;         final List&lt;Sprite> spriteList = [];         final List&lt;double> stepTimes = [];         for (final anim in obj.findAllElements('fr')) {           spriteList.add(Sprite(srcImage, srcSize: sourceSize,               srcPosition: Vector2(                   double.parse(anim.getAttribute('cl')!) * sourceSize.x,                   double.parse(anim.getAttribute('rw')!) * sourceSize.y)));           stepTimes.add(double.parse(anim.getAttribute('dr')!));         }         var sprAnim = SpriteAnimation.variableSpriteList(             spriteList, stepTimes: stepTimes);         for (final anim in obj.findAllElements('ps')) {           var ss = SpriteAnimationComponent(animation: sprAnim,               position: Vector2(double.parse(anim.getAttribute('x')!),                   double.parse(anim.getAttribute('y')!)),               size: Vector2(sourceSize.x+1, sourceSize.y+1),               priority: GamePriority.ground + 1);           custMap.allEls[colRow]!.add(ss);           custMap.add(ss);         }       }     }     if (KyrgyzGame.cachedMapPngs.contains('${colRow.column}-${colRow.row}_high.png')) {       Image _imageHigh = await Flame.images.load(           'metaData\/${colRow.column}-${colRow.row}_high.png'); \/\/KyrgyzGame.cachedImgs['$column-${row}_high.png']!;       var spriteHigh = SpriteComponent(         sprite: Sprite(_imageHigh),         position: Vector2(colRow.column * GameConsts.lengthOfTileSquare.x,             colRow.row * GameConsts.lengthOfTileSquare.y),         priority: GamePriority.high - 1,         size: GameConsts.lengthOfTileSquare + Vector2.all(1),       );       custMap.allEls[colRow]!.add(spriteHigh);       custMap.add(spriteHigh);     }     if (KyrgyzGame.cachedAnims.containsKey('${colRow.column}-${colRow.row}_high.anim')) {       var objects = KyrgyzGame.cachedAnims['${colRow.column}-${colRow.row}_high.anim']!;       for (final obj in objects) {         Vector2 srcSize = Vector2(double.parse(obj.getAttribute('w')!),double.parse(obj.getAttribute('h')!));         Image srcImage = KyrgyzGame.cachedImgs[obj.getAttribute('src')!]!;         final List&lt;Sprite> spriteList = [];         final List&lt;double> stepTimes = [];         for (final anim in obj.findAllElements('fr')) {           spriteList.add(Sprite(srcImage, srcSize: srcSize,               srcPosition: Vector2(                   double.parse(anim.getAttribute('cl')!) * srcSize.x,                   double.parse(anim.getAttribute('rw')!) * srcSize.y)));           stepTimes.add(double.parse(anim.getAttribute('dr')!));         }         var sprAnim = SpriteAnimation.variableSpriteList(             spriteList, stepTimes: stepTimes);         for (final anim in obj.findAllElements('ps')) {           var ss = SpriteAnimationComponent(animation: sprAnim,               position: Vector2(double.parse(anim.getAttribute('x')!),                   double.parse(anim.getAttribute('y')!)),               size: Vector2(srcSize.x+1, srcSize.y+1),               priority: GamePriority.high);           custMap.allEls[colRow]!.add(ss);           custMap.add(ss);         }       }     }     if (KyrgyzGame.cachedObjXmls.containsKey('${colRow.column}-${colRow.row}.objXml')) {       var objects = KyrgyzGame.cachedObjXmls['${colRow.column}-${colRow.row}.objXml']!;       for (final obj in objects) {         String? name = obj.getAttribute('nm');         switch (name) {           case '':             var points = obj.getAttribute('p')!;             var pointsList = points.split(' ');             List&lt;Vector2> temp = [];             for(final sources in pointsList){               if(sources == ''){                 continue;               }               temp.add(Vector2(double.parse(sources.split(',')[0]),double.parse(sources.split(',')[1])));             }             if(temp.isNotEmpty) {                             var ground = Ground(temp, collisionType: DCollisionType.passive,                   isSolid: false,                   isStatic: true,                   isLoop: obj.getAttribute('lp')! == '1',                   game: myGame!,                   column: colRow.column,                   row: colRow.row);               custMap.allEls[colRow]!.add(ground);               custMap.add(ground);             }             break;           default:             _createLiveObj(obj, name, colRow);             break;         }       }     }   }   Future _createLiveObj(XmlElement obj, String? name, LoadedColumnRow colRow) async   {     Vector2 position = Vector2(         double.parse(obj.getAttribute('x')!),         double.parse(obj.getAttribute('y')!)     );     if (custMap.loadedLivesObjs.contains(position)) {       return;     }     switch (name) {       case 'enemy':         custMap.loadedLivesObjs.add(position);         custMap.add(GrassGolem(             position, GolemVariant.Grass, priority: GamePriority.player - 2));         break;       case 'wgolem':         custMap.loadedLivesObjs.add(position);         custMap.add(GrassGolem(             position, GolemVariant.Water, priority: GamePriority.player - 2));         break;       case 'gold':         var temp = LootOnMap(itemFromId(2), position: position);         custMap.allEls[colRow]!.add(temp);         custMap.add(temp);         break;       case 'strange_merchant':         var temp = StrangeMerchant(position,StrangeMerchantVariant.black, priority: GamePriority.player - 2);         custMap.allEls[colRow]!.add(temp);         custMap.add(temp);         break;       case 'chest':         var temp = Chest(1, myItems: [itemFromId(2)], position: position);         custMap.allEls[colRow]!.add(temp);         custMap.add(temp);         break;       case 'fObelisk':         var temp = FlyingHighObelisk(             position, colRow.column, colRow.row, priority: GamePriority.high - 1);         custMap.allEls[colRow]!.add(temp);         custMap.add(temp);         var temp2 = FlyingDownObelisk(             position, colRow.column, colRow.row, priority: GamePriority.player - 2);         custMap.allEls[colRow]!.add(temp2);         custMap.add(temp2);         break;       case 'sObelisk':         var temp = StandHighObelisk(position, priority: GamePriority.high - 1);         custMap.allEls[colRow]!.add(temp);         custMap.add(temp);         var temp2 = StandDownObelisk(             position, priority: GamePriority.player - 2);         custMap.allEls[colRow]!.add(temp2);         custMap.add(temp2);         break;       case 'telep':         var targetPos = obj.getAttribute('tar')!.split(',');         Vector2 target = Vector2(double.parse(targetPos[0]), double.parse(targetPos[1]));         Vector2 telSize = Vector2(double.parse(obj.getAttribute('w')!), double.parse(obj.getAttribute('h')!));         var temp = Teleport(size: telSize, position: position, targetPos: target);         custMap.allEls[colRow]!.add(temp);         custMap.add(temp);     }   }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">import 'dart:math' as math;  import 'package:flame\/components.dart'; import 'package:flame\/image_composition.dart'; import 'package:game_flame\/abstracts\/enemy.dart'; import 'package:game_flame\/abstracts\/hitboxes.dart'; import 'package:game_flame\/abstracts\/obstacle.dart'; import 'package:game_flame\/abstracts\/player.dart'; import 'package:game_flame\/abstracts\/utils.dart'; import 'package:game_flame\/components\/physic_vals.dart'; import 'package:game_flame\/components\/tile_map_component.dart';  class DCollisionProcessor {   final List&lt;DCollisionEntity> _activeCollEntity = [];   final Map&lt;LoadedColumnRow,List&lt;DCollisionEntity>> _staticCollEntity = {};   Map&lt;LoadedColumnRow, List&lt;DCollisionEntity>> _potentialActiveEntity = {};   Set&lt;LoadedColumnRow> _contactNests = {};     void addActiveCollEntity(DCollisionEntity entity)   {     _activeCollEntity.add(entity);   }    void removeActiveCollEntity(DCollisionEntity entity)   {     _activeCollEntity.remove(entity);   }    void addStaticCollEntity(LoadedColumnRow colRow, DCollisionEntity entity)   {     _staticCollEntity.putIfAbsent(colRow, () => []);     _staticCollEntity[colRow]!.add(entity);   }    void removeStaticCollEntity(LoadedColumnRow? colRow)   {     _staticCollEntity.remove(colRow);   }    void clearActiveCollEntity()   {     _activeCollEntity.clear();   }    void clearStaticCollEntity()   {     _staticCollEntity.clear();   }    void updateCollisions()   {     _potentialActiveEntity.clear();     for(DCollisionEntity entity in _activeCollEntity){       entity.obstacleIntersects = {};       if(entity.collisionType == DCollisionType.inactive) {         continue;       }       _contactNests.clear();       int minCol = 0;       int maxCol = 0;       int minRow = 0;       int maxRow = 0;       for(int i=0;i&lt;entity.getVerticesCount();i++){         if(i==0){           minCol = entity.getPoint(i).x ~\/ GameConsts.lengthOfTileSquare.x;           maxCol = entity.getPoint(i).x ~\/ GameConsts.lengthOfTileSquare.x;           minRow = entity.getPoint(i).y ~\/ GameConsts.lengthOfTileSquare.y;           maxRow = entity.getPoint(i).y ~\/ GameConsts.lengthOfTileSquare.y;           continue;         }         minCol = math.min(minCol, entity.getPoint(i).x ~\/ GameConsts.lengthOfTileSquare.x);         maxCol = math.max(maxCol, entity.getPoint(i).x ~\/ GameConsts.lengthOfTileSquare.x);         minRow = math.min(minRow, entity.getPoint(i).y ~\/ GameConsts.lengthOfTileSquare.y);         maxRow = math.max(maxRow, entity.getPoint(i).y ~\/ GameConsts.lengthOfTileSquare.y);       }        for(int col = minCol; col &lt;= maxCol; col++){         for(int row = minRow; row &lt;= maxRow; row++){           var lcr = LoadedColumnRow(col, row);           _potentialActiveEntity.putIfAbsent(lcr, () => []);           _potentialActiveEntity[lcr]!.add(entity);           _contactNests.add(lcr);         }       }       for(final lcr in _contactNests){         if(_staticCollEntity.containsKey(lcr)) {           for(final other in _staticCollEntity[lcr]!){             if(other.collisionType == DCollisionType.inactive){               continue;             }             if(entity.collisionType == DCollisionType.passive &amp;&amp; other.collisionType == DCollisionType.passive){               continue;             }             if(entity.parent != null &amp;&amp; entity.parent !is MainPlayer &amp;&amp; other.onlyForPlayer){               continue;             }             if(!entity.onComponentTypeCheck(other) &amp;&amp; !other.onComponentTypeCheck(entity)) {               continue;             }             _calcTwoEntities(entity, other, other is MapObstacle);           }         }       }     }     final listOfList = List.unmodifiable(_potentialActiveEntity.values.toList());     for(int key = 0; key &lt; listOfList.length; key++){       Set&lt;int> removeList = {};       for(int i = 0; i &lt; listOfList[key].length; i++){         for(int j = 0; j &lt; listOfList[key].length; j++){           if(i == j || removeList.contains(j)){             continue;           }           if(listOfList[key][i].collisionType == DCollisionType.passive &amp;&amp; listOfList[key][j].collisionType == DCollisionType.passive){             continue;           }           if(!listOfList[key][i].onComponentTypeCheck(listOfList[key][j]) &amp;&amp; !listOfList[key][j].onComponentTypeCheck(listOfList[key][i])){             continue;           }           if(listOfList[key][j] is MapObstacle){             if(listOfList[key][i].parent != null &amp;&amp; listOfList[key][i].parent is KyrgyzEnemy &amp;&amp; listOfList[key][j].onlyForPlayer){               continue;             }             _calcTwoEntities(listOfList[key][i], listOfList[key][j],true);             continue;           }           if(listOfList[key][i] is MapObstacle){             if(listOfList[key][j].parent != null &amp;&amp; listOfList[key][j].parent is KyrgyzEnemy &amp;&amp; listOfList[key][i].onlyForPlayer){               continue;             }             _calcTwoEntities(listOfList[key][j], listOfList[key][i],true);             continue;           }           _calcTwoEntities(listOfList[key][j], listOfList[key][i],false);         }         removeList.add(i);       }     }     for(DCollisionEntity entity in _activeCollEntity){       if(entity.obstacleIntersects.isNotEmpty){         entity.onCollisionStart(entity.obstacleIntersects, entity); \/\/\/obstacleIntersects \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0443 \u0413\u0440\u043e\u0443\u043d\u0434\u0425\u0438\u0442\u0431\u043e\u043a\u0441\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043b\u0430\u0436\u0443         entity.obstacleIntersects.clear();       }     }   } }  \/\/\u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0435 entity \u0412\u0421\u0415\u0413\u0414\u0410 \u041f\u0420\u042f\u041c\u041e\u0423\u0413\u041e\u041b\u042c\u041d\u0418\u041a\u0418 \u0437\u0430\u043b\u0443\u043f\u043b\u0435\u043d\u043d\u044b\u0435 void _calcTwoEntities(DCollisionEntity entity, DCollisionEntity other, bool isMapObstacle) {   Set&lt;int> insidePoints = {};   if(isMapObstacle) { \/\/\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0432\u0441\u0435 \u043e\u0431\u0435\u043a\u0442\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0441 \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0432\u0438\u0435\u043c \u0441 \u0437\u0435\u043c\u043b\u0451\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0435, \u0438\u043d\u0430\u0447\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e \u0431\u043b\u0438\u0436\u0435 \u043e\u0442 \u0446\u0435\u043d\u0442\u0440\u0430 \u0442\u0432\u043e\u0435\u0433\u043e \u0442\u0435\u043b\u0430      for (int i = 0; i &lt; other.getVerticesCount(); i++) {       Vector2 otherFirst = other.getPoint(i);       if(otherFirst.x &lt;= entity.getMaxVector().x           &amp;&amp; otherFirst.x >= entity.getMinVector().x           &amp;&amp; otherFirst.y &lt;= entity.getPoint(1).y           &amp;&amp; otherFirst.y >= entity.getPoint(0).y){         insidePoints.add(i);       }     }   }   _finalInterCalc(entity, other,insidePoints,isMapObstacle); }  void _finalInterCalc(DCollisionEntity entity, DCollisionEntity other,Set&lt;int> insidePoints, bool isMapObstacle) {   for (int i = -1; i &lt; other.getVerticesCount() - 1; i++) {     if (!other.isLoop &amp;&amp; i == -1) {       continue;     }     int tFirst, tSecond;     if (i == -1) {       tFirst = other.getVerticesCount() - 1;     } else {       tFirst = i;     }     tSecond = i + 1;     Vector2 otherFirst = other.getPoint(tFirst);     Vector2 otherSecond = other.getPoint(tSecond);     if (isMapObstacle) {       if(insidePoints.contains(tFirst) &amp;&amp; insidePoints.contains(tSecond)) {         entity.obstacleIntersects.add((otherFirst + otherSecond) \/ 2);         continue;       }       List&lt;Vector2> tempBorderLines = [];       for(int i= - 1; i&lt;entity.getVerticesCount() - 1; i++){         if (!entity.isLoop &amp;&amp; i == -1) {           continue;         }         int tF, tS;         if (i == -1) {           tF = entity.getVerticesCount() - 1;         } else {           tF = i;         }         tS = i + 1;         Vector2 point = f_pointOfIntersect(entity.getPoint(tF), entity.getPoint(tS)             , otherFirst, otherSecond);          if (point != Vector2.zero()) {           tempBorderLines.add(point);         }       }       if (tempBorderLines.length == 2) {         entity.obstacleIntersects.add((tempBorderLines[0] + tempBorderLines[1]) \/ 2);       }else if(tempBorderLines.length == 1){         Vector2 absVec;         if(insidePoints.contains(tFirst)){           absVec = tempBorderLines[0] + otherFirst;         }else{           absVec = tempBorderLines[0] + otherSecond;         }         absVec \/= 2;         entity.obstacleIntersects.add(absVec);       }     } else {       for(int i=-1; i&lt;entity.getVerticesCount() - 1; i++){         if (!entity.isLoop &amp;&amp; i == -1) {           continue;         }         int tF, tS;         if (i == -1) {           tF = entity.getVerticesCount() - 1;           tS = i + 1;         }else{           tF = i;           tS = i + 1;         }         Vector2 tempPos = f_pointOfIntersect(entity.getPoint(tF), entity.getPoint(tS), otherFirst, otherSecond);         if(tempPos != Vector2.zero()){           if (entity.onComponentTypeCheck(other)) {             entity.onCollisionStart({otherFirst}, other);           }           if (other.onComponentTypeCheck(entity)) {             other.onCollisionStart({otherFirst}, entity);           }           return;         }       }     }   } }  \/\/return point of intersects of two lines from 4 points <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u0438 \u043c\u043e\u0438\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u0445 \u043f\u0440\u0438 100\u00a0\u0434\u0432\u0438\u0436\u0443\u0449\u0438\u0445\u0441\u044f \u0438 \u0435\u0449\u0451 20\u00a0\u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u0445 FPS \u043d\u0430\u00a0\u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435\u00a0\u2014 30. \u042d\u0442\u043e, \u044f \u0434\u0443\u043c\u0430\u044e, \u043f\u0440\u0435\u0434\u0435\u043b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439, \u043e\u0434\u043d\u0430\u043a\u043e \u0442\u0430\u043a\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0440\u0430\u0433\u043e\u0432 \u0432\u0440\u044f\u0434\u00a0\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u00a0\u0438\u0433\u0440\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/120\/9c0\/425\/1209c0425bd1c2363f569214e84030ee.jpg\" width=\"1280\" height=\"576\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/120\/9c0\/425\/1209c0425bd1c2363f569214e84030ee.jpg\" data-blurred=\"true\"\/><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/c5d\/2af\/fbc\/c5d2affbcc6557cf0d9508d16edee66d.jpg\" width=\"1280\" height=\"576\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c5d\/2af\/fbc\/c5d2affbcc6557cf0d9508d16edee66d.jpg\" data-blurred=\"true\"\/><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u043a\u043e\u043c\u0443-\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043c\u043e\u044f \u0441\u0442\u0430\u0442\u044c\u044f\u00a0\u2014 \u0431\u0443\u0434\u0443 \u0440\u0430\u0434.<\/p>\n<\/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\/781028\/\"> https:\/\/habr.com\/ru\/articles\/781028\/<\/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<h4>\u0425\u043e\u0442\u044f \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u0441\u044f \u0438\u043c\u0435\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u0432 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u043a \u0436\u0435 \u043e\u0449\u0443\u0449\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u043d\u043e<\/h4>\n<p>\u0411\u043e\u043b\u044c\u0448\u0435 \u0433\u043e\u0434\u0430 \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e \u0441\u0432\u043e\u044e \u0438\u0433\u0440\u0443 \u043d\u0430 \u0434\u0432\u0438\u0436\u043a\u0435 Flame, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 dart \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0432\u043e Flutter. \u0425\u043e\u0447\u0443 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0430\u043c \u043f\u0430\u0440\u0443 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u043a\u0430\u043a \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0441\u0451 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442.<\/p>\n<figure class=\"full-width\"><\/figure>\n<figure class=\"full-width\"><\/figure>\n<p>\u0412\u0441\u0451 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c: Tiled \u0438 \u0434\u0432\u0438\u0436\u043e\u043a Flame.<\/p>\n<p>\u0412\u043e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 gameDev\u2019\u0430, \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u2014 \u043f\u0443\u0442\u0438 \u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f. (\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043f\u043e\u043b\u043e\u0436\u0443 \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0438\u0437\u0443)<\/p>\n<h2>Tiled<\/h2>\n<p>\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u043a\u0430\u0440\u0442. \u0422\u0430\u043a\u0436\u0435 \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0438 \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0439 \u0441\u00a0\u043b\u044e\u0431\u044b\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438. \u042f \u0434\u0443\u043c\u0430\u044e, \u043e\u043d\u0430 \u0432\u0441\u0435\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u00a0\u2014 \u0441\u0443\u043f\u0435\u0440 \u0443\u0434\u043e\u0431\u043d\u0430\u044f, \u043f\u0440\u0435\u0442\u0435\u043d\u0437\u0438\u0439 \u043a\u00a0\u043d\u0435\u0439 \u043d\u0435\u0442.<\/p>\n<p>\u041a\u0430\u0440\u0442\u0430 \u043d\u0430\u00a0\u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0443\u00a0\u043c\u0435\u043d\u044f \u0442\u0430\u043a\u0430\u044f: 297*297\u00a0\u0442\u0430\u0439\u043b\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u0439\u043b \u2014 \u044d\u0442\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442 32*32\u00a0\u043f\u0438\u043a\u0441\u0435\u043b\u044f, \u0442.\u00a0\u0435. \u043c\u043e\u044f \u043a\u0430\u0440\u0442\u0430 9504\u00a0\u043f\u0438\u043a\u0441\u0435\u043b\u044f \u043d\u0430 9504. \u041f\u043b\u044e\u0441 \u043a\u00a0\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 14\u00a0\u0441\u043b\u043e\u0451\u0432 \u0442\u0430\u0439\u043b\u043e\u0432 \u0438 4\u00a0\u0441\u043b\u043e\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0418 \u0432\u043e\u0442 \u0442\u0443\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u00a0\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e.<\/p>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a\u0443\u044e \u0440\u0435\u043c\u0430\u0440\u043a\u0443: \u0432\u043e\u00a0Flame \u0435\u0441\u0442\u044c \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 Tiled \u043f\u0440\u044f\u043c\u043e \u0438\u0437\u00a0\u043a\u043e\u0440\u043e\u0431\u043a\u0438. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u0441\u0430\u043c \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0442\u044f\u0436\u0451\u043b\u044b\u043c. \u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u0434\u0430\u0436\u0435 \u043f\u0440\u043e\u0435\u043a\u0442 30*30 \u0442\u0430\u0439\u043b\u043e\u0432 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u043a\u043e\u043b\u043e 300 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441\u00a0\u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438, \u043a\u0430\u043a\u00a0\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f \u0432\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043d\u0430\u00a0\u0441\u0430\u0439\u0442\u0435 Flame, \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u0432\u044b\u0433\u043e\u0434\u043d\u043e. \u0442.\u00a0\u0435. \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u00a0Tiled \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043d\u0443\u043c\u0435\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u0440\u0442 \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0438\u0445 \u043f\u0440\u044f\u043c\u043e \u0432\u043e\u00a0\u0432\u0440\u0435\u043c\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043f\u043e\u0434\u0431\u0435\u0433\u0430\u0435\u0442\u0435 \u0431\u043b\u0438\u0437\u043a\u043e \u043a\u00a0\u043a\u0440\u0430\u044e \u044d\u043a\u0440\u0430\u043d\u0430. \u0418\u0433\u0440\u0430 \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u0437\u0430\u0444\u0440\u0438\u0437\u0438\u0442\u0441\u044f \u043d\u0430\u00a0\u043f\u043e\u043b\u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0438 \u0432\u044b, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u044d\u0442\u043e \u0443\u0432\u0438\u0434\u0438\u0442\u0435. \u042f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b \u044d\u0442\u043e, \u0438 \u0434\u0430\u0436\u0435 \u043f\u0440\u0438\u00a0\u0434\u0432\u0443\u0445 \u0441\u043b\u043e\u044f\u0445 \u0442\u0430\u0439\u043b\u043e\u0432 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u0430. \u0418\u0433\u0440\u0430\u0442\u044c \u0442\u0430\u043a \u0434\u043e\u043b\u0433\u043e \u0442\u043e\u0447\u043d\u043e \u043d\u0438\u043a\u0442\u043e \u043d\u0435\u00a0\u0437\u0430\u0445\u043e\u0447\u0435\u0442 \u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u044f\u0442\u044c \u043c\u0438\u043d\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0444\u0440\u0438\u0437\u0438\u0449\u0443\u044e\u0441\u044f \u043f\u043e\u0434\u0435\u043b\u043a\u0443.<\/p>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u043e\u0441\u043b\u0435 \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u043b\u0433\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f *.tmx\u00a0\u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e\u00a0\u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043a\u0430\u0440\u0442\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430\u00a0\u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043f\u043e\u043b\u043e\u0442\u043d\u0435 \u0432\u00a0Tiled. \u0410\u00a0\u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u00a0\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 Tiled \u043e\u0433\u0440\u043e\u043c\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0443 \u043d\u0430\u00a0\u0447\u0430\u0441\u0442\u0438 \u043d\u0435\u043b\u044c\u0437\u044f. \u0418 \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043c\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043c\u00a0\u2014 \u043d\u0435\u00a0\u0440\u0435\u0448\u0438\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0434\u043e\u043b\u0433\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043e\u0442\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c \u0435\u0451 \u0432 PNG \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b Tiled \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u043c Flame.images.load(&#8216;name&#8217;), \u043d\u043e \u0442\u0443\u0442 \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043d\u044e\u0430\u043d\u0441: \u0442\u0430\u043a\u0430\u044f \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u0430\u0440\u0442\u0430, \u043a\u0430\u043a 9500\u00a0\u043d\u0430 9500,\u00a0\u0431\u0443\u0434\u0435\u0442 \u0436\u0440\u0430\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 FPS \u043d\u0430\u00a0\u0430\u043d\u0434\u0440\u043e\u0438\u0434\u0435 \u043f\u0440\u0438\u00a0\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438. Flame \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 PositionComponent.<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u043a\u0430\u0436\u0443, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u0445\u043e\u043b\u0441\u0442\u0435. \u042d\u0442\u043e \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u043d\u044b\u0439 \u043a\u0443\u0441\u043e\u043a:<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0410 \u0432\u043e\u0442 \u044d\u0442\u043e \u0432\u0441\u044f \u043a\u0430\u0440\u0442\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c (\u043f\u0435\u0440\u0432\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0432\u043e\u043d \u0442\u0430\u043c \u0441\u0432\u0435\u0440\u0445\u0443 \u0441\u043b\u0435\u0432\u0430):<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0412\u043e\u0442 \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0435 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0438 \u0433\u0434\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u0432\u043e\u0435\u0439 \u0438\u0433\u0440\u0435 \u0438 \u043c\u043e\u0436\u0435\u0448\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043c\u0438\u0440.<\/p>\n<h2>\u0420\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 Tiled<\/h2>\n<p>\u041d\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u043f\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432\u0441\u0435\u0439 \u043a\u0430\u0440\u0442\u044b \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 *.tmx \u0432 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043c\u0435\u043b\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u0440\u0430\u0437\u0431\u0438\u0442\u044b\u0445 \u043f\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c \u0438 \u044f\u0447\u0435\u0439\u043a\u0430\u043c.<\/p>\n<p>\u042f \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u0437\u0434\u0435\u0441\u044c \u043d\u0430 <a href=\"https:\/\/habr.com\/ru\/articles\/682452\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u044e<\/a> \u043f\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0430\u0439\u043b\u043e\u0432 \u0432\u043e Flame. \u042d\u0442\u043e \u043d\u0435 \u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0434\u043e\u043b\u0433\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043a\u0430\u0440\u0442, \u043d\u043e \u0434\u0430\u0451\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u043a\u043b\u0430\u0441\u0441\u043e\u043c ImageBatchCompiler \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 flame_tiled_utils (<a href=\"https:\/\/pub.dev\/packages\/flame_tiled_utils\" rel=\"noopener noreferrer nofollow\">https:\/\/pub.dev\/packages\/flame_tiled_utils<\/a>).<\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043d\u0430 \u0445\u043e\u0434\u0443 \u0447\u0438\u0442\u0430\u0442\u044c *.tmx \u043e\u0447\u0435\u043d\u044c \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u043e, \u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0451 \u0432\u00a0\u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u00a0\u0445\u043e\u0434\u0443 \u0438\u0445 \u0447\u0438\u0442\u0430\u0442\u044c. \u0422\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0434\u0440\u043e\u0431\u0438\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443 \u043a\u0430\u0440\u0442\u044b \u043d\u0430\u00a0\u044f\u0447\u0435\u0439\u043a\u0438. \u0412\u00a0\u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043e\u043a ImageBatchCompiler \u043f\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u043a\u0430\u0440\u0442\u0443 \u0432\u00a0PNG \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432\u0430\u0448\u0438\u0445 \u044f\u0447\u0435\u0435\u043a \u0441\u00a0\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u0432\u0430\u0448\u0438\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0438 \u044f\u0447\u0435\u0435\u043a. \u042d\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433. \u041f\u043b\u044e\u0441 \u043a\u00a0\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043b \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u044b \u0442\u0430\u0439\u043b\u043e\u0432 \u043d\u0430\u00a0\u0442\u0435, \u0447\u0442\u043e\u00a0\u043d\u0430\u0434 \u0438\u0433\u0440\u043e\u043a\u043e\u043c \u0438 \u043d\u0430\u00a0\u0442\u0435 \u0447\u0442\u043e\u00a0\u043f\u043e\u0434\u00a0\u043d\u0438\u043c:<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u044f \u0432\u044b\u0434\u0435\u043b\u0438\u043b \u0442\u043e, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0434 \u0438\u0433\u0440\u043e\u043a\u043e\u043c. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043d\u0430\u00a0\u044f\u0447\u0435\u0439\u043a\u0443: \u0442\u0443, \u0447\u0442\u043e\u00a0\u043f\u043e\u0434\u00a0\u0438\u0433\u0440\u043e\u043a\u043e\u043c:<\/p>\n<figure class=\"\"><\/figure>\n<p>\u0418 \u0442\u0443, \u0447\u0442\u043e \u043d\u0430\u0434:<\/p>\n<figure class=\"\"><\/figure>\n<p>\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0445 \u043e\u0431\u044b\u0447\u043d\u044b\u043c Sprite \u0438 \u0434\u043b\u044f \u043d\u0438\u0436\u043d\u0438\u0445 \u0441\u0442\u0430\u0432\u0438\u0442\u044c priority = 0, \u0430 \u0434\u043b\u044f \u0432\u0435\u0440\u0445\u043d\u0438\u0445 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u2014 priority = max<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u043a\u0443\u0441\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430:<\/p>\n<figure class=\"full-width\"><\/figure>\n<figure class=\"full-width\"><\/figure>\n<p>\u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u0430\u043c \u043d\u0430\u0434\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0443\u0441\u0442\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u0436\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0435\u0451 \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 PNG. \u041f\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043e\u043d\u0430 \u043e\u0431\u0440\u0435\u0437\u0430\u0435\u0442\u0441\u044f \u0434\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432, \u0438 \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u0432\u0435\u0440\u0445\u0443\u0448\u043a\u0430 \u0434\u0435\u0440\u0435\u0432\u0430, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 32*32, \u0430 \u043a\u0443\u0434\u0430 \u0435\u0451 \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u043d\u0430 \u0438\u0433\u0440\u043e\u0432\u0443\u044e \u043a\u0430\u0440\u0442\u044b \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u044f\u0441\u043d\u043e. <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0434\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0430\u0439\u043b\u0430\u043c\u0438. \u041e\u043d\u0438 \u043f\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0442\u0430\u043a \u0436\u0435 \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b: \u0444\u0430\u0439\u043b\u044b \u041d\u0410\u0414 \u0438\u0433\u0440\u043e\u043a\u043e\u043c \u0438 \u0444\u0430\u0439\u043b\u044b \u041f\u041e\u0414 \u043d\u0438\u043c. \u042f \u0441\u0434\u0435\u043b\u0430\u043b \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u0444\u0430\u0439\u043b\u043e\u0432 *_high.anim \u0438 *_down.anim. \u0412\u043d\u0443\u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u043e\u0432\u00a0\u2014 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 xml, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0443\u0442\u044c \u043a\u00a0\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e, \u0432\u044b\u0441\u043e\u0442\u0443\/\u0448\u0438\u0440\u0438\u043d\u0443 \u0442\u0430\u0439\u043b\u0430, \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0435\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435, \u0435\u0441\u043b\u0438 \u0442\u0430\u043c \u043c\u043d\u043e\u0433\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439. \u041f\u0440\u0438 \u0438\u0433\u0440\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c SpriteAnimationComponent \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432. \u041a\u0430\u043a \u043d\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u043e &#8212; \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 SpriteAnimationComponent \u043d\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u0443\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0438 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043e\u043d\u0438 \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u043b\u043e\u044f\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 Tiled. \u042f \u043f\u043e\u0434\u0445\u043e\u0436\u0443 \u0437\u0434\u0435\u0441\u044c \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435: \u043f\u043e\u043e\u0447\u0435\u0440\u0451\u0434\u043d\u043e \u043f\u0440\u043e\u0445\u043e\u0436\u0443 \u043f\u043e \u0432\u0441\u0435\u043c \u044f\u0447\u0435\u0439\u043a\u0430\u043c \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u0432\u0441\u0435 \u043b\u0438\u043d\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0445\u043e\u0434\u044f\u0442 \u0432 \u044d\u0442\u0443 \u044f\u0447\u0435\u0439\u043a\u0443, \u0435\u0441\u043b\u0438 \u043b\u0438\u043d\u0438\u044f \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u044f\u0447\u0435\u0439\u043a\u0443\u00a0\u2014 \u043d\u0430\u0445\u043e\u0436\u0443 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u044d\u0442\u0443 \u0442\u043e\u0447\u043a\u0443 \u043a\u0430\u043a \u043d\u0443\u0436\u043d\u0443\u044e. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u044f \u043f\u043e\u043b\u0443\u0447\u0430\u044e \u043a\u0440\u0430\u0442\u043a\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u0441\u0435 \u0438\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u043f\u0440\u043e\u0447\u0435\u0435 \u0432 \u043c\u043e\u0451\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 *.objXml. \u042d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u044f \u0431\u0443\u0434\u0443 \u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0430 \u0445\u043e\u0434\u0443. \u041e\u043d\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 Tiled \u0438 \u0432\u0441\u0435 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0447\u0430\u043b\u0430. \u041e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0432 \u043c\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043b\u0438\u0441\u0442 \u0442\u043e\u0447\u0435\u043a \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f, \u0443\u043c\u043d\u043e\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0432\u0435\u043a\u0442\u043e\u0440 \u0438 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e &#8212; \u043c\u043e\u0436\u0435\u0442 \u043b\u0438 \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u0451 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e &#8212; \u0431\u041e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c (\u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u041e\u043b\u044c\u0448\u0430\u044f) \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439 \u0432 \u0438\u0433\u0440\u0435 &#8212; \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 PolygonHitbox, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043a, \u0438 \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043a\u0443\u0447\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u041d\u0430\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0434\u043e \u0437\u043d\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u0447\u0435\u043a \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u0438\u043d\u0438\u0438 \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043e\u043a\u0430\u0436\u0435\u043c\u0441\u044f \u0438\u0433\u0440\u043e\u043a\u043e\u043c \u0432 \u0431\u043b\u0438\u0437\u043e\u0441\u0442\u0438 \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<h2>Flame<\/h2>\n<p>\u041e\u0431\u0441\u0447\u0451\u0442 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439\u00a0\u2014 \u0441\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435 \u0438 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u0438\u0433\u0440\u0435. \u042d\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0438 \u0432 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0439 \u0432\u044b\u0448\u0435 <a href=\"https:\/\/habr.com\/ru\/articles\/682452\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a>. <\/p>\n<p>\u0412\u043e\u2011\u043f\u0435\u0440\u0432\u044b\u0445, \u0432\u0441\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0443\u00a0Flame \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0438\u0435. \u041d\u0435\u00a0\u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u044d\u0442\u043e \u0438\u00a0\u043a\u043b\u0430\u0441\u0441 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439 (ShapeHitbox). \u0422\u0430\u043c \u0438 \u0440\u0435\u0442\u0440\u0435\u0439\u0441\u0438\u043d\u0433 \u0441\u0440\u0430\u0437\u0443 \u0432\u0448\u0438\u0442, \u0438 \u043f\u0440\u043e\u0447\u0435\u0435, \u043f\u0440\u043e\u0447\u0435\u0435. <\/p>\n<p>\u0412\u043e\u2011\u0432\u0442\u043e\u0440\u044b\u0445, \u0432\u043e\u00a0Flame \u041d\u0415\u041b\u042c\u0417\u042f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443\u00a0\u043b\u0438\u043d\u0438\u044e \u043a\u0430\u043a\u00a0\u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f\u00a0\u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u0440 \u0432\u044b\u043f\u0443\u043a\u043b\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0442.\u0435 \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0438\u0437 \u0442\u0440\u0451\u0445 \u0442\u043e\u0447\u0435\u043a. <\/p>\n<p>\u0412\u2011\u0442\u0440\u0435\u0442\u044c\u0438\u0445, \u043d\u0435\u0442 \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043d\u0430\u00a0\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432, \u0442.\u00a0\u0435., \u043f\u043e\u043f\u0430\u0432 \u0432\u00a0\u0443\u0437\u043a\u0438\u0439 \u043f\u0435\u0440\u0435\u0443\u043b\u043e\u043a, \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u043e\u0442\u00a0\u0438\u0433\u0440\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u00a0\u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u0441\u043b\u0435\u0432\u0430, \u043f\u043e\u0442\u043e\u043c \u0441\u043f\u0440\u0430\u0432\u0430. \u0412\u0441\u0451 \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a\u00a0\u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a\u0438\u043c\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043d\u0435\u00a0\u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430.<\/p>\n<p>\u0412 \u0447\u0435\u0442\u0432\u0451\u0440\u0442\u044b\u0445: \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0432\u0430\u043c \u0434\u0430\u044e\u0442 \u043d\u0435 \u0442\u0435 \u0442\u043e\u0447\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u0430\u0448\u0435\u0433\u043e \u0442\u0435\u043b\u0430, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u043e\u0447\u043a\u0443 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0441 \u0432\u0430\u0448\u0435\u0439 \u043b\u0438\u043d\u0438\u0435\u0439. \u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 &#8212; \u0447\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u044f\u0441\u044c \u043d\u0430 \u044d\u0442\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043a\u0440\u043e\u043c\u0435 \u043a\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e \u0434\u0430 &#8212; \u043c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0441 \u0447\u0435\u043c-\u0442\u043e \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c. \u042d\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043d\u0435 \u043d\u0435\u0441\u0451\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430, \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f. \u0414\u043e\u043b\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u0447\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u043e\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0441\u043c\u0435\u043d\u0438\u043b \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0432 \u0441\u0435\u0431\u044f \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u043c\u043e\u0435\u0433\u043e \u0445\u0438\u0442\u0431\u043e\u043a\u0441\u0430.<\/p>\n<p>\u041c\u0438\u043d\u0443\u0441\u044b \u043e\u0442\u00a0\u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0432\u0435\u0449\u0438\u00a0\u2014 \u0432\u0441\u0435 \u0437\u0430\u0431\u043e\u0440\u044b \u0438\u043b\u0438\u00a0\u043b\u0438\u043d\u0438\u0438 \u0431\u0435\u0440\u0435\u0433\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0443\u0431\u0438\u043a\u0430\u043c\u0438, \u0447\u0442\u043e\u00a0\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u0447\u0435\u043a \u0438\u00a0\u043b\u0438\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439 \u0432\u00a0\u0434\u0432\u0430 \u0440\u0430\u0437\u0430! \u0418 \u0440\u043e\u0432\u043d\u043e \u0432\u043e\u00a0\u0441\u0442\u043e\u043b\u044c\u043a\u043e\u00a0\u0436\u0435 \u0440\u0430\u0437 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0441\u0447\u0451\u0442 \u043d\u0430\u00a0\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439. \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u041d\u0415\u0432\u044b\u043f\u0443\u043a\u043b\u044b\u0435 \u043c\u043d\u043e\u0433\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0440\u043e\u0431\u0438\u0442\u044c \u0437\u0430\u043a\u0443\u0442\u043a\u0438 \u0438 \u0434\u043e\u043c\u0430 \u0441\u00a0\u043e\u0434\u043d\u0438\u043c \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0432\u0445\u043e\u0434\u043e\u043c \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u043a\u043e\u043c\u043d\u0430\u0442\u044b, \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438 \u0442.\u0434. \u0438 \u0442.\u043f. \u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0430\u0447\u043d\u0451\u0442\u0443 \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 &#8212; \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0432\u0435 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u0432\u0430\u0441, \u0430 \u043d\u0435 \u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u0430\u0448\u0435\u0433\u043e \u0445\u0438\u0442\u0431\u043e\u043a\u0441\u0430. \u0412\u043e\u0442 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430: <\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0416\u0435\u043b\u0442\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u0434\u0430\u0441\u0442 \u043d\u0430\u043c Flame \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438. \u0417\u0435\u043b\u0451\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 &#8212; \u044d\u0442\u0430 \u0442\u043e\u0447\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0432\u043d\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0442\u0435\u043b\u0430. \u0424\u0438\u043e\u043b\u0435\u0442\u0430\u0432\u0430\u044f \u043b\u0438\u043d\u0438\u044f &#8212; \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0446\u0435\u043d\u0442\u0440\u0430, \u043d\u0430\u0448\u0435\u0439 \u0442\u043e\u0447\u043a\u0438 \u0438 \u043b\u044e\u0431\u043e\u0439 \u0433\u0440\u0430\u043d\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u0442\u0435\u043b\u0430. \u0427\u0451\u0440\u043d\u0430\u044f \u0441\u0442\u0440\u0435\u043b\u043a\u0430 &#8212; \u043d\u043e\u0440\u043c\u0430\u043b\u044c \u044d\u0442\u043e\u0439 \u0433\u0440\u0430\u043d\u0438, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f. \u042f \u0434\u0430\u044e \u0432 \u0441\u0432\u043e\u0451\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0435 \u0444\u0438\u043e\u043b\u0435\u0442\u043e\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 (\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0430 \u043e\u0442 \u0437\u0435\u043b\u0451\u043d\u043e\u0439 \u0438 \u0436\u0451\u043b\u0442\u043e\u0439), \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u0438 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u043a \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043a\u0443\u0434\u0430 \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f, \u043b\u0438\u0431\u043e \u0432\u043b\u0435\u0432\u043e, \u043b\u0438\u0431\u043e \u0432\u043d\u0438\u0437 \u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436 \u0437\u0430\u0441\u0442\u0440\u0435\u0432\u0430\u0435\u0442 \u0443 \u043a\u0440\u0430\u044f \u0441\u0442\u0435\u043d\u044b. \u0424\u0438\u043e\u043b\u0435\u0442\u043e\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u044e\u0442 \u044d\u0442\u043e \u0438 \u0442\u0430\u043a\u0438\u0445 \u0441\u043a\u043b\u0435\u0435\u043a \u043d\u0435\u0442.<\/p>\n<figure class=\"\">\n<div><figcaption>\u0416\u0435\u043b\u0442\u044b\u0435 &#8212; \u0447\u0442\u043e \u0434\u0430\u0441\u0442 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 Flame. \u041a\u0440\u0430\u0441\u043d\u0430\u044f &#8212; \u0447\u0442\u043e \u0434\u0430\u044e \u044f<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u0434\u0430\u043b\u0438\u043b \u0438\u0437 \u0438\u0433\u0440\u044b \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0438 \u0441\u043e\u0437\u0434\u0430\u043b \u0441\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u0447\u0435\u043a \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443. \u0410 \u0432 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043e\u0431\u0441\u0447\u0451\u0442\u0430 \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432\u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0434\u0432\u0438\u0433\u0430\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432\u0441\u0435\u0445 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439 \u0441 \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u044f\u043c\u0438, \u0430 \u043f\u043e\u0442\u043e\u043c \u0443\u0436\u0435 \u0432\u044b\u0437\u043e\u0432 \u0435\u0433\u043e \u043a\u043e\u043b\u0431\u044d\u043a\u0430 \u0441 \u0441\u043e\u0432\u043e\u043a\u0443\u043f\u043d\u043e\u0441\u0442\u044c\u044e \u044d\u0442\u0438\u0445 \u0442\u043e\u0447\u0435\u043a. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u043b\u0438 \u0432\u044b \u0443\u0434\u0430\u0440\u044f\u0435\u0442\u0435\u0441\u044c \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438 \u0441\u043f\u0440\u0430\u0432\u0430, \u0438 \u0441\u043b\u0435\u0432\u0430 \u2014 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0434\u0432\u0430: \u043b\u0438\u0431\u043e \u0432\u0432\u0435\u0440\u0445, \u043b\u0438\u0431\u043e \u0432\u043d\u0438\u0437.<\/p>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043b\u044e\u0441 \u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u043e \u044f\u0447\u0435\u0439\u043a\u0430\u043c &#8212; \u043e\u0442\u0441\u0435\u043a\u0430\u0442\u044c \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0434\u0440\u0443\u0433\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0435.<\/p>\n<p>\u0412\u00a0\u0438\u0442\u043e\u0433\u0435 \u044f \u043f\u0440\u0438\u0448\u0451\u043b \u043a\u00a0\u0442\u0430\u043a\u043e\u043c\u0443 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0443, \u0447\u0442\u043e \u0443\u00a0\u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u0430: \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0438 \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u00a0\u2014 \u043c\u0435\u0447 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430 \u0438 \u043f\u0440\u043e\u0447\u0435\u0435, \u0447\u0442\u043e\u00a0\u043d\u0435\u00a0\u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u00a0\u0432\u0441\u0435\u0445 \u0442\u043e\u0447\u043a\u0430\u0445 \u0441\u043e\u043f\u0440\u0438\u043a\u043e\u0441\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0438 \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u043b\u0431\u044d\u043a \u0441\u0440\u0430\u0437\u0443. \u0422\u043e\u0447\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u00a0\u043c\u0430\u0441\u0441\u0438\u0432, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f, \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\u043c\u0438 \u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443.<\/p>\n<h2>\u0418\u0442\u043e\u0433\u0438<\/h2>\n<p>Tiled\u00a0\u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0434\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0445 \u0438 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043a\u0430\u0440\u0442. \u041d\u043e\u00a0\u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u0441\u0451 \u044d\u0442\u043e \u043f\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u042d\u0442\u043e \u043d\u0435\u0434\u043e\u043b\u0433\u043e \u0438 \u043d\u0435\u0441\u0442\u0440\u0430\u0448\u043d\u043e, \u043d\u043e\u00a0\u043e\u0442\u00a0\u044d\u0442\u043e\u0433\u043e \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435\u00a0\u0434\u0435\u0442\u044c\u0441\u044f, \u043f\u0440\u0438\u00a0\u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u0430\u0440\u0442\u0435 \u0432\u0430\u043c \u043d\u0430\u0434\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0443\u0437\u043a\u0443 *.tmx. \u0414\u0430\u00a0\u0438 \u0447\u0435\u0441\u0442\u043d\u043e\u00a0\u2014 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0443 \u0440\u0430\u0437, \u0438 \u043a\u0430\u0440\u0442\u0430 \u043e\u0441\u043e\u0431\u043e \u0447\u0430\u0441\u0442\u043e \u043d\u0435\u00a0\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u0443\u0436 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u00a0\u043f\u043e\u043f\u0430\u0434\u0451\u0442 \u0432\u00a0google play.<\/p>\n<p>Flame\u00a0\u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u0441\u00a0\u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u0435\u0441\u0442\u044c \u0435\u0434\u0438\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u043a\u0430\u043c\u0435\u0440\u044b, \u043a\u044d\u0448\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f HUD \u043f\u0440\u044f\u043c\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 Flutter (class Joystick extends StatelessWidget => return Center(child: joystick())). \u041c\u0438\u043d\u0443\u0441\u044b\u00a0\u2014 \u0432\u0441\u0451, \u0447\u0442\u043e\u00a0\u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441\u00a0\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u041a\u00a0\u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u0440\u043e\u0449\u0435 \u0441\u0430\u043c\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u0435\u0441\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u043d\u043e\u00a0\u043f\u043e\u0432\u0435\u0440\u044c\u0442\u0435\u00a0\u2014 \u044d\u0442\u043e \u0432\u0441\u0451 \u0441\u0443\u043f\u0435\u0440 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e.<\/p>\n<h2>\u0410 \u0447\u0442\u043e \u0442\u0430\u043c \u0443<\/h><\/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-363114","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/363114","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=363114"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/363114\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=363114"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=363114"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=363114"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}