{"id":327820,"date":"2022-01-11T03:00:07","date_gmt":"2022-01-11T03:00:07","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=327820"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=327820","title":{"rendered":"<span>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 \u0432 \u0438\u0433\u0440\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\" class=\"article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" alt=\"\u0414\u0432\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0432 \u0438\u0433\u0440\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435\" title=\"\u0414\u0432\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0432 \u0438\u0433\u0440\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435\" height=\"auto\" data-src=\"https:\/\/habrastorage.org\/webt\/lo\/kj\/nn\/lokjnndpemzvp1vev84-89gbxsw.png\" data-width=\"auto\"\/><figcaption>\u0414\u0432\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0432 \u0438\u0433\u0440\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435<\/figcaption><\/figure>\n<p>\u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0438\u043c\u0438 \u0437\u043d\u0430\u043d\u0438\u044f\u043c\u0438 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043b\u044e\u0434\u044c\u043c\u0438. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u044d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u043e\u043c, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0442\u043e-\u0442\u043e, \u0447\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f. \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c, \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 \u043e\u043f\u044b\u0442\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0438\u0433\u0440\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u0434\u0432\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438.<\/p>\n<p>\u041c\u044b \u2013\u00a0\u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u044d\u043d\u0442\u0443\u0437\u0438\u0430\u0441\u0442\u043e\u0432 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0447\u0435\u043b\u043e\u0432\u0435\u043a. \u0417\u0430\u043d\u0438\u043c\u0430\u0435\u043c\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0438\u0433\u0440 \u043f\u043e\u0434 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u043e\u043a\u043e\u043b\u043e \u0441\u0435\u043c\u0438 \u043b\u0435\u0442 \u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u043e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u0440\u0435\u043c\u044f.<\/p>\n<p>\u041f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/github.com\/cocos2d\/cocos2d-x\" rel=\"noopener noreferrer nofollow\">cocos2d-x<\/a>. \u0418\u0437 \u043d\u0438\u0445 \u043e\u043a\u043e\u043b\u043e 90% \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u0430\u0440\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0434\u0432\u0438\u0436\u043a\u0430 &#8212; <a href=\"https:\/\/github.com\/cocos2d\/cocos2d-x\/tree\/cocos2d-x-2.2.6\" rel=\"noopener noreferrer nofollow\">cocos2d-x-2.2.6<\/a>. \u041f\u043e\u043b\u0442\u043e\u0440\u0430 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438, \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 &#8212; \u0444\u0430\u0439\u0442\u0438\u043d\u0433-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u0440 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u043d\u0430\u0441 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u0434 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u044b. \u0418 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0443\u0436\u0435 \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 <a href=\"https:\/\/github.com\/cocos2d\/cocos2d-x\/tree\/cocos2d-x-3.17.2\" rel=\"noopener noreferrer nofollow\">cocos2d-x-3.17.2<\/a>.<\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b \u0432 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u0445, \u0431\u0443\u0434\u044c \u0442\u043e \u0444\u0438\u043d\u0430\u043d\u0441\u044b \u0438\u043b\u0438 \u0432\u0440\u0435\u043c\u044f, \u043c\u044b \u043f\u0440\u0438\u043d\u044f\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0435 \u043d\u0430\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<p>\u041c\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0430\u0436\u043d\u0443\u044e \u0440\u043e\u043b\u044c \u0432 \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u0438 \u043b\u044e\u0434\u044c\u043c\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0438\u0433\u0440\u0430\u0435\u0442 \u043f\u043b\u0430\u0432\u043d\u043e\u0441\u0442\u044c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u0438\u044f\u0442\u043d\u0430\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0433\u0440\u043e\u0432\u044b\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0438, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0443\u0442 \u043f\u043b\u0430\u0449\u0438 \u0438 \u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u0443\u0434\u0435\u0442 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c mesh-\u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0412 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0441\u043a\u0435\u043b\u0435\u0442\u043d\u043e\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 CocoStudio 1.2.0.1. \u0425\u043e\u0442\u044f \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u0443\u0436\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438, \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u043e\u0447\u0435\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0438. \u0414\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u043d\u0430\u043c \u0437\u043d\u0430\u043a\u043e\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u044f\u0442\u0438 \u043b\u0435\u0442.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" alt=\"\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 CocoStudio\" title=\"\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 CocoStudio\" height=\"auto\" data-src=\"https:\/\/habrastorage.org\/webt\/9z\/ja\/v9\/9zjav9m0bynlww8xob7cg0khveq.gif\" data-width=\"auto\"\/><figcaption>\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 CocoStudio<\/figcaption><\/figure>\n<p>\u041d\u0430\u0439\u0442\u0438 \u0432 \u0441\u0435\u0442\u0438 \u0435\u0433\u043e \u0443\u0436\u0435 \u0432\u0440\u044f\u0434 \u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u043d\u043e \u0435\u0441\u043b\u0438 \u0443 \u043a\u043e\u0433\u043e-\u0442\u043e \u0435\u0441\u0442\u044c \u0436\u0435\u043b\u0430\u043d\u0438\u0435, \u043c\u043e\u0436\u043d\u043e \u0435\u0433\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0438\u0437 <a href=\"https:\/\/cloud.mail.ru\/public\/7uEy\/LH9cDpQju\" rel=\"noopener noreferrer nofollow\">\u043e\u0431\u043b\u0430\u043a\u0430<\/a>. \u041c\u044b \u0445\u0440\u0430\u043d\u0438\u043c \u0442\u0430\u043c \u0432\u0441\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432 \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435.<\/p>\n<p>\u0414\u043b\u044f \u0441\u0435\u0431\u044f \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438, \u0447\u0442\u043e \u0431\u043e\u0301\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043d\u0435\u043c \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043d\u0430\u0441 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442. \u0410 \u0434\u043b\u044f \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0431\u0443\u0434\u0443\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440.<\/p>\n<p>\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 <a href=\"http:\/\/ru.esotericsoftware.com\/\" rel=\"noopener noreferrer nofollow\">Spine<\/a> \u043c\u044b \u0431\u044b\u043b\u0438 \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c. \u0422\u0438\u043f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 Essential \u043f\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0443 \u043d\u0438\u0447\u0435\u043c \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u043d\u0430\u043c\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 CocoStudio. \u041f\u043e\u043a\u0443\u043f\u0430\u0442\u044c \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e Professional \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0434\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f mesh-\u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043d\u0430\u0441 \u043f\u043e\u043a\u0430 \u0434\u043e\u0440\u043e\u0433\u043e\u0435 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435.<\/p>\n<p>\u041f\u043e \u044d\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0432\u044b\u0431\u043e\u0440 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u043f\u0430\u043b \u043d\u0430 <a href=\"https:\/\/docs.egret.com\/dragonbones\/en\" rel=\"noopener noreferrer nofollow\">Dragonbones<\/a>.<\/p>\n<p>\u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0438\u0437 CocoStudio. \u041d\u0430\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.<\/p>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0443 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 <a href=\"https:\/\/github.com\/DragonBones\/DragonBonesCPP\" rel=\"noopener noreferrer nofollow\">DragonBonesC++ RunTime<\/a> \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 cocos2d-x.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" alt=\"\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 Dragonbones\" title=\"\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 Dragonbones\" height=\"auto\" data-src=\"https:\/\/habrastorage.org\/webt\/co\/kd\/ij\/cokdijbadc4_pqzdxybaik8bjqy.gif\" data-width=\"auto\"\/><figcaption>\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 Dragonbones<\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430, \u0434\u0435\u043b\u043e \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0437\u0430 \u043c\u0430\u043b\u044b\u043c. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0432 \u0438\u0433\u0440\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043c\u044b \u0434\u0443\u043c\u0430\u043b\u0438, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0442\u0440\u0435\u0445 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438, \u043d\u043e \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Spine, \u043a\u0430\u043a \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0447\u0443\u0442\u044c \u0432\u044b\u0448\u0435, \u043c\u044b \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0432 \u0438\u0433\u0440\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0440\u0430\u0437\u0443. \u041a\u0430\u043a \u0431\u044b \u0432\u044b \u043d\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0441\u0432\u043e\u0439 \u043a\u043e\u0434 \u0438 \u043d\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0435\u0439 \u043d\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u0447\u0442\u0438 \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b. \u042f \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043f\u0440\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u0432\u0435\u0449\u0430\u043c\u0438.<\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u0430\u0439\u0442\u0438\u043d\u0433\u0430, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0434\u043b\u044f \u043d\u0430\u0441 \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c \u0431\u044b\u043b\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u0435\u0439 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0439 (hitbox`\u043e\u0432 \u0438 hurtbox`\u043e\u0432) \u0440\u0430\u0437\u043d\u044b\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432. \u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u043c\u0435\u0442\u044c \u0442\u043e\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0435\u0439 \u0437\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u0440\u0438 \u0443\u0434\u0430\u0440\u0430\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" alt=\"\u0440\u0435\u0436\u0438\u043c debug\" title=\"\u0440\u0435\u0436\u0438\u043c debug\" height=\"auto\" data-src=\"https:\/\/habrastorage.org\/webt\/hy\/km\/yd\/hykmydzhgegliye2zu3gl6jw0iu.gif\" data-width=\"auto\"\/><figcaption>\u0440\u0435\u0436\u0438\u043c debug<\/figcaption><\/figure>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c \u0431\u044b\u043b\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0438 \u0432\u0440\u0435\u043c\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u0435\u0439 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438. \u0412\u0438\u0434\u0435\u0442\u044c \u044d\u0442\u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438\u0445 \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" alt=\"\u0440\u0435\u0436\u0438\u043c normal\" title=\"\u0440\u0435\u0436\u0438\u043c normal\" height=\"auto\" data-src=\"https:\/\/habrastorage.org\/webt\/sj\/to\/tp\/sjtotpkrsb5vclu2chx-w9w5z5i.gif\" data-width=\"auto\"\/><figcaption>\u0440\u0435\u0436\u0438\u043c normal<\/figcaption><\/figure>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u0432, \u044f \u0431\u044b\u043b \u0443\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e \u043b\u043e\u0433\u0438\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u0434\u0430 \u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430\u044f, \u043d\u043e \u0432\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u043f\u0440\u0438\u0448\u043b\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043c\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0448\u0438\u0431\u043b\u0438\u0441\u044c \u0432 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445.<\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435 \u0441 \u0447\u0435\u043c \u043c\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c &#8212; \u0440\u0430\u0437\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043b\u044f bone \u0443 \u044d\u0442\u0438\u0445 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 bone \u0434\u043b\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0432 CocoStudio \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u043c\u0438 &#171;\u043d\u0430 \u043b\u0435\u0442\u0443&#187; \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0433\u043e \u043d\u0430\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430.<\/p>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0430\u0440\u043c\u0430\u0442\u0443\u0440\u0443 CocoStudio void JCAnyArmature::setArmature(cocostudio::Armature *armature) { movementCCSJumpStart_ = armature->getAnimation()->getAnimationData()->getMovement(\"JUMPSTART\"); boneCCSHitbox_ = armature->getBone(\"hitbox\"); boneCCSHurtbox0_ = armature->getBone(\"hurtbox0\"); boneCCSHurtbox1_ = armature->getBone(\"hurtbox1\");  armature_ = armature; armatureType_ = JCArmatureEditor::Type::COCOSTUDIO;  if (!JCGlobalSetting::getInstance()->isTestFunctions())  { boneCCSHitbox_->setOpacity(0); boneCCSHurtbox0_->setOpacity(0); boneCCSHurtbox1_->setOpacity(0); } }<\/code><\/pre>\n<p>\u0422\u043e \u0434\u043b\u044f Dragonbones \u0442\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043d\u0435 \u043f\u043e\u0434\u043e\u0448\u0435\u043b. \u0412 \u044d\u0442\u043e\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c bone \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e, \u043c\u0435\u043d\u044f\u043b\u0438 \u043c\u044b \u0435\u0435 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0438\u043b\u0438 \u043d\u0435\u0442. \u041f\u043e \u044d\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u044f\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u0435\u0439 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u0432 \u043f\u0443\u0441\u0442\u044b\u043c\u0438, \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0432 \u0443\u0440\u043e\u0432\u043d\u0435.<\/p>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0430\u0440\u043c\u0430\u0442\u0443\u0440\u0443 Dragonbones void JCAnyArmature::setArmature(dragonBones::CCArmatureDisplay *armature) { movementDGBJumpStart_ = armature->getAnimation()->getAnimations().find(\"JUMPSTART\")->second; boneDGBHitbox_ = armature->getArmature()->getBone(\"hitbox\"); boneDGBHurtbox0_ = armature->getArmature()->getBone(\"hurtbox0\"); boneDGBHurtbox1_ = armature->getArmature()->getBone(\"hurtbox1\");  slotDGBHitbox_ = armature->getArmature()->getSlot(\"hitbox\"); slotDGBHurtbox0_ = armature->getArmature()->getSlot(\"hurtbox0\"); slotDGBHurtbox1_ = armature->getArmature()->getSlot(\"hurtbox1\");  armature_ = armature; armatureType_ = JCArmatureEditor::Type::DRAGONBONE;  if (!JCGlobalSetting::getInstance()->isTestFunctions()) { dragonBones::CCFactory::getFactory()->replaceSlotDisplay(\"EmptyBox\", \"emptybox\", \"emptybox\", \"emptybox\", slotDGBHitbox_); dragonBones::CCFactory::getFactory()->replaceSlotDisplay(\"EmptyBox\", \"emptybox\", \"emptybox\", \"emptybox\", slotDGBHurtbox0_); dragonBones::CCFactory::getFactory()->replaceSlotDisplay(\"EmptyBox\", \"emptybox\", \"emptybox\", \"emptybox\", slotDGBHurtbox1_); } }<\/code><\/pre>\n<p>\u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e, \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Dragonbones \u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u0440\u043c\u0430\u0442\u0443\u0440\u044b \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0438\u0437 \u043f\u0443\u043b\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u0438\u0437 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u043d\u043e\u0434\u044b void JCAnyArmature::removeArmatureFromParent() { switch (armatureType_) { case JCArmatureEditor::Type::COCOSTUDIO: armature_->removeFromParent(); break; case JCArmatureEditor::Type::DRAGONBONE: static_cast&lt;dragonBones::CCArmatureDisplay*>(armature_)->getEventDispatcher()->setEnabled(false); armature_->removeFromParent(); static_cast&lt;dragonBones::CCArmatureDisplay*>(armature_)->dispose(); break; default: armature_->removeFromParent(); break; } }<\/code><\/pre>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u043e\u0431\u043e\u0438\u0445 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u043e\u0436\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f.<\/p>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0443\u0441\u0442\u0430\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043d\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 void JCAnyArmature::setAnimationEventCallFunc(std::function&lt;void(cocostudio::MovementEventType movementType, const std::string &amp;movementID)> listener) { switch (armatureType_) { case JCArmatureEditor::Type::COCOSTUDIO: static_cast&lt;cocostudio::Armature*>(armature_)->getAnimation()->setMovementEventCallFunc(CC_CALLBACK_0(JCAnyArmature::_onCCSAnimationEvent, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); break; case JCArmatureEditor::Type::DRAGONBONE: static_cast&lt;dragonBones::CCArmatureDisplay*>(armature_)->getEventDispatcher()->setEnabled(true); static_cast&lt;dragonBones::CCArmatureDisplay*>(armature_)->getEventDispatcher()->addCustomEventListener(dragonBones::EventObject::COMPLETE, std::bind(&amp;JCAnyArmature::_onDGBAnimationEvent, this, std::placeholders::_1)); static_cast&lt;dragonBones::CCArmatureDisplay*>(armature_)->getEventDispatcher()->addCustomEventListener(dragonBones::EventObject::LOOP_COMPLETE, std::bind(&amp;JCAnyArmature::_onDGBAnimationEventLoop, this, std::placeholders::_1)); break; default: static_cast&lt;cocostudio::Armature*>(armature_)->getAnimation()->setMovementEventCallFunc(CC_CALLBACK_0(JCAnyArmature::_onCCSAnimationEvent, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); break; } eventAnimation_ = listener; }<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 CocoStudio void JCAnyArmature::_onCCSAnimationEvent(cocostudio::Armature *, cocostudio::MovementEventType movementType, const std::string&amp; movementID) { this->_onAnimationEvent(movementType, movementID); }<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 Dragonbones void JCAnyArmature::_onDGBAnimationEvent(cocos2d::EventCustom *event) { const auto eventObject = static_cast&lt;dragonBones::EventObject*>(event->getUserData()); this->_onAnimationEvent(cocostudio::MovementEventType::COMPLETE, eventObject->animationState->name); }<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043a\u0440\u0443\u0433\u043e\u0432\u043e\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 Dragonbones void JCAnyArmature::_onDGBAnimationEventLoop(cocos2d::EventCustom *event) { const auto eventObject = static_cast&lt;dragonBones::EventObject*>(event->getUserData()); this->_onAnimationEvent(cocostudio::MovementEventType::LOOP_COMPLETE, eventObject->animationState->name); }<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0438 \u0434\u0435\u0440\u0433\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 void JCAnyArmature::_onAnimationEvent(cocostudio::MovementEventType movementType, const std::string &amp;movementID) { if (eventAnimation_) eventAnimation_(movementType, movementID); }<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u0438 \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0442\u043e\u0447\u0435\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0443 CocoStudio \u0438 Dragonbones, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0443\u0447\u0435\u0441\u0442\u044c.<\/p>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0443\u0441\u0442\u0430\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043d\u0430 \u0442\u043e\u0447\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 void JCAnyArmature::setFrameEventCallFunc(std::function&lt;void(const std::string &amp;eventName, const std::string &amp;movementID)> listener) { switch (armatureType_) { case JCArmatureEditor::Type::COCOSTUDIO: static_cast&lt;cocostudio::Armature*>(armature_)->getAnimation()->setFrameEventCallFunc(CC_CALLBACK_0(JCAnyArmature::_onCCSFrameEvent, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); break; case JCArmatureEditor::Type::DRAGONBONE: static_cast&lt;dragonBones::CCArmatureDisplay*>(armature_)->getEventDispatcher()->setEnabled(true); static_cast&lt;dragonBones::CCArmatureDisplay*>(armature_)->getEventDispatcher()->addCustomEventListener(dragonBones::EventObject::FRAME_EVENT, std::bind(&amp;JCAnyArmature::_onDGBFrameEvent, this, std::placeholders::_1)); break; default: static_cast&lt;cocostudio::Armature*>(armature_)->getAnimation()->setFrameEventCallFunc(CC_CALLBACK_0(JCAnyArmature::_onCCSFrameEvent, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); break; } eventFrame_ = listener; }<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0442\u043e\u0447\u0435\u043a \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 CocoStudio void JCAnyArmature::_onCCSFrameEvent(cocostudio::Bone *, const std::string &amp;eventName, int, int) { this->_onFrameEvent(eventName); }<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0442\u043e\u0447\u0435\u043a \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 Dragonbones void JCAnyArmature::_onDGBFrameEvent(cocos2d::EventCustom* event) { const auto eventObject = (dragonBones::EventObject*)event->getUserData(); this->_onFrameEvent(eventObject->name); }<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0442\u043e\u0447\u0435\u043a \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0438 \u0434\u0435\u0440\u0433\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 void JCAnyArmature::_onFrameEvent(conststd::string&amp;eventName) { if (eventFrame_) eventFrame_(eventName, this->getCurrentMovementID()); }<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0432 \u043d\u0430\u0448\u0435\u0439 \u0438\u0433\u0440\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0433\u043e, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u043e. \u0422.\u0435. \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043a\u0440\u043e\u043a\u043e\u0434\u0438\u043b &#8212; Crocco, \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0432 CocoStudio, \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u0432 \u043b\u044c\u0432\u0430 &#8212; King`a, \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0432 Dragonbones.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" alt=\"\u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430\" title=\"\u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430\" height=\"auto\" data-src=\"https:\/\/habrastorage.org\/webt\/lq\/_b\/w0\/lq_bw0td14sqovrxogcrpoize3m.gif\" data-width=\"auto\"\/><figcaption>\u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430<\/figcaption><\/figure>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0442\u043e\u0433\u043e, \u043d\u0430\u043d\u043e\u0441\u0438\u0442 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436 \u0443\u0434\u0430\u0440, \u043e\u0442\u043b\u0435\u0442\u0430\u0435\u0442 \u0432 \u043e\u0433\u043b\u0443\u0448\u0435\u043d\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0434\u0443\u043c\u0430\u0432\u0448\u0438\u0441\u044c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0438 \u043a\u0430\u0434\u0440 \u044d\u0442\u043e\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438.<\/p>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u0444\u0440\u0435\u0439\u043c \u0432\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438  void JCAnyArmature::rememberAnimationFrame() { switch (armatureType_) { case JCArmatureEditor::Type::COCOSTUDIO: currFrameIndex_ = static_cast&lt;cocostudio::Armature*>(armature_)->getAnimation()->getCurrentFrameIndex(); break; case JCArmatureEditor::Type::DRAGONBONE: { dragonBones::AnimationState *animationState = static_cast&lt;dragonBones::CCArmatureDisplay*>(armature_)->getAnimation()->getLastAnimationState(); const dragonBones::AnimationData *animationData = animationState->getAnimationData(); currFrameIndex_ = animationData->frameCount * animationState->getCurrentTime() \/ animationData->duration; } break; default: currFrameIndex_ = static_cast&lt;cocostudio::Armature*>(armature_)->getAnimation()->getCurrentFrameIndex(); break; } } <\/code><\/pre>\n<p>\u0410 \u0434\u0430\u043b\u0435\u0435 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430, \u043f\u043e\u0441\u043b\u0435 \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0437\u0430\u043f\u043e\u043c\u043d\u0435\u043d\u043d\u0443\u044e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u0441 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430.<\/p>\n<pre><code class=\"cpp\">\/\/ \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0437\u0430\u043f\u043e\u043c\u043d\u0435\u043d\u043d\u0443\u044e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 void JCAnyArmature::playAnimationRemembered() { int currFrameIndex = currFrameIndex_; switch (armatureType_) { case JCArmatureEditor::Type::COCOSTUDIO: static_cast&lt;cocostudio::Armature*>(armature_)->getAnimation()->play(currentMovementID_); static_cast&lt;cocostudio::Armature*>(armature_)->getAnimation()->gotoAndPlay(currFrameIndex); break; case JCArmatureEditor::Type::DRAGONBONE: static_cast&lt;dragonBones::CCArmatureDisplay*>(armature_)->getAnimation()->gotoAndPlayByFrame(currentMovementID_, currFrameIndex_); break; default: static_cast&lt;cocostudio::Armature*>(armature_)->getAnimation()->play(currentMovementID_); static_cast&lt;cocostudio::Armature*>(armature_)->getAnimation()->gotoAndPlay(currFrameIndex); break; } }<\/code><\/pre>\n<p>\u0418, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432 \u0438\u0433\u0440\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u0435\u0439 hitbox`\u043e\u0432 \u0438 hurtbox`\u043e\u0432. \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439 \u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f\u043c\u0438, \u0438\u043c\u0435\u044e\u0449\u0438\u0445 \u0440\u0430\u0437\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u0443\u0440\u043e\u0432\u043d\u044f \u043c\u043e\u043c\u0435\u043d\u0442 \u0443\u0434\u0430\u0440\u0430.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" alt=\"\u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u0435\u0439 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439\" title=\"\u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u0435\u0439 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439\" height=\"auto\" data-src=\"https:\/\/habrastorage.org\/webt\/xt\/ym\/zx\/xtymzxjdv0n-zkcgl1oa8ncp04i.png\" data-width=\"auto\"\/><figcaption>\u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u0435\u0439 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439<\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u0435\u0439 \u043f\u0440\u0438 \u0443\u0434\u0430\u0440\u0430\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439 \u0434\u0440\u0443\u0433 \u043f\u043e \u0434\u0440\u0443\u0433\u0443.<\/p>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0443\u0434\u0430\u0440\u0430 \u0441 \u043e\u0431\u043b\u0430\u0441\u0442\u044c\u044e \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u0430 bool JCAnyArmature::isIntersectsRectBone(const Rect &amp;rect, int boneTag) { switch (armatureType_) { case JCArmatureEditor::Type::COCOSTUDIO: return this->_isCCSIntersectsRectBone(rect, boneTag); break; case JCArmatureEditor::Type::DRAGONBONE: return this->_isDGBIntersectsRectBone(rect, boneTag); break; default: return this->_isCCSIntersectsRectBone(rect, boneTag); break; } }<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0443\u0434\u0430\u0440\u0430 \u0441 \u043e\u0431\u043b\u0430\u0441\u0442\u044c\u044e \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u0430 CocoStudio bool JCAnyArmature::_isCCSIntersectsRectBone(const Rect &amp;rect, int boneTag) { bool result = false; cocostudio::Bone *bone = nullptr;  switch (boneTag) { case HertboxTag::HURTBOX0: bone = boneCCSHurtbox0_; break; case HertboxTag::HURTBOX1: bone = boneCCSHurtbox1_; break; default: bone = boneCCSHurtbox0_; break; }  if (!bone) return result;  Node *node = bone->getDisplayRenderNode();  if (node) { Node *parallaxNode = armature_->getParent()->getParent(); float scale = fabs(armature_->getScaleX()) * parallaxNode->getScale();  Vec2 pos = node->convertToWorldSpaceAR(Vec2(0, 0)); Size size = node->getContentSize(); cocostudio::BaseData *baseData = bone->getWorldInfo(); size.width *= fabs(baseData->scaleX) * scale; size.height *= fabs(baseData->scaleY) * scale;  Rect rectBone = Rect(pos - (size \/ 2), size); if (rectBone.intersectsRect(rect))  { result = true; this->_calculateIntersectPoint(rectBone, rect); } }  return result; }<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0443\u0434\u0430\u0440\u0430 \u0441 \u043e\u0431\u043b\u0430\u0441\u0442\u044c\u044e \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u0430 Dragonbones bool JCAnyArmature::_isDGBIntersectsRectBone(const Rect &amp;rect, int boneTag) { bool result = false; dragonBones::Bone *bone = nullptr; dragonBones::Slot *slot = nullptr;  switch (boneTag) { case HertboxTag::HURTBOX0: bone = boneDGBHurtbox0_; slot = slotDGBHurtbox0_; break; case HertboxTag::HURTBOX1: bone = boneDGBHurtbox1_; slot = slotDGBHurtbox1_; break;  default: bone = boneDGBHurtbox0_; slot = slotDGBHurtbox0_; break; }  if (slot->getDisplay()) { int sign = (armature_->getScaleX() > 0) - (armature_->getScaleX() &lt; 0); dragonBones::Transform *transform = bone->getGlobal(); float scale = fabs(armature_->getScaleX()); Vec2 pos = Vec2(armature_->getPositionX() + transform->x * scale * sign, armature_->getPositionY() + transform->y * scale);  Node *parallaxNode = armature_->getParent()->getParent(); float parallaxScale = parallaxNode->getScale(); scale *= parallaxScale; pos *= parallaxScale; pos += parallaxNode->getPosition();  dragonBones::ImageDisplayData *imageDisplayData = static_cast&lt;dragonBones::ImageDisplayData*>(slot->getRawDisplayDatas()->at(0)); dragonBones::Rectangle* region = imageDisplayData->getTexture()->getRegion();  Size size = Size(region->width, region->height); size.width *= fabs(transform->scaleX) *scale; size.height *= fabs(transform->scaleY) *scale;  Rect rectBone = Rect(pos - (size \/ 2), size); if (rectBone.intersectsRect(rect)) { result = true; this->_calculateIntersectPoint(rectBone, rect); } }  return result; }<\/code><\/pre>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u043d\u0430\u0448\u0435\u0439 \u0438\u0433\u0440\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u0438 \u0434\u043b\u044f \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0442\u0430 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0443\u0447\u0430\u0441\u0442\u043a\u0438 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0441\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044f \u043a \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043a\u043e\u0441\u0442\u0435\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" alt=\"Engine\" title=\"Engine\" height=\"auto\" data-src=\"https:\/\/habrastorage.org\/webt\/6c\/um\/t5\/6cumt5wd1oy_hmigd6kcp1pltck.png\" data-width=\"auto\"\/><figcaption>Engine<\/figcaption><\/figure>\n<p>\u0412 CocoStudio \u0432\u043e\u043f\u0440\u043e\u0441 \u0440\u0435\u0448\u0430\u043b\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430\u043c \u0434\u0430\u0432\u043d\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u0430. \u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f Dragonbones, \u0432 <a href=\"https:\/\/github.com\/DragonBones\/Demos\" rel=\"noopener noreferrer nofollow\">\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445<\/a> \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043a\u0430\u043a \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0441\u043b\u043e\u0442. \u041d\u043e \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c void JCAnyArmature::createEngine(JCEngineInfo &amp;engineInfo, PhysicsBody *physicsBody) { if (engineInfo.isNull()) return;  JCEngine *engine = JCEngine::create(engineInfo.fileId, armatureType_); switch (armatureType_) { case JCArmatureEditor::Type::COCOSTUDIO: this->_addCCSEngine(engine, engineInfo); break; case JCArmatureEditor::Type::DRAGONBONE: this->_addDGBEngine(engine, engineInfo); break; default: this->_addCCSEngine(engine, engineInfo); break; }  engine->setPhysicsBody(physicsBody); }<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c \u0434\u043b\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 CocoStudio void JCAnyArmature::_addCCSEngine(JCEngine *engine, const JCEngineInfo &amp;engineInfo) { cocostudio::Armature *armature = static_cast&lt;cocostudio::Armature*>(engine->getArmature()); cocostudio::Bone *boneEngine = cocostudio::Bone::create(\"engine\"); boneEngine->addDisplay(armature, 0); boneEngine->changeDisplayWithIndex(0, true); boneEngine->setLocalZOrder(engineInfo.zOrder); boneEngine->setPosition(engineInfo.shift); boneEngine->setRotation(engineInfo.angle); boneEngine->setScale(engineInfo.scale); boneEngine->setVisible(true); boneEngine->setIgnoreMovementBoneData(true); static_cast&lt;cocostudio::Armature*>(armature_)->addBone(boneEngine, \"body\"); }<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c \u0434\u043b\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 Dragonbones void JCAnyArmature::_addDGBEngine(JCEngine *engine, const JCEngineInfo &amp;engineInfo) { dragonBones::CCArmatureDisplay* armatureEngine = static_cast&lt;dragonBones::CCArmatureDisplay*>(engine->getArmature()); dragonBones::SlotData *slotData = dragonBones::BaseObject::borrowObject&lt;dragonBones::SlotData>(); slotData->name = \"engine\"; slotData->color = dragonBones::SlotData::createColor(); slotData->zOrder = engineInfo.zOrder; slotData->parent = static_cast&lt;dragonBones::CCArmatureDisplay*>(armature_)->getArmature()->getArmatureData()->getBone(\"body\");  dragonBones::CCSlot *slotEngine = dragonBones::BaseObject::borrowObject&lt;dragonBones::CCSlot>(); dragonBones::DBCCSprite *rawDisplay = dragonBones::DBCCSprite::create();  rawDisplay->setCascadeOpacityEnabled(true); rawDisplay->setCascadeColorEnabled(true); rawDisplay->setAnchorPoint(cocos2d::Vec2::ZERO); rawDisplay->setLocalZOrder(slotData->zOrder);  slotEngine->init(slotData, static_cast&lt;dragonBones::CCArmatureDisplay*>(armature_)->getArmature(), rawDisplay, rawDisplay); slotEngine->offset.x = engineInfo.shift.x; slotEngine->offset.y = -engineInfo.shift.y; slotEngine->offset.rotation = CC_DEGREES_TO_RADIANS(engineInfo.angle); slotEngine->offset.scaleX = engineInfo.scale; slotEngine->offset.scaleY = engineInfo.scale; slotEngine->setChildArmature(armatureEngine->getArmature()); }<\/code><\/pre>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b, \u043c\u044b \u0432\u0441\u0435 \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u043c \u0434\u043b\u044f \u043d\u0430\u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c. <\/p>\n<p>\u041d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u0438\u0433\u0440 \u0443\u0445\u043e\u0434\u0438\u0442 \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0443 \u043d\u0430\u0441 \u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442. \u041d\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u0430\u043a\u043e\u043c\u0443 \u043f\u043e\u0434\u0445\u043e\u0434\u0443, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 Dragonbones, \u043d\u0435 \u0441\u043d\u0438\u0436\u0430\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0430\u0448\u0443 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>\u0411\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e, \u043d\u0435 \u0432\u0441\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c.<\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438, \u0447\u0442\u043e \u0432\u0440\u0435\u043c\u044f, \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0435 \u043c\u043d\u043e\u0439 \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430, \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u043d\u0430 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 Dragonbones \u0441 \u043d\u0443\u043b\u044f \u0438 \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435. <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 (\u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430, \u043e\u0440\u0443\u0436\u0438\u044f, \u0431\u043e\u043d\u0443\u0441\u0430 \u0438\u043b\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b) \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0437\u044f\u0442\u044c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0438\u0437 \u0432\u044b\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0439 \u043d\u0430\u043c\u0438 \u0440\u0430\u043d\u0435\u0435 \u0438\u0433\u0440\u044b. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430, \u0430 \u0434\u0430\u043b\u0435\u0435 \u0443\u0436\u0435 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u043e\u0432\u044b\u043c. \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043e\u0442\u043a\u0430\u0437 \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f CocoStudio \u043f\u043e\u0432\u043b\u0435\u043a \u0431\u044b \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 \u0438\u0437 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0443 \u043d\u0430\u0441 \u0431\u0430\u0437\u044b, \u0432 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 Dragonbones.<\/p>\n<p>\u041d\u0435 \u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0432 \u0420\u043e\u0441\u0441\u0438\u0438 \u0438 \u0441\u0442\u0440\u0430\u043d\u0430\u0445 \u0421\u041d\u0413 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438\u0433\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 cocos2d-x, \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u043e, \u044f \u0432\u0441\u0435 \u0436\u0435 \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u043c \u0435\u0433\u043e \u0432 \u0440\u0430\u0431\u043e\u0442\u0435, \u0438\u043b\u0438 \u0442\u0435\u043c, \u043a\u0442\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043d\u0430\u0447\u0430\u0442\u044c \u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>\u042f \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u043e \u043e\u0442\u043d\u043e\u0448\u0443\u0441\u044c \u043a \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043a\u0440\u0438\u0442\u0438\u043a\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0441\u0432\u043e\u0435\u0433\u043e \u0442\u0440\u0443\u0434\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0441\u043b\u0443\u0448\u0430\u044e\u0441\u044c \u0441\u043e\u0432\u0435\u0442\u0430\u043c \u0438 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f\u043c.<\/p>\n<p>\u041d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0435\u0449\u0435 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043d\u0435 \u0441\u0442\u0430\u043b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u041e\u043d\u0438 \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u043f\u043e\u0434 \u0442\u0435\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0432 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043f\u0440\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043d\u0430 cocos2d-x, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c, \u044f \u043c\u043e\u0433\u0443 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439. \u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0443 \u043d\u0430\u0441 \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u043e\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>\u0412 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0438\u0433\u0440\u044b \u0432 Steam. \u0412 \u0440\u043e\u043b\u0438\u043a\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0433\u0435\u0439\u043c\u043f\u043b\u0435\u0439 \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p><a href=\"https:\/\/store.steampowered.com\/app\/1706740\/Jaws__Claws\" rel=\"noopener noreferrer nofollow\">https:\/\/store.steampowered.com\/app\/1706740\/Jaws__Claws<\/a><\/p>\n<\/div>\n<\/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\/post\/600057\/\"> https:\/\/habr.com\/ru\/post\/600057\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\" class=\"article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"\"><figcaption>\u0414\u0432\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0432 \u0438\u0433\u0440\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435<\/figcaption><\/figure>\n<p>\u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0438\u043c\u0438 \u0437\u043d\u0430\u043d\u0438\u044f\u043c\u0438 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043b\u044e\u0434\u044c\u043c\u0438. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u044d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u043e\u043c, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0442\u043e-\u0442\u043e, \u0447\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f. \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c, \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 \u043e\u043f\u044b\u0442\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0438\u0433\u0440\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u0434\u0432\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438.<\/p>\n<p>\u041c\u044b \u2013\u00a0\u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u044d\u043d\u0442\u0443\u0437\u0438\u0430\u0441\u0442\u043e\u0432 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0447\u0435\u043b\u043e\u0432\u0435\u043a. \u0417\u0430\u043d\u0438\u043c\u0430\u0435\u043c\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0438\u0433\u0440 \u043f\u043e\u0434 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u043e\u043a\u043e\u043b\u043e \u0441\u0435\u043c\u0438 \u043b\u0435\u0442 \u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u043e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u0440\u0435\u043c\u044f.<\/p>\n<p>\u041f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/github.com\/cocos2d\/cocos2d-x\" rel=\"noopener noreferrer nofollow\">cocos2d-x<\/a>. \u0418\u0437 \u043d\u0438\u0445 \u043e\u043a\u043e\u043b\u043e 90% \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u0430\u0440\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0434\u0432\u0438\u0436\u043a\u0430 &#8212; <a href=\"https:\/\/github.com\/cocos2d\/cocos2d-x\/tree\/cocos2d-x-2.2.6\" rel=\"noopener noreferrer nofollow\">cocos2d-x-2.2.6<\/a>. \u041f\u043e\u043b\u0442\u043e\u0440\u0430 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438, \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 &#8212; \u0444\u0430\u0439\u0442\u0438\u043d\u0433-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u0440 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u043d\u0430\u0441 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u0434 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u044b. \u0418 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0443\u0436\u0435 \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 <a href=\"https:\/\/github.com\/cocos2d\/cocos2d-x\/tree\/cocos2d-x-3.17.2\" rel=\"noopener noreferrer nofollow\">cocos2d-x-3.17.2<\/a>.<\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b \u0432 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u0445, \u0431\u0443\u0434\u044c \u0442\u043e \u0444\u0438\u043d\u0430\u043d\u0441\u044b \u0438\u043b\u0438 \u0432\u0440\u0435\u043c\u044f, \u043c\u044b \u043f\u0440\u0438\u043d\u044f\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0435 \u043d\u0430\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<p>\u041c\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0430\u0436\u043d\u0443\u044e \u0440\u043e\u043b\u044c \u0432 \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u0438 \u043b\u044e\u0434\u044c\u043c\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0438\u0433\u0440\u0430\u0435\u0442 \u043f\u043b\u0430\u0432\u043d\u043e\u0441\u0442\u044c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u0438\u044f\u0442\u043d\u0430\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0433\u0440\u043e\u0432\u044b\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0438, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0443\u0442 \u043f\u043b\u0430\u0449\u0438 \u0438 \u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u0443\u0434\u0435\u0442 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c mesh-\u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0412 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0441\u043a\u0435\u043b\u0435\u0442\u043d\u043e\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 CocoStudio 1.2.0.1. \u0425\u043e\u0442\u044f \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u0443\u0436\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438, \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u043e\u0447\u0435\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0438. \u0414\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u043d\u0430\u043c \u0437\u043d\u0430\u043a\u043e\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u044f\u0442\u0438 \u043b\u0435\u0442.<\/p>\n<figure class=\"\"><figcaption>\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 CocoStudio<\/figcaption><\/figure>\n<p>\u041d\u0430\u0439\u0442\u0438 \u0432 \u0441\u0435\u0442\u0438 \u0435\u0433\u043e \u0443\u0436\u0435 \u0432\u0440\u044f\u0434 \u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u043d\u043e \u0435\u0441\u043b\u0438 \u0443 \u043a\u043e\u0433\u043e-\u0442\u043e \u0435\u0441\u0442\u044c \u0436\u0435\u043b\u0430\u043d\u0438\u0435, \u043c\u043e\u0436\u043d\u043e \u0435\u0433\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0438\u0437 <a href=\"https:\/\/cloud.mail.ru\/public\/7uEy\/LH9cDpQju\" rel=\"noopener noreferrer nofollow\">\u043e\u0431\u043b\u0430\u043a\u0430<\/a>. \u041c\u044b \u0445\u0440\u0430\u043d\u0438\u043c \u0442\u0430\u043c \u0432\u0441\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432 \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435.<\/p>\n<p>\u0414\u043b\u044f \u0441\u0435\u0431\u044f \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438, \u0447\u0442\u043e \u0431\u043e\u0301\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043d\u0435\u043c \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043d\u0430\u0441 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442. \u0410 \u0434\u043b\u044f \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0431\u0443\u0434\u0443\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440.<\/p>\n<p>\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 <a href=\"http:\/\/ru.esotericsoftware.com\/\" rel=\"noopener noreferrer nofollow\">Spine<\/a> \u043c\u044b \u0431\u044b\u043b\u0438 \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c. \u0422\u0438\u043f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 Essential \u043f\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0443 \u043d\u0438\u0447\u0435\u043c \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u043d\u0430\u043c\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 CocoStudio. \u041f\u043e\u043a\u0443\u043f\u0430\u0442\u044c \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e Professional \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0434\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f mesh-\u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043d\u0430\u0441 \u043f\u043e\u043a\u0430 \u0434\u043e\u0440\u043e\u0433\u043e\u0435 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435.<\/p>\n<p>\u041f\u043e \u044d\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0432\u044b\u0431\u043e\u0440 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u043f\u0430\u043b \u043d\u0430 <a href=\"https:\/\/docs.egret.com\/dragonbones\/en\" rel=\"noopener noreferrer nofollow\">Dragonbones<\/a>.<\/p>\n<p>\u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0438\u0437 CocoStudio. \u041d\u0430\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.<\/p>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0443 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 <a href=\"https:\/\/github.com\/DragonBones\/DragonBonesCPP\" rel=\"noopener noreferrer nofollow\">DragonBonesC++ RunTime<\/a> \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 cocos2d-x.<\/p>\n<figure class=\"\"><figcaption>\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 Dragonbones<\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430, \u0434\u0435\u043b\u043e \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0437\u0430 \u043c\u0430\u043b\u044b\u043c. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0432 \u0438\u0433\u0440\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043c\u044b \u0434\u0443\u043c\u0430\u043b\u0438, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0442\u0440\u0435\u0445 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438, \u043d\u043e \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Spine, \u043a\u0430\u043a \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0447\u0443\u0442\u044c \u0432\u044b\u0448\u0435, \u043c\u044b \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0432 \u0438\u0433\u0440\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0440\u0430\u0437\u0443. \u041a\u0430\u043a \u0431\u044b \u0432\u044b \u043d\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0441\u0432\u043e\u0439 \u043a\u043e\u0434 \u0438 \u043d\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0435\u0439 \u043d\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u0447\u0442\u0438 \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b. \u042f \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043f\u0440\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u0432\u0435\u0449\u0430\u043c\u0438.<\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u0430\u0439\u0442\u0438\u043d\u0433\u0430, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0434\u043b\u044f \u043d\u0430\u0441 \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c \u0431\u044b\u043b\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u0435\u0439 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0439 (hitbox`\u043e\u0432 \u0438 hurtbox`\u043e\u0432) \u0440\u0430\u0437\u043d\u044b\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432. \u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u043c\u0435\u0442\u044c \u0442\u043e\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0435\u0439 \u0437\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u0440\u0438 \u0443\u0434\u0430\u0440\u0430\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439.<\/p>\n<figure class=\"\"><figcaption>\u0440\u0435\u0436\u0438\u043c debug<\/figcaption><\/figure>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c \u0431\u044b\u043b\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0438 \u0432\u0440\u0435\u043c\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u0435\u0439 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438. \u0412\u0438\u0434\u0435\u0442\u044c \u044d\u0442\u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438\u0445 \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435.<\/p>\n<figure class=\"\"><figcaption>\u0440\u0435\u0436\u0438\u043c normal<\/figcaption><\/figure>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u0432, \u044f \u0431\u044b\u043b \u0443\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e \u043b\u043e\u0433\u0438\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u0434\u0430 \u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430\u044f, \u043d\u043e \u0432\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u043f\u0440\u0438\u0448\u043b\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043c\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0448\u0438\u0431\u043b\u0438\u0441\u044c \u0432 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445.<\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435 \u0441 \u0447\u0435\u043c \u043c\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c &#8212; \u0440\u0430\u0437\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043b\u044f bone \u0443 \u044d\u0442\u0438\u0445 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 bone \u0434\u043b\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0432 CocoStudio \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u043c\u0438 &#171;\u043d\u0430 \u043b\u0435\u0442\u0443&#187; \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0433\u043e \u043d\u0430\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430.<\/p>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0430\u0440\u043c\u0430\u0442\u0443\u0440\u0443 CocoStudio void JCAnyArmature::setArmature(cocostudio::Armature *armature) { movementCCSJumpStart_ = armature->getAnimation()->getAnimationData()->getMovement(\"JUMPSTART\"); boneCCSHitbox_ = armature->getBone(\"hitbox\"); boneCCSHurtbox0_ = armature->getBone(\"hurtbox0\"); boneCCSHurtbox1_ = armature->getBone(\"hurtbox1\");  armature_ = armature; armatureType_ = JCArmatureEditor::Type::COCOSTUDIO;  if (!JCGlobalSetting::getInstance()->isTestFunctions())  { boneCCSHitbox_->setOpacity(0); boneCCSHurtbox0_->setOpacity(0); boneCCSHurtbox1_->setOpacity(0); } }<\/code><\/pre>\n<p>\u0422\u043e \u0434\u043b\u044f Dragonbones \u0442\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043d\u0435 \u043f\u043e\u0434\u043e\u0448\u0435\u043b. \u0412 \u044d\u0442\u043e\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c bone \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e, \u043c\u0435\u043d\u044f\u043b\u0438 \u043c\u044b \u0435\u0435 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0438\u043b\u0438 \u043d\u0435\u0442. \u041f\u043e \u044d\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u044f\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u0435\u0439 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u0432 \u043f\u0443\u0441\u0442\u044b\u043c\u0438, \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0432 \u0443\u0440\u043e\u0432\u043d\u0435.<\/p>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0430\u0440\u043c\u0430\u0442\u0443\u0440\u0443 Dragonbones void JCAnyArmature::setArmature(dragonBones::CCArmatureDisplay *armature) { movementDGBJumpStart_ = armature->getAnimation()->getAnimations().find(\"JUMPSTART\")->second; boneDGBHitbox_ = armature->getArmature()->getBone(\"hitbox\"); boneDGBHurtbox0_ = armature->getArmature()->getBone(\"hurtbox0\"); boneDGBHurtbox1_ = armature->getArmature()->getBone(\"hurtbox1\");  slotDGBHitbox_ = armature->getArmature()->getSlot(\"hitbox\"); slotDGBHurtbox0_ = armature->getArmature()->getSlot(\"hurtbox0\"); slotDGBHurtbox1_ = armature->getArmature()->getSlot(\"hurtbox1\");  armature_ = armature; armatureType_ = JCArmatureEditor::Type::DRAGONBONE;  if (!JCGlobalSetting::getInstance()->isTestFunctions()) { dragonBones::CCFactory::getFactory()->replaceSlotDisplay(\"EmptyBox\", \"emptybox\", \"emptybox\", \"emptybox\", slotDGBHitbox_); dragonBones::CCFactory::getFactory()->replaceSlotDisplay(\"EmptyBox\", \"emptybox\", \"emptybox\", \"emptybox\", slotDGBHurtbox0_); dragonBones::CCFactory::getFactory()->replaceSlotDisplay(\"EmptyBox\", \"emptybox\", \"emptybox\", \"emptybox\", slotDGBHurtbox1_); } }<\/code><\/pre>\n<p>\u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e, \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Dragonbones \u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u0440\u043c\u0430\u0442\u0443\u0440\u044b \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0438\u0437 \u043f\u0443\u043b\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u0438\u0437 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u043d\u043e\u0434\u044b void JCAnyArmature::removeArmatureFromParent() { switch (armatureType_) { case JCArmatureEditor::Type::COCOSTUDIO: armature_->removeFromParent(); break; case JCArmatureEditor::Type::DRAGONBONE: static_cast&lt;dragonBones::CCArmatureDisplay*>(armature_)->getEventDispatcher()->setEnabled(false); armature_->removeFromParent(); static_cast&lt;dragonBones::CCArmatureDisplay*>(armature_)->dispose(); break; default: armature_->removeFromParent(); break; } }<\/code><\/pre>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u043e\u0431\u043e\u0438\u0445 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u043e\u0436\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f.<\/p>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0443\u0441\u0442\u0430\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043d\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 void JCAnyArmature::setAnimationEventCallFunc(std::function&lt;void(cocostudio::MovementEventType movementType, const std::string &amp;movementID)> listener) { switch (armatureType_) { case JCArmatureEditor::Type::COCOSTUDIO: static_cast&lt;cocostudio::Armature*>(armature_)->getAnimation()->setMovementEventCallFunc(CC_CALLBACK_0(JCAnyArmature::_onCCSAnimationEvent, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); break; case JCArmatureEditor::Type::DRAGONBONE: static_cast&lt;dragonBones::CCArmatureDisplay*>(armature_)->getEventDispatcher()->setEnabled(true); static_cast&lt;dragonBones::CCArmatureDisplay*>(armature_)->getEventDispatcher()->addCustomEventListener(dragonBones::EventObject::COMPLETE, std::bind(&amp;JCAnyArmature::_onDGBAnimationEvent, this, std::placeholders::_1)); static_cast&lt;dragonBones::CCArmatureDisplay*>(armature_)->getEventDispatcher()->addCustomEventListener(dragonBones::EventObject::LOOP_COMPLETE, std::bind(&amp;JCAnyArmature::_onDGBAnimationEventLoop, this, std::placeholders::_1)); break; default: static_cast&lt;cocostudio::Armature*>(armature_)->getAnimation()->setMovementEventCallFunc(CC_CALLBACK_0(JCAnyArmature::_onCCSAnimationEvent, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); break; } eventAnimation_ = listener; }<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 CocoStudio void JCAnyArmature::_onCCSAnimationEvent(cocostudio::Armature *, cocostudio::MovementEventType movementType, const std::string&amp; movementID) { this->_onAnimationEvent(movementType, movementID); }<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 Dragonbones void JCAnyArmature::_onDGBAnimationEvent(cocos2d::EventCustom *event) { const auto eventObject = static_cast&lt;dragonBones::EventObject*>(event->getUserData()); this->_onAnimationEvent(cocostudio::MovementEventType::COMPLETE, eventObject->animationState->name); }<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043a\u0440\u0443\u0433\u043e\u0432\u043e\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 Dragonbones void JCAnyArmature::_onDGBAnimationEventLoop(cocos2d::EventCustom *event) { const auto eventObject = static_cast&lt;dragonBones::EventObject*>(event->getUserData()); this->_onAnimationEvent(cocostudio::MovementEventType::LOOP_COMPLETE, eventObject->animationState->name); }<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0438 \u0434\u0435\u0440\u0433\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 void JCAnyArmature::_onAnimationEvent(cocostudio::MovementEventType movementType, const std::string &amp;movementID) { if (eventAnimation_) eventAnimation_(movementType, movementID); }<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u0438 \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0442\u043e\u0447\u0435\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0443 CocoStudio \u0438 Dragonbones, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0443\u0447\u0435\u0441\u0442\u044c.<\/p>\n<pre><code class=\"cpp\">\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0443\u0441\u0442\u0430\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043d\u0430 \u0442\u043e\u0447\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 void JCAnyArmature::setFrameEventCallFunc(std::function&lt;void(const std::string &amp;eventName, const std::string &amp;movementID)> listener) { switch (armatureType_) { case JCArmatureEditor::Type::COCOSTUDIO: static_cast&lt;cocostudio::Armature*>(armature_)->getAnimat<\/code><\/pre>\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-327820","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/327820","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=327820"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/327820\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=327820"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=327820"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=327820"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}