{"id":253826,"date":"2015-03-26T11:00:02","date_gmt":"2015-03-26T07:00:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=253826"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=253826","title":{"rendered":"\u041a\u0430\u043a \u044f \u0441\u043f\u0430\u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0436\u0438\u0437\u043d\u0435\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0432 Zeptolab"},"content":{"rendered":"<p>     \t\u041f\u0440\u0438\u0432\u0435\u0442!<\/p>\n<p>   <a href=\"http:\/\/habrahabr.ru\/users\/23derevo\/\" class=\"user_link\">23derevo<\/a> \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435\u043c \u043d\u0430 Mobius \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043c\u0435\u043d\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 Zeptolab.<\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/5d5\/481\/c50\/5d5481c50ef64895b185a6537706b1fd.jpg\"\/><\/p>\n<p>  \u041d\u0430\u0447\u043d\u0443 \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u043d\u0430 C++ \u0438 \u043d\u0430 \u0441\u0432\u043e\u0451\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435, \u043e\u0442 \u043b\u044e\u0431\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 OpenGL. \u0414\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \u0441 \u043d\u0443\u043b\u044f \u0441\u0442\u0440\u043e\u0438\u043c \u0441\u0432\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0441\u0432\u043e\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044b \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u0437\u044f\u0442\u044c \u0434\u0435\u0432\u0435\u043b\u043e\u043f\u0435\u0440\u0430 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0432 \u0442\u0435\u043e\u0440\u0438\u0438, \u0435\u043c\u0443 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u043f\u043b\u044e\u0441\u044b. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u044d\u0442\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0435 \u0442\u0430\u043a. <\/p>\n<p>  <a name=\"habracut\"><\/a><\/p>\n<h1>\u041e \u0440\u0430\u0431\u043e\u0442\u0435<\/h1>\n<p>  \u042f \u043f\u0440\u0438\u0448\u0451\u043b \u0432 Zeptolab \u0435\u0449\u0451 \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u043e \u0446\u0435\u043b\u044b\u0445 \u0442\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430: CTO, iOS-\u0434\u0435\u0432\u0435\u043b\u043e\u043f\u0435\u0440 \u0438 Android-\u0434\u0435\u0432\u0435\u043b\u043e\u043f\u0435\u0440. \u0414\u043e \u044d\u0442\u043e\u0433\u043e \u044f \u0443\u0447\u0438\u043b\u0441\u044f \u0432 \u0428\u0410\u0414 \u042f\u043d\u0434\u0435\u043a\u0441\u0430 \u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u043f\u0438\u043b\u0438\u043b \u0431\u0430\u0437\u0443 \u0442\u0430\u043c\u043e\u0436\u0435\u043d\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e Rich-\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u2013 \u0432 \u043e\u0431\u0449\u0435\u043c, \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u043e\u0434\u0430 MSDN, \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0442\u0430\u043c\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043d\u0443\u0436\u0434. \u0414\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043e\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u0438 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0435\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u0438. <\/p>\n<p>  \u0421\u0443\u043f\u0435\u0440\u043a\u0440\u0443\u0442\u044b\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u043d\u0430\u043d\u0438\u0439 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u0431\u044b\u043b\u043e, \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0441\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439, \u043f\u0438\u0441\u0430\u043b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043d\u0430 OpenGL, \u0434\u0435\u043b\u0430\u043b \u0448\u0435\u0439\u0434\u0435\u0440\u044b. \u042d\u0442\u043e\u0433\u043e, \u0432 \u0446\u0435\u043b\u043e\u043c, \u0445\u0432\u0430\u0442\u0438\u043b\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u0443\u0436\u0435 \u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u043e \u0432\u0435\u0442\u043a\u0435 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. <\/p>\n<p>  \u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0441\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435 \u0434\u043b\u044f \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430 (\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0432\u043e\u043e\u0431\u0449\u0435) \u2013 \u044d\u0442\u043e \u043e\u0431\u0449\u0430\u044f \u0441\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u0440\u0443\u0433\u043e\u0437\u043e\u0440 \u0438 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043c\u044b\u0448\u043b\u0435\u043d\u0438\u0435. \u041a\u0441\u0442\u0430\u0442\u0438, \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u043d\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u043b\u0438 \u043f\u0440\u0435\u0441\u043b\u043e\u0432\u0443\u0442\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u043f\u0440\u043e \u043a\u0440\u0443\u0433\u043b\u044b\u0435 \u043b\u044e\u043a\u0438. \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u0441\u0430\u043c \u043f\u0440\u043e\u0432\u043e\u0436\u0443 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f, \u0438 \u0434\u0430\u044e \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438. \u041e\u0441\u043a\u043e\u043c\u0438\u043d\u0443 \u043e\u043d\u0438 \u043d\u0430\u0431\u0438\u0432\u0430\u044e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430\u043c \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0434\u043a\u043e (\u0435\u0441\u043b\u0438 \u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u043d\u0434\u043e\u043c, \u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0449\u0435\u0439 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u2013 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0447\u0435\u0441\u0442\u043d\u043e \u043f\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044e \u043a \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430\u043c). \u041d\u043e, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f, \u0447\u0442\u043e \u043e\u043d\u0438 \u00ab\u0443\u0442\u0435\u043a\u0430\u044e\u0442\u00bb \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439, \u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0435\u0449\u0451 \u043f\u0430\u0440\u0443 \u0441\u0432\u043e\u0438\u0445 \u0437\u0430\u0434\u0430\u0447, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043d\u0435 \u0447\u0438\u0442\u0435\u0440\u0438\u0442 \u043b\u0438 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442. \u0415\u0441\u043b\u0438 \u0441 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u0432\u0441\u0451 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0442\u043e \u043d\u0435\u0437\u043d\u0430\u043d\u0438\u0435 \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u044f\u0437\u044b\u043a\u0430 \u2014 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430. \u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0443\u0447\u0438\u0442\u044c, \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u0436\u0435 \u0438\u0437\u0443\u0447\u0430\u044e\u0442\u0441\u044f, \u0430 \u0432\u043e\u0442 \u0441\u043e\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c, \u0443\u0432\u044b, \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443. <\/p>\n<p>  \u0412\u043e\u043e\u0431\u0449\u0435, \u043a\u043e\u0434\u0435\u0440 \u0442\u0435\u043c \u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u0447\u0442\u043e \u0443\u043c\u0435\u0435\u0442 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c \u0438\u0434\u0435\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447. \u0412 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u043a\u0440\u0443\u043f\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043c\u043e\u0439 \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0434\u0440\u0443\u0433. \u0423 \u043d\u0438\u0445 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0439 \u043e\u0444\u0438\u0441 \u0437\u0430\u043d\u044f\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0445 \u043d\u0430 \u041f\u0438\u0442\u043e\u043d\u0435 \u0438\u043b\u0438 C# \u0434\u043b\u044f \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u043e\u0432, \u0430 \u043f\u043e\u0442\u043e\u043c \u043e\u0442\u0434\u0430\u0451\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u043c \u0432 \u0418\u043d\u0434\u0438\u0438 \u0438 \u041a\u0438\u0442\u0430\u0435. \u0422\u0430\u043c \u0443\u0436\u0435 \u0434\u0430\u043b\u0451\u043a\u0438\u0435 \u043a\u043e\u0434\u0435\u0440\u044b \u0431\u0435\u0437 \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u0438, \u043d\u043e \u0441 \u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0435\u0434\u0430\u043d\u0442\u0438\u0437\u043c\u043e\u043c \u0438 \u0441 \u0447\u0438\u0441\u0442\u043e \u0430\u0437\u0438\u0430\u0442\u0441\u043a\u0438\u043c \u0443\u043f\u043e\u0440\u0441\u0442\u0432\u043e\u043c \u0431\u0435\u0440\u0443\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0438\u0434\u0435\u0438 \u0438 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u0438\u0445 \u0432 \u043a\u043e\u0434\u0435 \u0434\u043b\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u043d\u0430 C++ \u0438\u043b\u0438 C \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. <\/p>\n<p>  \u042f \u0431\u044b \u0441\u043e\u0432\u0435\u0442\u043e\u0432\u0430\u043b \u0442\u0435\u043c, \u043a\u0442\u043e \u0438\u0449\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0430, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0435\u0439\u0442\u0438\u043d\u0433 \u0432 \u0440\u0430\u0439\u043e\u043d\u0435 2000 \u043d\u0430 Codeforces. \u0415\u0441\u043b\u0438 \u0432\u044b \u0442\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0433\u043a\u0430 \u0436\u0451\u043b\u0442\u044b\u043c, \u044d\u0442\u043e \u2013 \u0432\u044b\u0441\u043e\u043a\u0438\u0435 \u0448\u0430\u043d\u0441\u044b \u043f\u0440\u043e\u0439\u0442\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0413\u0443\u0433\u043b. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432\u044b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u0439\u043c\u0451\u0442\u0435, \u0447\u0442\u043e \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u2014 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0434\u0443\u043c\u0430\u0442\u044c \u0438 \u0440\u0435\u0448\u0430\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0443\u0436\u0435 \u0438\u0437\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u00ab\u043f\u043e \u043c\u0435\u0441\u0442\u0443\u00bb \u0434\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0433\u043e (\u0438\u043b\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e) \u0443\u0440\u043e\u0432\u043d\u044f.<\/p>\n<h1>\u041f\u0430\u0440\u0430 \u0441\u043b\u043e\u0432 \u043e \u0445\u0443\u0434\u043e\u0436\u043d\u0438\u043a\u0430\u0445<\/h1>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b \u0421ocos2D. \u0425\u043e\u0440\u043e\u0448\u0438\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a, \u043d\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u0432\u0435\u0449\u0438 \u043d\u0430\u0441 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043b\u0438 \u043f\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043d\u0430\u0447\u0430\u043b\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 C++ \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u0442\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 \u0438 \u0445\u043e\u0440\u043e\u0448\u0443\u044e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0443 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u041f\u0440\u043e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u043c\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438, \u0435\u0441\u043b\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u043e \u2013 \u043e\u043d\u0430 \u0433\u043e\u0442\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u043e Flash, \u043f\u043e\u0442\u043e\u043c \u043c\u044b \u043f\u0430\u0440\u0441\u0438\u043c FLA-\u0444\u0430\u0439\u043b\u044b, \u0430 \u043f\u043e\u0442\u043e\u043c \u0432\u043e\u0441\u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0442\u0435 \u0436\u0435 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u0421\u0430\u043c\u044b\u043c \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0434\u043b\u044f \u043d\u0430\u0441 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044b\u043b \u0443\u043f\u043e\u0440 \u043d\u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 \u2013 \u044d\u0442\u043e \u043f\u043b\u0430\u0432\u043d\u043e\u0441\u0442\u044c: \u0445\u0443\u0434\u043e\u0436\u043d\u0438\u043a\u0438 \u0447\u0430\u0441\u0442\u043e \u0441\u0442\u043e\u044f\u0442 \u0437\u0430 \u0441\u043f\u0438\u043d\u043e\u0439 \u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432 \u0438 \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u0447\u0442\u043e \u043d\u0435 \u0442\u0430\u043a. \u0411\u0435\u0437 \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0433\u0434\u0435 \u0438 \u0447\u0442\u043e \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0451\u0440\u0433\u0430\u0435\u0442\u0441\u044f, \u043d\u043e \u0445\u0443\u0434\u043e\u0436\u043d\u0438\u043a\u0438 \u044d\u0442\u043e \u0442\u043e\u0447\u043d\u043e \u0447\u0443\u0432\u0441\u0442\u0432\u0443\u044e\u0442. \u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043d\u0435 \u0442\u0430\u043a, \u0434\u0430 \u0438 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u043c\u043e\u0436\u0435\u0442 \u044d\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0443\u0432\u0438\u0434\u0438\u0442. \u041d\u043e \u043f\u043e\u0447\u0443\u0432\u0441\u0442\u0432\u0443\u0435\u0442, \u0447\u0430\u0441\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e \u00ab\u0448\u0435\u0440\u043e\u0445\u043e\u0432\u0430\u0442\u043e\u00bb. \u041d\u0430\u0448\u0438 \u0445\u0443\u0434\u043e\u0436\u043d\u0438\u043a\u0438 \u0434\u043e\u0431\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, \u0438 \u0443\u043c\u0435\u044e\u0442 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u044f\u0437\u044b\u043a\u043e\u043c, \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c. <\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/68b\/070\/cd5\/68b070cd56f245adaa95b2503b34caea.jpg\"\/><\/p>\n<p>  \u041d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 \u043d\u0430\u0448\u0438 \u0440\u0435\u0431\u044f\u0442\u0430 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443\u0442, \u043a\u0430\u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u043c\u044b \u0434\u043e\u0431\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0438 \u043f\u043e\u043a\u0430\u0436\u0443\u0442, \u0447\u0442\u043e \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430. \u042f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u0440\u043e \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u044e \u043d\u0430\u0448\u0438\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439, \u043f\u0440\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0443 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u041e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0430\u043c\u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u0442\u044c \u0440\u043e\u0432\u043d\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044c, \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0448\u0440\u0438\u0444\u0442\u044b, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c low-res \u0434\u0435\u0432\u0430\u0439\u0441\u044b \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435. \u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438.<\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/dec\/eff\/727\/deceff727ac44732b2703011db061a77.jpg\"\/><\/p>\n<p>  \u0414\u043b\u044f \u043c\u0435\u043d\u044f, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u043a\u0430\u0439\u0444 \u2013 \u044d\u0442\u043e \u0432\u0441\u0442\u0430\u0442\u044c \u0437\u0430 \u0441\u043f\u0438\u043d\u043e\u0439 \u0445\u0443\u0434\u043e\u0436\u043d\u0438\u043a\u0430 \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0448\u0435\u0434\u0435\u0432\u0440 \u0438\u0437 \u043d\u0438\u0447\u0435\u0433\u043e. \u0418\u043d\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u0442\u0430\u043a \u0436\u0435 \u0441\u043c\u043e\u0442\u0440\u044f\u0442 \u043d\u0430 \u043d\u0430\u0441 \u0438 \u043f\u044b\u0442\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c. \u041d\u0430\u043c \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u0438\u0445 \u0445\u0443\u0434\u043e\u0436\u043d\u0438\u043a\u043e\u0432 \u043d\u0430 \u0440\u044b\u043d\u043a\u0435 \u043c\u0430\u043b\u043e, \u0438 \u043d\u0430\u0439\u0442\u0438 \u0442\u0430\u043a\u0438\u0445 \u043a\u0440\u0443\u0442\u044b\u0445 \u043d\u0435\u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e. \u0418\u043c \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0445, \u0447\u0442\u043e \u0438\u043c \u043d\u0443\u0436\u043d\u043e, \u043d\u0435\u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043c\u0430\u043b\u043e. <\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/80d\/466\/c1a\/80d466c1a4b640149f86acb6f905e408.jpg\"\/><\/p>\n<p>  \u041a\u0441\u0442\u0430\u0442\u0438, \u043f\u0440\u0438 \u0432\u0441\u0451\u043c \u0438\u0445 \u0438\u0441\u043a\u0440\u0435\u043d\u043d\u0435 \u0433\u0443\u043c\u0430\u043d\u0438\u0442\u0430\u0440\u043d\u043e\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438, \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0437\u0430\u043c\u0435\u0447\u0435\u043d\u043e \u043d\u0438 \u0440\u0430\u0437\u0443 \u043d\u0435 \u0431\u044b\u043b\u043e. \u0417\u0430\u0434\u0430\u0447\u0438 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u0443\u044e\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u043e, \u043e\u0431\u0449\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442. \u0411\u044b\u043b \u0434\u0430\u0436\u0435 \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u0431\u0430\u0432\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439: \u0441\u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u0441\u0442\u0430 \u043d\u0430 Codeforces \u043c\u044b \u0445\u0443\u0434\u043e\u0436\u043d\u0438\u043a\u0430 \u0432 \u0440\u043e\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u0434\u043b\u044f \u043f\u0440\u0438\u043a\u043e\u043b\u0430. \u041e\u0447\u043a\u0438, \u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u043b\u0438\u0446\u043e, \u043c\u044b\u0441\u043b\u044c. \u0422\u0430\u043a \u0432\u043e\u0442, \u043e\u043d \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u0441\u0442\u0430\u043b \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u043d\u0430 JavaScript. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0431\u044b\u043b\u0438 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0434\u043b\u044f \u0424\u043e\u0442\u043e\u0448\u043e\u043f\u0430 \u0438 \u0434\u043b\u044f \u0424\u043b\u0435\u0448\u0430. \u041f\u043e\u0442\u043e\u043c \u043e\u043d \u0437\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0441\u044f\u0446\u0435\u0432, \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043f\u0440\u043e\u0448\u0451\u043b \u0432\u0441\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044f \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u043d\u043e\u0432\u044b\u0435 \u0438 \u043d\u043e\u0432\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u043c\u043d\u044e, \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u043d \u043f\u043e\u0434\u043e\u0448\u0451\u043b \u0438 \u043d\u0430\u0447\u0430\u043b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043a\u043e\u0440\u044f\u0432\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043c\u043e\u0433\u043b\u0430 \u0435\u043c\u0443 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b: \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u043e\u043d \u0445\u043e\u0447\u0435\u0442 \u0441\u0442\u0430\u0432\u0438\u0442\u044c breakpoint&#8217;\u044b \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445. \u0421\u0430\u043c \u0434\u043e\u0448\u0451\u043b \u0434\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f assert&#8217;\u043e\u0432. \u0414\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434 \u0435\u0433\u043e \u043a\u043e\u0434\u043e\u043c \u043c\u044b \u0438\u043d\u043e\u0433\u0434\u0430 \u0443\u043a\u0440\u0430\u0434\u043a\u043e\u0439 \u0441\u043c\u0435\u044f\u043b\u0438\u0441\u044c: \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043e\u043d \u043c\u0435\u0448\u0430\u043b \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443, \u0431\u0435\u0437 \u043e\u0442\u0441\u0442\u0443\u043f\u043e\u0432, \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0438\u043a\u043e. \u0410 \u043f\u043e\u0442\u043e\u043c \u043a\u0430\u043a-\u0442\u043e \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0441\u0442\u0430\u043b \u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u0442\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b. \u0421\u0435\u0439\u0447\u0430\u0441 \u0434\u0443\u043c\u0430\u0435\u043c, \u043a\u043e\u0433\u043e \u0435\u0449\u0451 \u0441\u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u043b\u0438\u0446\u043e\u043c. <br \/>  \u041d\u043e \u0432\u0435\u0440\u043d\u0443\u0441\u044c \u043a \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0443. \u0423 \u043d\u0430\u0441 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0440\u0443\u0442\u0438\u043d\u044b, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u0441 \u0435\u0433\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c\u0438 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u043c\u0438. \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u043e\u0435 \u0436\u0435\u043b\u0435\u0437\u043e, \u043d\u043e\u0432\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f, \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0435\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043b\u0435\u0433\u0430\u0441\u0438-\u043a\u043e\u0434\u043e\u043c. \u0418\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u0441\u0432\u043e\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0447\u0430\u0441\u0442\u0438\u0446. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0432 Unity, \u0445\u0443\u0434\u043e\u0436\u043d\u0438\u043a\u0438 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u2014 \u043c\u0435\u0433\u0430\u043a\u0440\u0443\u0442\u043e, \u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0435\u0449\u0451 \u0432\u043e\u0442 \u044d\u0442\u043e, \u0432\u043e\u0442 \u044d\u0442\u043e \u0438 \u0432\u043e\u0442 \u0442\u0430\u043a. <\/p>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0432\u0435\u043b\u0430\u0441\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0447\u0430\u0441\u0442\u0438\u0446, \u043d\u043e \u0438 \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0451\u0432 \u044d\u043c\u0438\u0441\u0441\u0438\u0438, \u0438 \u0447\u0430\u0441\u0442\u0438\u0446\u044b \u0434\u0432\u0438\u0433\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u0437\u0430\u043a\u043e\u043d\u0430\u043c. \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u043d\u0430\u0433\u0440\u0443\u0436\u0430\u043b\u0430 \u0431\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (\u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b, \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e), \u0430 \u043e\u0431\u0449\u0430\u044f \u0431\u044b\u043b\u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0433\u0438\u0431\u043a\u043e\u0439 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u0434\u0443\u043c\u043e\u043a \u0445\u0443\u0434\u043e\u0436\u043d\u0438\u043a\u043e\u0432. \u0420\u0435\u0448\u0438\u043b\u0438 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u043e\u0439 \u2013 \u0432\u044b\u0432\u0435\u043b\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u0431\u0449\u0443\u044e \u0444\u043e\u0440\u043c\u0443\u043b\u0443 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0447\u0430\u0441\u0442\u0438\u0446\u044b, \u0433\u0434\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0445\u043e\u0442\u044c \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0443, \u0445\u043e\u0442\u044c \u0441\u0438\u043d\u0443\u0441\u043e\u0438\u0434\u0443. \u0418 \u043d\u0435 \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442, \u0438 \u0435\u0441\u0442\u044c \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0431\u043e\u0433\u0430\u0442\u0441\u0442\u0432\u043e. <\/p>\n<h1>\u0412 \u043a\u043e\u043c\u0430\u043d\u0434\u0435<\/h1>\n<p>  \u0420\u0430\u0437 \u0432 \u0434\u0432\u0435 \u043d\u0435\u0434\u0435\u043b\u0438 \u043c\u044b \u0443\u0447\u0438\u043c \u0441\u0430\u043c\u0438 \u0441\u0435\u0431\u044f. \u041f\u0430\u0440\u043d\u0438 (\u0430 \u0441\u0435\u0439\u0447\u0430\u0441 \u0443 \u043d\u0430\u0441 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 21 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a) \u0438\u0437\u0443\u0447\u0430\u044e\u0442 \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435, \u0447\u0435\u043c \u0435\u0449\u0451 \u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445, \u0438\u043b\u0438 \u0436\u0435 \u0447\u0435\u0433\u043e \u043d\u0435\u0442 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f\u0445. \u0421\u043e\u0431\u0438\u0440\u0430\u044e\u0442 \u0432\u0441\u0435\u0445, \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442, \u0447\u0442\u043e \u043d\u0430\u0448\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e. \u042d\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u0441\u0430\u043c\u044b\u0435 \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0435\u043c\u044b: \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044f \u0431\u044b\u0441\u0442\u0440\u044b\u043c \u0431\u043b\u044e\u0440\u043e\u043c \u0444\u043e\u043d\u0430 \u0437\u0430 \u043f\u043e\u043f\u0430\u043f\u043e\u043c (\u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432 King of Thieves). \u041a \u043d\u0430\u043c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u043f\u0440\u0438\u0435\u0437\u0436\u0430\u043b \u0432 \u043e\u0444\u0438\u0441 \u041c\u0438\u0445\u0430\u0438\u043b \u041c\u0438\u0440\u0437\u0430\u044f\u043d\u043e\u0432 (\u043e\u043d, \u043a\u0441\u0442\u0430\u0442\u0438, \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u0430\u043b \u043d\u0430\u0448\u0443 \u0441\u0431\u043e\u0440\u043d\u0443\u044e, \u0437\u0430\u043d\u044f\u0432\u0448\u0443\u044e \u043f\u0435\u0440\u0432\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u043d\u0430 ACM\/ICPC). \u041f\u0440\u043e\u0447\u0438\u0442\u0430\u043b 3 \u0431\u043b\u043e\u043a\u0430 \u043a\u0440\u0443\u0442\u0435\u0439\u0448\u0438\u0445 \u043b\u0435\u043a\u0446\u0438\u0439 \u043f\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u0440\u0435\u0434\u043a\u0438\u0435 \u043c\u0430\u043b\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u0437\u0430\u0434\u0430\u0447\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0442\u0440\u0435\u0437\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u043d \u0436\u0435 \u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442\u043a\u0440\u044b\u043b \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u0432 \u043c\u0438\u0440\u0435 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432 \u0420\u043e\u0441\u0441\u0438\u0438). \u041a\u0430\u043a \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435, \u043c\u044b \u0445\u043e\u0434\u0438\u043b\u0438 \u043d\u0430 \u0442\u0440\u0451\u0445\u0434\u043d\u0435\u0432\u043d\u044b\u0439 \u0442\u0440\u0435\u043d\u0438\u043d\u0433 \u0421\u043a\u043e\u0442\u0442\u0430 \u041c\u0430\u0439\u0435\u0440\u0441\u0430 (\u044d\u0442\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043a\u043d\u0438\u0433\u0443 \u00abEffective Modern C++\u00bb). <\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/606\/be5\/2ba\/606be52ba8144e49ad53c7e6f0d54541.jpg\"\/><\/p>\n<p>  \u0418\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0437\u0430\u0434\u0430\u0447 \u2014 \u0432 2013 \u0431\u044b\u043b\u0430 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 NP-\u0442\u0440\u0443\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u044b\u0445 \u0430\u0442\u043b\u0430\u0441\u043e\u0432. \u041f\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043a\u043e\u043d\u043a\u0443\u0440\u0441\u043e\u0432 \u043d\u0430 Codeforces \u043a \u043d\u0430\u043c \u043f\u0440\u0438\u0448\u0451\u043b \u0441\u0438\u043b\u044c\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0441\u0442. \u041f\u0440\u043e\u0447\u0438\u0442\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u044e, \u0434\u043e\u043b\u0433\u043e \u0434\u0443\u043c\u0430\u043b, \u043f\u043e\u0442\u043e\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0432\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043e\u0431\u0449\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043b\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0430\u0442\u043b\u0430\u0441\u043e\u0432. \u0415\u0441\u043b\u0438 \u0431\u0440\u0430\u0442\u044c \u0437\u0430 100% \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0443, \u0442\u043e \u043d\u0430\u0448 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u0430\u0432\u0430\u043b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 120%, \u0430 \u043d\u043e\u0432\u044b\u0439 \u043d\u0430 \u044d\u0442\u043e\u043c \u0436\u0435 \u043d\u0430\u0431\u043e\u0440\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0430\u043b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c 104%. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442\u044b. <\/p>\n<p>  \u0412\u043e\u043e\u0431\u0449\u0435, \u043d\u0430 500 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u043e\u0432 \u0442\u0430\u043a\u0438\u0435 \u0432\u0435\u0449\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043e\u0447\u0435\u043d\u044c \u0437\u0430\u0431\u0430\u0432\u043d\u043e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u0448\u0430 \u0441\u0430\u043c\u0430\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043e\u043f\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0430 PNG-\u0444\u0430\u0439\u043b\u0430\u043c\u0438, \u0438 \u043d\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0443\u0440\u043e\u0432\u043d\u044f \u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0443\u0445\u043e\u0434\u0438\u043b\u043e \u043e\u043a\u043e\u043b\u043e 15 \u0441\u0435\u043a\u0443\u043d\u0434. \u041e\u0442\u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u2013 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u043e \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 PNG. \u042f \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043b \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 (\u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0441\u0432\u043e\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0438) \u2014 \u0438 \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0442\u0430\u043b\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c 6 \u0441\u0435\u043a\u0443\u043d\u0434. \u0421\u044d\u043a\u043e\u043d\u043e\u043c\u043b\u0435\u043d\u043e 9 \u0441\u0435\u043a\u0443\u043d\u0434, \u2014 \u043c\u044b \u0440\u0430\u0441\u043a\u0430\u0442\u0430\u043b\u0438 \u043d\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u0430 \u0432\u0441\u0435 \u0441\u0432\u043e\u0438 \u0438\u0433\u0440\u044b. \u0415\u0441\u043b\u0438 \u0441\u0447\u0438\u0442\u0430\u0442\u044c 20 \u0437\u0430\u0433\u0440\u0443\u0437\u043e\u043a \u0438\u0433\u0440\u044b \u0437\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0441\u043f\u0430\u0441\u0435\u043d\u043e \u044d\u0442\u0438\u043c \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043f\u043e\u043b\u0441\u043e\u0442\u043d\u0438 \u0436\u0438\u0437\u043d\u0435\u0439. \u0414\u0430\u043b\u044c\u0448\u0435 \u044d\u0442\u043e\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0438 \u0435\u0449\u0435 \u043d\u0430 20-30% \u043f\u043e \u0441\u043e\u0432\u0435\u0442\u0443 \u043d\u043e\u0432\u0438\u0447\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0434\u0435\u043b\u0430\u043b \u043d\u0430 \u0441\u0442\u0430\u0440\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u044b, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b\u0438 \u0431\u044b\u0442\u044c \u0443\u0437\u043a\u0438\u043c \u043c\u0435\u0441\u0442\u043e\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u0432\u0441\u0435 \u0441\u0442\u0430\u043b\u043e \u0443\u043f\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u0437 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430. \u0414\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441\u0432\u043e\u0439 \u0444\u043e\u0440\u043c\u0430\u0442.<br \/>  \u041f\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b. \u041d\u0430\u0448\u0438 \u0438\u0433\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0434\u0430\u0436\u0435 \u043d\u0430 \u0441\u0442\u0430\u0440\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435, \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 iOS 4.3 (\u0441\u0435\u0439\u0447\u0430\u0441 iOS 5: \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0438\u0437-\u0437\u0430 \u043f\u0430\u0440\u0442\u043d\u0451\u0440\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043f\u043e\u0442\u043e\u043c \u043c\u044b \u0441\u0442\u0430\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c libc++, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u043e\u0436\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 iOS 5, \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430). \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u043e\u0434 \u0442\u043e\u043f\u043e\u0432\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a \u043a\u043e\u043d\u0446\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u043d\u0438 \u043a\u0430\u043a \u0440\u0430\u0437 \u0441\u0442\u0430\u043d\u0443\u0442 \u0441\u0430\u043c\u044b\u043c \u043c\u0430\u0441\u0441\u043e\u0432\u044b\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u2014 \u043d\u043e \u00ab\u0441\u0442\u0430\u0440\u0438\u0447\u043a\u043e\u0432\u00bb \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c. \u0421 \u0442\u0435\u043c \u0436\u0435 \u00abCut the Rope\u00bb \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u044b\u043f\u0443\u0441\u043a\u0430 \u2013 \u044d\u0442\u043e \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u043d\u044b\u0435 \u0430\u043f\u0434\u0435\u0439\u0442\u044b. \u0421\u0442\u0430\u0440\u044b\u0439 \u043a\u043e\u0434 \u043d\u0435 \u043f\u043e\u0440\u0442\u0438\u043c. \u041d\u043e\u0432\u044b\u0435 \u0438\u0433\u0440\u044b \u0443\u0436\u0435 \u043a\u0443\u0434\u0430 \u0431\u043e\u0433\u0430\u0447\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e, \u043d\u043e \u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0436\u0435\u043b\u0435\u0437\u0443 \u0443 \u043d\u0438\u0445 \u0432\u044b\u0448\u0435. <\/p>\n<p>  \u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0443 \u043d\u0430\u0441 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e, \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u0442\u0443\u0434\u0438\u044f\u0445. \u0413\u0435\u0439\u043c\u0434\u0438\u0437\u0430\u0439\u043d\u0435\u0440 \u0432\u044b\u0434\u0430\u0451\u0442 \u043a\u043e\u043d\u0446\u0435\u043f\u0442, \u0437\u0430\u0442\u0435\u043c \u0437\u0430 1-2 \u0434\u043d\u044f \u043a\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0438\u0437 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0434\u0435\u043b\u0430\u0435\u0442 \u00ab\u0440\u0430\u0431\u043e\u0442\u0443 \u043c\u0435\u0447\u0442\u044b\u00bb \u2014 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0441 \u043d\u0443\u043b\u044f \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0431\u0435\u0437 \u0433\u0440\u0430\u0444\u0438\u043a\u0438, \u043d\u0430 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0430\u0445. \u0415\u0441\u043b\u0438 \u043f\u0440\u044b\u0436\u043a\u0438 \u0448\u0430\u0440\u0438\u043a\u0430 \u0438 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0448\u0442\u044b\u0440\u044f\u0442 \u0433\u0435\u0439\u043c\u0434\u0438\u0437\u0430\u0439\u043d\u0435\u0440\u0430 \u2013 \u0438\u0434\u0451\u0442 \u0432 \u0440\u0430\u0431\u043e\u0442\u0443 \u0434\u0430\u043b\u044c\u0448\u0435. \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u043e\u0432 \u043a\u0443\u0434\u0430 \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u043d\u043e \u043c\u044b \u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0432\u043e\u0439. <\/p>\n<p>  \u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441\u0440\u0430\u0437\u0443 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u043c \u043d\u0430 \u0433\u043e\u0442\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435-\u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043a\u0435, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0432\u0435\u0449\u0438. \u0414\u043b\u044f \u043b\u044e\u0434\u0435\u0439, \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0438\u0437 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u0438\u0440 \u2013 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u043d\u0435\u0442, \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0441\u0432\u043e\u044f, \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0451 \u0441\u0432\u043e\u0451 \u0438 \u0434\u0430\u0436\u0435 \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043e \u043a \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435. \u0422\u0435, \u043a\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441 Unity \u2014 \u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435 \u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f \u00ab\u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c\u00bb, \u0432\u0438\u0434\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0435\u0449\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0430\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u043e. \u0421 \u041a\u043e\u043a\u043e\u0441\u043e\u043c, \u0432 \u0446\u0435\u043b\u043e\u043c, \u043d\u0430 \u0432\u044b\u0441\u043e\u043a\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438 \u0435\u0441\u0442\u044c, \u043d\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0438\u0433\u0440\u0443 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0438.<\/p>\n<h1>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435<\/h1>\n<p>  \u041d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u2014 \u043c\u043e\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u043f\u043e\u0440 \u0441 \u0434\u0440\u0443\u0437\u044c\u044f\u043c\u0438. \u041d\u0438\u0436\u0435 \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c 5 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u0432 \u043a\u043e\u0434\u0430 \u0441 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u043e\u0442 \u0440\u0430\u0437\u043d\u044b\u0445 \u043b\u044e\u0434\u0435\u0439. \u041a\u043e\u0434 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442\u0441\u044f \u0441 \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u044f \u0432\u0441\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432. (\u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e, \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0435)<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">App.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>\/\/ \/\/  App.cpp \/\/  Asteroids \/\/ \/\/  Created by xxxx \/\/ \/\/  #include &lt;string&gt;  #include &quot;App.h&quot; #include &quot;RenderCommandPolygonConvex.h&quot; #include &quot;Vec2.h&quot; #include &quot;Color.h&quot; #include &quot;GameMap.h&quot; #include &quot;Camera.h&quot; #include &quot;MapDrawObjectPolygon.h&quot; #include &quot;MapObjectMovable.h&quot; #include &quot;IMovable.h&quot; #include &quot;MovableObjectTouch.h&quot; #include &quot;MapObjectEmitter.h&quot; #include &quot;EmitterLineContinuous.h&quot; #include &quot;MovableInDirection.h&quot; #include &quot;MapObjectHero.h&quot; #include &quot;MapObjectAsteroid.h&quot; #include &quot;MapObjectDebris.h&quot;  const float LOGIC_MAP_WIDTH = 100; const float GAMEPLAY_ACCELERATION = 0.003;  namespace {     void initAsteroidsEmitters(GameMapPtr gameMap, float logicMapWidth, std::vector&lt;EmitterLineContinuousPtr&gt;& asteroidEmitters)     {                  for_each(asteroidEmitters.begin(), asteroidEmitters.end(), [](EmitterLineContinuousPtr emitter){emitter-&gt;die();});                      MapObjectEmitterPtr emitterMapObject(new MapObjectEmitter());         EmitterLineContinuousPtr emitter(new EmitterLineContinuous(Vec2(-logicMapWidth*0.5f, 0), Vec2(logicMapWidth*1.5f, 0), Vec2(0, 0), 8, 25, -1, gameMap));         emitter-&gt;setParticlesMapObject(MapObjectAsteroidPtr(new MapObjectAsteroid()));         asteroidEmitters.push_back(emitter);         emitterMapObject-&gt;setEmitter(emitter);         gameMap-&gt;addMapObject(emitterMapObject, Vec2(0, -10), 0);                  MapObjectEmitterPtr emitterMapObject2(new MapObjectEmitter());         EmitterLineContinuousPtr emitter2(new EmitterLineContinuous(Vec2(0, 0), Vec2(logicMapWidth, 0), Vec2(0, 1), 1, 30, -1, gameMap));         emitter2-&gt;setParticlesMapObject(MapObjectAsteroidPtr(new MapObjectAsteroid()));         emitterMapObject2-&gt;setEmitter(emitter2);         asteroidEmitters.push_back(emitter2);         gameMap-&gt;addMapObject(emitterMapObject2, Vec2(0, -10), 0);          MapObjectEmitterPtr emitterMapObject3(new MapObjectEmitter());         EmitterLineContinuousPtr emitter3(new EmitterLineContinuous(Vec2(0, 0), Vec2(logicMapWidth, 0), Vec2(0, 1), 3, 20, -1, gameMap));         emitter3-&gt;setParticlesMapObject(MapObjectDebrisPtr(new MapObjectDebris()));         emitterMapObject3-&gt;setEmitter(emitter3);         asteroidEmitters.push_back(emitter3);         gameMap-&gt;addMapObject(emitterMapObject3, Vec2(0, -10), 0);                  MapObjectEmitterPtr emitterMapObject4(new MapObjectEmitter());         EmitterLineContinuousPtr emitter4(new EmitterLineContinuous(Vec2(0, 0), Vec2(logicMapWidth, 0), Vec2(0, 1), 1, 40, -1, gameMap));         emitter4-&gt;setParticlesMapObject(MapObjectAsteroidPtr(new MapObjectAsteroid()));         emitterMapObject4-&gt;setEmitter(emitter4);         asteroidEmitters.push_back(emitter4);         gameMap-&gt;addMapObject(emitterMapObject4, Vec2(0, -10), 0);     } }  App::App() :time_(0) {  }  void App::updateAndRender(float dtSec, std::vector&lt;RenderCommandBasePtr&gt;& renderCommands) {     update(dtSec);     collectRenderData(renderCommands); }  bool App::touch(const std::vector&lt;TouchEvent&gt;& events) const {     if (events.empty())         return false;          if (gameMap_)         gameMap_-&gt;touch(events);          return true; }  void App::update(float dtSec) {     if (gameMap_)         gameMap_-&gt;update(dtSec);          tryRespawnHero();          updateGameplayAcceleration();          time_+= dtSec; }  void App::resetGameplay() {     time_ = 0;     ::initAsteroidsEmitters(gameMap_, LOGIC_MAP_WIDTH, asteroidEmitters_); }  void App::tryRespawnHero() {     if (!hero_ || hero_-&gt;isReadyToDestruct() )     {         if (!gameMap_-&gt;hasObjectOfType(MAP_OBJECT_HERO_DEBRIS))         {             resetGameplay();                          hero_ = MapObjectHeroPtr(new MapObjectHero(Rect(0, 0, logicMapSize_.x, logicMapSize_.y)));             gameMap_-&gt;addMapObject(hero_, Vec2(50, logicMapSize_.y - 10), 0);         }     } }  void App::setScreenSize(int screenW, int screenH) {     screenSize_ = Vec2(screenW, screenH);         float logicCellSize = screenW\/LOGIC_MAP_WIDTH;          logicMapSize_ = Vec2(screenW\/logicCellSize, screenH\/logicCellSize);     CameraPtr camera = CameraPtr(new Camera(logicCellSize, logicCellSize));          gameMap_ = GameMapPtr(new GameMap(Size(logicMapSize_.x, logicMapSize_.y), camera));     gameMap_-&gt;setLiveAreaRect(Rect(-logicMapSize_.x\/2, -10, logicMapSize_.x*2, logicMapSize_.y + 20));          resetGameplay(); }   void App::collectRenderData(std::vector&lt;RenderCommandBasePtr&gt;& renderCommands) const {     gameMap_-&gt;collectRenderData(renderCommands); }  void App::updateGameplayAcceleration() {     for (auto emitter: asteroidEmitters_)     {         emitter-&gt;setSpeedParticles(emitter-&gt;getSpeedParticles() + time_*GAMEPLAY_ACCELERATION);     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">game.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>#include &quot;stdafx.h&quot; #include &lt;math.h&gt; #include &lt;vector&gt; #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;glut.h&gt;  using namespace std;   const float Pi=3.14159265358; float winwid=400; float winhei=400; bool game_end=0; \/\/\/\/\/bullet\/\/\/\/ float dx=0,dy=0; float bull_speed=6; float betta=0; bool fl1=0, fl2=0; \/\/\/\/\/ship\/\/\/\/ float speed=0; float angle=0; float acsel=0; \/\/\/\/\/asteroid\/\/\/\/\/ float ast_size=50; float aster_speed=3; \/\/\/\/\/0-rand\/\/\/\/ int kol_aster=0;  class bullet { public: \tfloat dxb; \tfloat dyb; \tfloat angleb; \tbullet() \t{\tdxb=dx; \t\tdyb=dy; \t\tangleb=betta; \t} };  class asteroid { public: \tfloat anglea; \tfloat dx; \tfloat dy; \tfloat depth; \tint n; \tint i_big; \tint  ifsmall; \tvector &lt;double&gt; x; \tvector &lt;double&gt; y; \tvoid create(int i,bool param); \tvoid create_small(int i,int j,bool param,float depth1,float dx1,float dy1);  };  void asteroid:: create_small(int i,int j,bool param,float depth1,float dx1,float dy1) \t{ \t \tifsmall=0; \tint size=ast_size\/2; \tdepth=depth1+(j+2)*1.0\/(8.0*(kol_aster)); \tdx=dx1; \tdy=dy1; \ti_big=i;  \t\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/  \tint quat=rand()%4; \tint n1=rand()%2+1; \tint n2=rand()%2+1; \tint n3=rand()%2+1; \tint n4=rand()%2+1; \tn1=n2=n3=n4=1; \tn=n1+n2+n3+n4; \tdouble xi,yi; \tanglea=rand()%360;  \tx.clear(); \ty.clear();  \tfor (int i=0;i&lt;n1;i++) \t{ \t\txi=rand()%(size\/2)-size\/2; \t\tyi=rand()%(size\/2)+size\/2;\t\t \t\tx.push_back(xi); \t\ty.push_back(yi); \t} \tfor (int i=0;i&lt;n2;i++) \t{ \t\txi=rand()%(size\/2)+size\/2; \t\tyi=rand()%(size\/2)+size\/2; \t\tx.push_back(xi); \t\ty.push_back(yi); \t} \tfor (int i=0;i&lt;n3;i++) \t{ \t\txi=rand()%(size\/2)+size\/2; \t\tyi=rand()%(size\/2)-size\/2; \t\tx.push_back(xi); \t\ty.push_back(yi); \t} \tfor (int i=0;i&lt;n4;i++) \t{ \t\txi=rand()%(size\/2)-size\/2;  \t\tyi=rand()%(size\/2)-size\/2; \t\tx.push_back(xi); \t\ty.push_back(yi); \t} \t\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/  \t}  void asteroid::  create(int kol_exist,bool param) { \tint size=ast_size; \tint quat=rand()%4; \tint n1=rand()%2+1; \tint n2=rand()%2+1; \tint n3=rand()%2+1; \tint n4=rand()%2+1; \tn1=n2=n3=n4=1; \tn=n1+n2+n3+n4; \tdouble xi,yi; \tanglea=rand()%360; \ti_big=kol_exist;  \tifsmall=1; \tdepth=(float)(kol_exist)\/((kol_aster)); \tdx=rand()%(int)winwid -winwid\/2; \tdy=rand()%(int)winhei -winhei\/2; \tif(quat==0) dy=-ast_size-winhei\/2; \tif(quat==1) dy=ast_size+winhei\/2; \tif(quat==2) dx=-ast_size-winwid\/2; \tif(quat==3) dx=ast_size+winwid\/2;  \tx.clear(); \ty.clear();  \tfor (int i=0;i&lt;n1;i++) \t{ \t\txi=rand()%(size\/2)-size\/2; \t\tyi=rand()%(size\/2)+size\/2;\t\t \t\tx.push_back(xi); \t\ty.push_back(yi); \t} \tfor (int i=0;i&lt;n2;i++) \t{ \t\txi=rand()%(size\/2)+size\/2; \t\tyi=rand()%(size\/2)+size\/2; \t\tx.push_back(xi); \t\ty.push_back(yi); \t} \tfor (int i=0;i&lt;n3;i++) \t{ \t\txi=rand()%(size\/2)+size\/2; \t\tyi=rand()%(size\/2)-size\/2; \t\tx.push_back(xi); \t\ty.push_back(yi); \t} \tfor (int i=0;i&lt;n4;i++) \t{ \t\txi=rand()%(size\/2)-size\/2;  \t\tyi=rand()%(size\/2)-size\/2; \t\tx.push_back(xi); \t\ty.push_back(yi); \t} }  vector &lt;bullet&gt; vecb; vector &lt;asteroid&gt; veca;  void destroy_small_ast( int i) { \t\/\/\/\/\/\/???? ??????? 4 ??????????-??????? ????? ???????\/\/\/\/\/ \tbool create_big=1; \tfloat up_boarder=(float)(veca[i].i_big)\/((kol_aster)); \tfloat down_boarder=(float)(veca[i].i_big)\/((kol_aster)); \tasteroid a_big; \ta_big.create(veca[i].i_big,1); \tif (i&gt;0) if(veca[i-1].depth&gt;down_boarder) create_big=0;  \tif (i&lt;veca.size()-1) if(veca[i+1].depth&lt;up_boarder) create_big=0; \t{if (create_big==1)  \t{veca.insert(veca.begin()+veca[i].i_big,a_big); \tveca[veca[i].i_big].create(veca[i].i_big,1); \tveca.erase(veca.begin()+i+1);} \telse veca.erase(veca.begin()+i);} }  void destroy_aster(float dep) { \tdep=1-2*dep; \tfor(int i=0;i&lt;veca.size();i++) \t{  \t\tif (abs(dep-veca[i].depth)&lt;0.0001) \t \t\t\t{if(veca[i].ifsmall==1)  \t\t\t{ \t\t\t\tveca.resize(veca.size()+4); \t\t\t\tfor(int j=0;j&lt;4;j++) \t\t\t\t\tveca[veca.size()-j-1].create_small(i,j,0,veca[i].depth,veca[i].dx,veca[i].dy); \t\t\t\tveca.erase(veca.begin()+i); \t\t\t\tbreak; \t\t\t} \t\t\telse {destroy_small_ast( i);break;} \t\t} \t} }  void shoot() { \tfloat depth[5]; \tfor(int i=0;i&lt;vecb.size();i++) \t{ \t\tglLoadIdentity(); \t\t\/\/\/\/\/\/??????????? ??????????\/\/\/\/\/\/ \t\tvecb[i].dxb+=(speed+bull_speed)*cos(Pi*(vecb[i].angleb)\/180.0); \t\tvecb[i].dyb+=(speed+bull_speed)*sin(Pi*(vecb[i].angleb)\/180.0); \t\t\/\/\/\/?? ????????? ??????\/\/\/\/\/ \t\tif((vecb[i].dxb&gt;winwid\/2-1) ||(vecb[i].dxb&lt;-winwid\/2+1) ||(vecb[i].dyb&lt;-winhei\/2+1) || (vecb[i].dyb&gt;winhei\/2-1)) {vecb.erase(vecb.begin()+i);i--;} \t\telse{ \t\t\t\/\/\/\/\/?????? ???????\/\/\/\/ \t\t\tglReadPixels((vecb[i].dxb+winwid\/2),-vecb[i].dyb+winhei\/2,2,2,GL_DEPTH_COMPONENT,GL_FLOAT,depth); \t\t\tif (depth[0]!=1) \t\t\t{ \t\t\t\tdestroy_aster(depth[0]); \t\t\t\tvecb.erase(vecb.begin()+i); \t\t\t\ti--; \t\t\t} \t\t\telse \t\t\t{ \t\t\t\t\/\/\/\/\/\/?????????? ????\/\/\/\/\/\/ \t\t\t\tglTranslatef(vecb[i].dxb,vecb[i].dyb,0.0f);\t \t\t\t\tglColor3f(1.0f,1.0f,1.0f); \t\t\t\tglBegin(GL_LINES); \t\t\t\tglVertex3f( 0.0,0.0, 0.5f); \t\t\t\tglVertex3f(1.0,0.0, 0.5f); \t\t\t\tglEnd(); \t\t\t} \t\t} \t} }  void aster_draw() { \tglColor3f(0.5f,1.0f,1.0f); \tglLoadIdentity(); \tfor (int i=0;i&lt;veca.size();i++) \t{ \t\tglBegin(GL_POLYGON); \t\tfor(int j=0;j&lt;veca[i].n;j++) \t\tglVertex3f( veca[i].dx+veca[i].x[j],veca[i].dy+veca[i].y[j], veca[i].depth); \t\tglEnd(); \t\tveca[i].dx+=aster_speed*cos(Pi*(veca[i].anglea)\/180.0); \t\tveca[i].dy+=aster_speed*sin(Pi*(veca[i].anglea)\/180.0); \t\/\/\/\/\/?? ????????? ???? ????????? ??????????, ??????? ??????? ??????\/\/\/ \t\tif((veca[i].dx&gt;winwid\/2+ast_size) ||(veca[i].dx&lt;-winwid\/2-ast_size) ||(veca[i].dy&lt;-winhei\/2-ast_size) || (veca[i].dy&gt;winhei\/2+ast_size))  \t\tif (veca[i].ifsmall==0) \t\t{destroy_small_ast( i);i--;} \t\telse veca[i].create(i,1); \t} }  void asteroidsinit() { \tint k; \tk=rand()%6+4; \tif(kol_aster!=0)\tk=kol_aster; \telse  kol_aster=k; \tveca.resize(k); \tfor(int i=0;i&lt;k;i++) \t\tveca[i].create(i,1); }  void draw_ship() {  \tfloat depth[6]; \tfloat dx1,dx2,dy1,dy2;  \t\/\/\/\/\/\/\/\/??????? ????????? ? ??????????\/\/\/\/\/ \tif ((dx&lt;winwid\/2-1)&&(dx&gt;-winwid\/2+1)&&(dy&lt;winwid\/2-1)&&(dy&gt;-winwid\/2+1)) \t\tglReadPixels((dx+winwid\/2),-dy+winhei\/2,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,depth); \telse depth[0]=1; \t \tdx1=dx-10*cos(Pi*betta\/180)-10*sin(Pi*betta\/180)+winwid\/2; \tdy1=-dy+10*sin(Pi*betta\/180)-10*cos(Pi*betta\/180)+winhei\/2; \tif ((dx1&lt;winwid-1)&&(dx1&gt;0+1)&&(dy1&lt;winhei-1)&&(dy1&gt;0+1)) \t\tglReadPixels(dx1,dy1,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,depth+1); \telse  \t\tdepth[1]=1; \tdx2=dx-10*cos(Pi*betta\/180)+10*sin(Pi*betta\/180)+winwid\/2; \tdy2=-dy+10*sin(Pi*betta\/180)+10*cos(Pi*betta\/180)+winhei\/2; \tif ((dx2&lt;winwid-1)&&(dx2&gt;0+1)&&(dy2&lt;winhei-1)&&(dy2&gt;0+1)) \t\tglReadPixels(dx2,dy2,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,depth+2); \telse \t\tdepth[2]=1; \t\/\/\/\/\/\/\/??????? ?? ????????? ??????\/\/\/\/ \tif(dx&gt;winwid\/2) dx=-winwid\/2; \tif(dx&lt;-winwid\/2) dx=winwid\/2; \tif(dy&lt;-winhei\/2) dy=winhei\/2; \tif(dy&gt;winhei\/2) dy=-winhei\/2;  \/\/\/\/\/\/\/\/\/??????\/\/\/\/\/\/ \tglColor3f(0.8f,0.0f,0.8f); \tglLoadIdentity(); \tglTranslatef(dx,dy,0.0f);\t \tglRotatef(betta,0.0f,0.0f,1.0f);  \t\t\t \tglBegin(GL_TRIANGLES); \tglVertex3f( -10.0f,-10.0f, 1.0f); \tglVertex3f(-10.0f,10.0f, 1.0f); \tglVertex3f(0.0f,0.0f, 1.0f);\t \tif (fl2==1){ \t\tglVertex3f( -10.0f,-3.0f, 1.0f);\t \t\tglVertex3f(-10.0f,3.0f, 1.0f);\t \t\tglVertex3f(-15.0f,0.0f, 1.0f);\t \t} \tglEnd(); \/\/\/\/\/\/\/\/\/??????? ??????????-???? ???????????\/\/\/\/\/\/\/\/\/ \t\t\tif ((depth[0]!=1)||(depth[1]!=1)||(depth[2]!=1))\t \t\t\t\tgame_end=1; }  void display()  {  \tglClearDepth( 1.0f ); \tglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); \taster_draw(); \tdraw_ship(); \tshoot(); \tglutSwapBuffers();  }   void Timer(int) { \tacsel--; \tif(speed&gt;10) speed=10;\t \tif (fl1==1) {angle=betta;fl1=0;} \tif (acsel==0) {fl2=0;} \tdx=dx+speed*cos(Pi*angle\/180.0); \tdy=dy+speed*sin(Pi*angle\/180.0); \tif(speed&gt;0)speed=speed-0.1; \telse speed=0; \tdisplay(); \tif(game_end==0) glutTimerFunc(50,Timer,0); }  void Initialize() { \tdx=0; \tdy=0; \tvecb.empty(); \tangle=betta=speed=0; \tglClearColor(0, 0, 0.0, 1.0);  \tglMatrixMode(GL_PROJECTION);  \tglLoadIdentity();  \tglOrtho(-winwid\/2, winwid\/2, winhei\/2, -winhei\/2, -1, 1);  \tglMatrixMode(GL_MODELVIEW); \tglEnable(GL_DEPTH_TEST); \tglDepthFunc( GL_LEQUAL );  \tfloat depth[5]; \tglClearDepth( 1.0f );              \/\/ ????????? ??????? ?????? ??????? \tglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); \tasteroidsinit(); \tglutTimerFunc(500,Timer,0); }  void keyboard(unsigned char key,int x,int y) { \tif (key=='w') {fl1=1;speed++;fl2=1;acsel=10;} \tif (key=='d') {betta+=7;} \tif (key=='a') betta-=7; \tif (key==' ') {bullet b1;vecb.push_back(b1);} \tif(key=='r') {if(game_end==1) {game_end=0;Initialize();}}  }  int main(int argc, char **argv)\/\/??????? ?????  {   \tglutInit(&argc, argv);  \tglutInitDisplayMode(GLUT_DEPTH |GLUT_DOUBLE | GLUT_RGB);  \tglutInitWindowSize(winwid, winhei);  \tglutInitWindowPosition(200, 200);  \tglutCreateWindow(&quot;Powder Toy&quot;);  \tInitialize(); \tglutDisplayFunc(display);  \tglutKeyboardFunc(keyboard); \tglutMainLoop();  } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">game.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>#include &quot;game.h&quot; #include &quot;logic.h&quot;  Game::Game(unsigned width, unsigned height)     : _asteroids(std::vector&lt;AsteroidFamily *&gt;()), _shots(std::vector&lt;Shot *&gt;()), _booms(std::vector&lt;Boom *&gt;()),       _score(0), _livesBonus(10000), _level(0), _isAsteroidsEmpty(true), _gameOver(false),       _playerPoints(new std::vector&lt;Point&gt;(3)), _shotsPoints(new std::vector&lt;Point&gt;(4)),       _boomPoints(new std::vector&lt;Point&gt;(8)), _lastTimepoint(std::chrono::high_resolution_clock::now()),       _lastShotTimepoint(std::chrono::high_resolution_clock::now()),       _gameOverTimepoint(std::chrono::high_resolution_clock::now()), _timeMultiplier(0.0f), _width(width),       _height(height), _aspectRatio((float)width \/ (float)height),       _render(new GL(&_aspectRatio, &_halfWidth, &_halfHeight)),       _controls(new Controls(&_width, &_height, &_halfWidth, &_halfHeight)) {      _halfHeight = GAME_HEIGHT;     _halfWidth = _aspectRatio * _halfHeight;      _playerPoints = new std::vector&lt;Point&gt;(3);     (*_playerPoints)[0].x = -0.6f;     (*_playerPoints)[0].y = -0.5f;     (*_playerPoints)[1].x = -0.6f;     (*_playerPoints)[1].y = 0.5f;     (*_playerPoints)[2].x = 0.6f;     (*_playerPoints)[2].y =  0.0f;     _shotsPoints = new std::vector&lt;Point&gt;(4);     (*_shotsPoints)[0].x = 0.02f;     (*_shotsPoints)[0].y = 0.02f;     (*_shotsPoints)[1].x = 0.02f;     (*_shotsPoints)[1].y = -0.02f;     (*_shotsPoints)[2].x = -0.02f;     (*_shotsPoints)[2].y = -0.02f;     (*_shotsPoints)[3].x = -0.02f;     (*_shotsPoints)[3].y = 0.02f;     _boomPoints = new std::vector&lt;Point&gt;(8);     (*_boomPoints)[0].x = 0.1f;     (*_boomPoints)[0].y = 0.1f;     (*_boomPoints)[1].x = 0.5f;     (*_boomPoints)[1].y = 0.4f;     (*_boomPoints)[2].x = -0.1f;     (*_boomPoints)[2].y = -0.2f;     (*_boomPoints)[3].x = -0.5f;     (*_boomPoints)[3].y = -0.4f;     (*_boomPoints)[4].x = 0.2f;     (*_boomPoints)[4].y = -0.1f;     (*_boomPoints)[5].x = 0.5f;     (*_boomPoints)[5].y = -0.5f;     (*_boomPoints)[6].x = -0.1f;     (*_boomPoints)[6].y = 0.2f;     (*_boomPoints)[7].x = -0.5f;     (*_boomPoints)[7].y = 0.5f;      Shot::SetStaticPoints(_shotsPoints);     Boom::SetStaticPoints(_boomPoints);     Random::Init(&_halfWidth, &_halfHeight);      _player = new Player(_playerPoints, 0.0f, 0.0f); }  Game::~Game() {     delete _player;     delete _render;     for (Shot *item : _shots)         delete item;     for (Boom *item : _booms)         delete item;     for (AsteroidFamily *item : _asteroids)         delete item;     delete _playerPoints;     delete _shotsPoints;     delete _boomPoints; }  void Game::Refresh() { \t_controls-&gt;Refresh();     if (_score &gt;= _livesBonus) {         _livesBonus += 10000;         _player-&gt;SetLives(_player-&gt;GetLives() + 1);     }     if (_isAsteroidsEmpty) {         _level++;         for (AsteroidFamily *item : _asteroids)             delete item;         _asteroids.clear();         for (unsigned i = 0; i &lt; (_level + 1) * 2; ++i)             _asteroids.push_back(Random::GenerateAsteroidFamily());         _isAsteroidsEmpty = false;     }     _isAsteroidsEmpty = true;     std::chrono::high_resolution_clock::time_point now = std::chrono::high_resolution_clock::now();     auto time_span = std::chrono::duration_cast&lt;std::chrono::nanoseconds&gt;(now - _lastTimepoint).count();     _timeMultiplier = (float)time_span \/ 16666666.67f;     _lastTimepoint = now;      if (_controls-&gt;GetHyperspace()) {         if (!_gameOver) {             Random::ChangePlayerCoords(_player);             _controls-&gt;SetHyperspace(false);         } else {             if (std::chrono::duration_cast&lt;std::chrono::milliseconds&gt;(now - _gameOverTimepoint).count() &gt;=                     GAMEOVER_SCORE_TIME) {                 _player-&gt;SetCoord(0.0f, 0.0f);                 _player-&gt;SetAngle(0.0f);                 _player-&gt;SetLives(PLAYER_DEFAULT_LIVES);                 for (AsteroidFamily *item : _asteroids)                     delete item;                 _asteroids.clear();                 _isAsteroidsEmpty = true;                 _score = 0;                 _level = 0;                 _livesBonus = 10000;                 _gameOver = false;                 _controls-&gt;SetHyperspace(false);             }         }     }      if (_player-&gt;GetIsGhost() && !_gameOver) {         if (!_player-&gt;GetIsRendering()) {             if (std::chrono::duration_cast&lt;std::chrono::milliseconds&gt;(now - _player-&gt;GetDeadTime()).count() &gt;=                     PLAYER_BLACKOUT_TIME) {                 _player-&gt;SetIsRendering(true);             }         }         if (std::chrono::duration_cast&lt;std::chrono::milliseconds&gt;(now - _player-&gt;GetDeadTime()).count() &gt;= PLAYER_GHOST_TIME) {             _player-&gt;SetIsGhost(false);         }     }      if (_player-&gt;GetLives() &lt;= 0 && !_gameOver) {         _gameOver = true;         _gameOverTimepoint = now;         _player-&gt;SetIsGhost(true);         _player-&gt;Stop();     }      if (_player-&gt;GetIsRendering() && !_gameOver) {         RefreshObjectCoord(_player);         _player-&gt;Refresh(_controls-&gt;GetAngle(), _controls-&gt;GetAcceleration());         if (_controls-&gt;GetShoot()) {             if (std::chrono::duration_cast&lt;std::chrono::milliseconds&gt;(now - _lastShotTimepoint).count() &gt;= NEXT_SHOT_TIME) {                 _shots.push_back(_player-&gt;GenerateShot());                 _lastShotTimepoint = now;             }         }     }      for (auto it = _shots.begin(); it != _shots.end();) {         RefreshObjectCoord(*it);         (*it)-&gt;Refresh(_timeMultiplier);         if ((*it)-&gt;GetDistance() &gt;= std::min(_halfHeight, _halfWidth) * 2 - 1.2f) {             delete(*it);             it = _shots.erase(it);         } else {             ++it;         }     }      for (AsteroidFamily *item : _asteroids) {         if (item-&gt;GetLarge()-&gt;GetIsRendering()) {             _isAsteroidsEmpty = false;             RefreshObjectCoord(item-&gt;GetLarge());             item-&gt;GetLarge()-&gt;Refresh();             if (!_player-&gt;GetIsGhost()) {                 if (isCollision(_player, item-&gt;GetLarge())) {                     item-&gt;DestroyLarge();                     _score += SCORE_LARGE;                     ProcessCollision(_player, item-&gt;GetLarge());                 }             }             if (item-&gt;GetLarge()-&gt;GetIsRendering())                 for (auto it = _shots.begin(); it != _shots.end();) {                     if (isCollision(*it, item-&gt;GetLarge())) {                         delete(*it);                         it = _shots.erase(it);                         item-&gt;DestroyLarge();                         _booms.push_back(new Boom(item-&gt;GetLarge()-&gt;GetCoord().x, item-&gt;GetLarge()-&gt;GetCoord().y));                         _score += SCORE_LARGE;                     } else {                         ++it;                     }                 }         } else {             if (item-&gt;GetFirstSmall()-&gt;GetIsRendering()) {                 _isAsteroidsEmpty = false;                 RefreshObjectCoord(item-&gt;GetFirstSmall());                 item-&gt;GetFirstSmall()-&gt;Refresh();                 if (!_player-&gt;GetIsGhost()) {                     if (isCollision(_player, item-&gt;GetFirstSmall())) {                         item-&gt;GetFirstSmall()-&gt;SetIsRendering(false);                         _score += SCORE_SMALL;                         ProcessCollision(_player, item-&gt;GetFirstSmall());                     }                 }             }             if (item-&gt;GetSecondSmall()-&gt;GetIsRendering()) {                 _isAsteroidsEmpty = false;                 RefreshObjectCoord(item-&gt;GetSecondSmall());                 item-&gt;GetSecondSmall()-&gt;Refresh();                 if (!_player-&gt;GetIsGhost()) {                     if (isCollision(_player, item-&gt;GetSecondSmall())) {                         item-&gt;GetSecondSmall()-&gt;SetIsRendering(false);                         _score += SCORE_SMALL;                         ProcessCollision(_player, item-&gt;GetSecondSmall());                     }                 }             }             for (auto it = _shots.begin(); it != _shots.end();) {                 bool isFirstCollision = false, isSecondCollision = false;                 if (item-&gt;GetFirstSmall()-&gt;GetIsRendering())                     isFirstCollision = isCollision(*it, item-&gt;GetFirstSmall());                 if (item-&gt;GetSecondSmall()-&gt;GetIsRendering())                     isSecondCollision = isCollision(*it, item-&gt;GetSecondSmall());                 if (isFirstCollision || isSecondCollision) {                     delete(*it);                     it = _shots.erase(it);                     if (isFirstCollision) {                         item-&gt;GetFirstSmall()-&gt;SetIsRendering(false);                         _booms.push_back(new Boom(item-&gt;GetFirstSmall()-&gt;GetCoord().x, item-&gt;GetFirstSmall()-&gt;GetCoord().y));                         _score += SCORE_SMALL;                     }                     if (isSecondCollision) {                         item-&gt;GetSecondSmall()-&gt;SetIsRendering(false);                         _booms.push_back(new Boom(item-&gt;GetSecondSmall()-&gt;GetCoord().x, item-&gt;GetSecondSmall()-&gt;GetCoord().y));                         _score += SCORE_SMALL;                     }                 } else {                     ++it;                 }             }         }     }      for (auto it = _booms.begin(); it != _booms.end();) {         (*it)-&gt;Refresh(_timeMultiplier);         if ((*it)-&gt;GetDuration() &gt;= BOOM_MAX_DURATION) {             delete(*it);             it = _booms.erase(it);         } else {             ++it;         }     } }  void Game::RefreshObjectCoord(Object *object) {     object-&gt;SetCoord(object-&gt;GetCoord().x + object-&gt;GetVelocity().x * _timeMultiplier,                      object-&gt;GetCoord().y + object-&gt;GetVelocity().y * _timeMultiplier);     if (object-&gt;GetCoord().x &lt;= -_halfWidth) object-&gt;SetCoord(object-&gt;GetCoord().x + _halfWidth * 2, object-&gt;GetCoord().y);     else if (object-&gt;GetCoord().x &gt;= _halfWidth) object-&gt;SetCoord(object-&gt;GetCoord().x - _halfWidth * 2,                 object-&gt;GetCoord().y);     if (object-&gt;GetCoord().y &lt;= -_halfHeight) object-&gt;SetCoord(object-&gt;GetCoord().x,                 object-&gt;GetCoord().y + _halfHeight * 2);     else if (object-&gt;GetCoord().y &gt;= _halfHeight) object-&gt;SetCoord(object-&gt;GetCoord().x,                 object-&gt;GetCoord().y - _halfHeight * 2); }  void Game::Render() {     Refresh();     _render-&gt;Clear();      _render-&gt;RenderControls(_controls);      _render-&gt;SetColor(OBJECTS_COLOR);     if (_player-&gt;GetIsRendering() && !_gameOver) {         if (_player-&gt;GetIsGhost())             _render-&gt;SetColor(PLAYER_GHOST_COLOR);         _render-&gt;RenderPlayer(_player);     }      if (_gameOver)         _render-&gt;SetColor(OBJECTS_GAMEOVER_COLOR);     else         _render-&gt;SetColor(OBJECTS_COLOR);      for (AsteroidFamily *item : _asteroids) {         if (item-&gt;GetLarge()-&gt;GetIsRendering()) {             _render-&gt;RenderAsteroid(item-&gt;GetLarge());         } else {             if (item-&gt;GetFirstSmall()-&gt;GetIsRendering()) {                 _render-&gt;RenderAsteroid(item-&gt;GetFirstSmall());             }             if (item-&gt;GetSecondSmall()-&gt;GetIsRendering()) {                 _render-&gt;RenderAsteroid(item-&gt;GetSecondSmall());             }         }     }      for (Shot *item : _shots) {         _render-&gt;RenderShot(item);     }      _render-&gt;SetColor(BOOM_COLOR);     for (Boom *item : _booms) {         _render-&gt;RenderBoom(item);     }      _render-&gt;SetColor(TEXT_COLOR);     if (!_gameOver) {         _render-&gt;RenderScoreAndLives(_score, _player-&gt;GetLives());     } else {         _render-&gt;RenderGameOver(_score);     } }  bool Game::isCollision(Player *player, Asteroid *asteroid) {     const std::vector&lt;Point&gt; &playerPoints = *(player-&gt;GetPoints());     const std::vector&lt;Point&gt; &asteroidPoints = *(asteroid-&gt;GetPoints());     if (TestAABB(player, asteroid)) {         for (unsigned i = 0; i &lt; playerPoints.size(); i++) {             for (unsigned j = 0; j &lt; asteroidPoints.size(); j++) {                 if (Logic::IsLinesCross(playerPoints[i], playerPoints[(i + 1 == playerPoints.size()) ? 0 : i + 1],                                         asteroidPoints[j], asteroidPoints[(j + 1 == asteroidPoints.size()) ? 0 : j + 1])) {                     return true;                 }             }         }         if (Logic::IsInside(asteroidPoints, playerPoints[0])) {             return true;         }     }     return false; }  bool Game::isCollision(Shot *shot, Asteroid *asteroid) {     if (Logic::IsInside(*(asteroid-&gt;GetPoints()), shot-&gt;GetCoord()))         return true;     else         return false; }  bool Game::TestAABB(Player *player, Asteroid *asteroid) {     return (player-&gt;GetSizes()[0] &lt; asteroid-&gt;GetSizes()[1] && player-&gt;GetSizes()[1] &gt; asteroid-&gt;GetSizes()[0] &&             player-&gt;GetSizes()[2] &lt; asteroid-&gt;GetSizes()[3] && player-&gt;GetSizes()[3] &gt; asteroid-&gt;GetSizes()[2]); }  void Game::ProcessCollision(Player *player, Asteroid *asteroid) {     _booms.push_back(new Boom(asteroid-&gt;GetCoord().x, asteroid-&gt;GetCoord().y));     player-&gt;SetIsRendering(false);     player-&gt;SetIsGhost(true);     player-&gt;SetLives(player-&gt;GetLives() - 1);     player-&gt;SetCoord(0.0f, 0.0f);     player-&gt;SetDeadTime(std::chrono::high_resolution_clock::now()); }  void Game::Resize(float width, float height) {     _aspectRatio = (float)width \/ (float)height;     _halfWidth = _aspectRatio * _halfHeight;     _width = width;     _height = height;     _render-&gt;Resize(); }  Controls *Game::GetControls() {     return _controls; }  bool Game::GetIsPaused() { \treturn _isPaused; }  void Game::SetIsPaused(bool isPaused) { \t_isPaused = isPaused; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Game.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>#include &lt;Game.h&gt; #include &lt;Controls.h&gt;  #include &lt;tuple&gt;  Game::Game() {     isLevelRunning = true;      ResetLogic();     RequestRestart();      Renderer::InitInternals();     Controls::Init();     Score::Init(); }  Game& Game::Get() {     static Game instance;     return instance; }  void Game::Restart() {     objects.clear();     Score::OnRestart();     ResetLogic();     GameObject::Create&lt;Ship&gt;();     SpawnAsteroids(Constant::asteroidTargetCount); }  \/\/\u0412\u043d\u0443\u0442\u0440\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u043e\u043c, \u0430 \u043d\u0430\u0440\u0443\u0436\u0443 \u0432\u044b\u0434\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f (false - \u043d\u0430 \u043f\u0430\u0443\u0437\u0435) bool Game::IsLevelRunning(float dt) {     if(wantRestart) {         if(restartTimer &lt; 0.0) {             if(isLevelRunning) {                 Restart();                 wantRestart = false;             }         } else {             restartTimer -= dt;         }     }     return isLevelRunning; }  void Game::Update() {     float deltaTime = timer.Tick();      if(IsLevelRunning(deltaTime)) {         for(auto& go : objects) {             go-&gt;Update(deltaTime);         }          DetectCollisions(deltaTime);          DestroyRequestedObjects(); \/\/\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0434\u0435\u0441\u044c     }      Renderer::Draw(); }  void Game::OnGLInit() {     Renderer::InitGLContext(); }  void Game::OnResolutionChange(int w, int h) {     Renderer::OnResolutionChange(w, h);     Controls::Resize();     Score::Resize(); }  GameObject& Game::AddGameObject(std::unique_ptr&lt;GameObject&gt; obj) {     objects.push_back(std::move(obj));     return *objects.back().get(); }  void Game::DestroyRequestedObjects() {     for(auto i = objects.begin(); i != objects.end();) {         if((*i)-&gt;isDestructionRequested()) {             i = objects.erase(i);         } else {             ++i;         }     } }  void Game::DetectCollisions(float dt) {     for(auto a = objects.begin(); a != objects.end(); ++a) {         for(auto b = std::next(a); b != objects.end(); ++b) { \/\/\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0430\u0440\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432             GameObject& ra = **a;             GameObject& rb = **b;             if(CollisionMask(ra, rb)) { \/\/\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f                 if(DetectCollision(ra, rb, dt)) { \/\/\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c                     if(RefineCollision(ra, rb, dt)) { \/\/\u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u044b\u0439                         ra.OnCollision(rb);                         rb.OnCollision(ra);                     }                 }             }         }     } }   bool Game::CollisionMask(const GameObject& a, const GameObject& b) {     \/\/\u0415\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0436\u0435 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d, \u0442\u043e \u043e\u043d \u043d\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 (return false)     return !(a.isDestructionRequested() || b.isDestructionRequested()) &&     \/\/\u0415\u0441\u043b\u0438 \u043d\u0438 \u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c false     (a.CollisionMask(b.getStaticType()) || b.CollisionMask(a.getStaticType())); }  \/\/\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439 \u043f\u043e \u0440\u0430\u0434\u0438\u0443\u0441\u0443 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \/\/\u0412 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0430\u0434\u0438\u0443\u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0439\u0442\u0438 \u0437\u0430 \u0432\u0440\u0435\u043c\u044f dt bool Game::DetectCollision(const GameObject& a, const GameObject& b, float dt) {     if(Constant::continuousCollisions) {         return (a.getPosition() - b.getPosition()).getLength() &lt;             a.getRadius() + b.getRadius() + (a.getVelocity().getLength() + b.getVelocity().getLength()) * dt;     } else {         return (a.getPosition() - b.getPosition()).getLength() &lt; a.getRadius() + b.getRadius();     } }  bool Game::RefineCollision(const GameObject& a, const GameObject& b, float dt) {     if(Constant::refineCollisions) {         const Model& am = a.getModel();         const std::vector&lt;GLfloat&gt;& av = am.getTransformed();         const std::vector&lt;GLubyte&gt;& ai = am.getIndices();         const Vec2 aBackVel = a.getVelocity() * -1;         const Model& bm = b.getModel();         const std::vector&lt;GLfloat&gt;& bv = bm.getTransformed();         const std::vector&lt;GLubyte&gt;& bi = bm.getIndices();         const Vec2 bBackVel = b.getVelocity() * -1;          \/\/\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0430\u0440\u044b \u043e\u0442\u0440\u0435\u0437\u043a\u043e\u0432, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u0430         for(int i = 0; i &lt; ai.size(); i += 2) {             Vec2 a0(i, av, ai);             Vec2 at = Vec2(i + 1, av, ai) - a0;             for(int j = 0; j &lt; bi.size(); j += 2) {                 Vec2 b0(j, bv, bi);                 Vec2 bt = Vec2(j + 1, bv, bi) - b0;                 if(Constant::continuousCollisions ?                     \/\/\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u0447\u0438\u0442\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u0442\u0440\u0435\u0437\u043a\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 t0,                     \/\/\u043d\u043e \u043d\u0430\u0448\u0438 \u043e\u0442\u0440\u0435\u0437\u043a\u0438 \u0443\u0436\u0435 \u0432 t0+dt, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0441\u043e \u0437\u043d\u0430\u043a\u043e\u043c -                     MovingSegmentCollision(a0, at, aBackVel, b0, bt, bBackVel, dt) :                     SegmentCollision(a0, at, b0, bt)) return true;             }         }         return false;     } else {         return true;     } }  bool Game::SegmentCollision(Vec2 p, Vec2 r, Vec2 q, Vec2 s) {     \/\/http:\/\/stackoverflow.com\/a\/565282\/2502024     float det = Vec2::CrossProd2D(r, s);     if(fabs(det) &gt; Constant::smallNumber) {         Vec2 diff = q - p;         float f = Vec2::CrossProd2D(diff, s \/ det);         float g = Vec2::CrossProd2D(diff, r \/ det);         return f &gt;= 0 && f &lt;= 1 && g &gt;= 0 && g &lt;= 1;     }     return false; }  bool Game::MovingSegmentCollision(Vec2 p, Vec2 r, Vec2 vp, Vec2 q, Vec2 s, Vec2 vq, float dt) {     float det = Vec2::CrossProd2D(r, s);     if(fabs(det) &gt; Constant::smallNumber) {         const Vec2 v = vq - vp;         const Vec2 diff = q - p;         \/\/\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c:         \/\/q = q0 + v*t, t in [0, dt]         \/\/(v.x * s.y - v.y * s.x) * t + ((q.x - p.x) * s.y - (q.y - p.y) * s.x)          \/\/\u0422\u043e\u0447\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f f \u0438 g \u0438\u0437 SegmentCollision \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 t.         \/\/\u041e\u0442\u0440\u0435\u0437\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0432 \u0442\u043e\u0447\u043a\u0435 t \u0438\u0437 [0, dt], \u0435\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0435 t,         \/\/\u0447\u0442\u043e f \u0438 g \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043b\u0435\u0436\u0430\u0442 \u0432 [0, 1]. \u0422.\u0435. \u0440\u0435\u0448\u0430\u0435\u043c 3 \u043f\u0430\u0440\u044b \u043d\u0435\u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e t         auto getInequation = [=](Vec2 dir)-&gt;std::tuple&lt;float, float&gt; {             \/\/0 &lt;= a*t + cp &lt;= 1             float cp = Vec2::CrossProd2D(diff, dir \/ det);             float a = Vec2::CrossProd2D(v, dir \/ det);             float left = -cp, right = 1 - cp;             if(fabs(a) &lt; Constant::smallNumber) {                 if(cp &gt;= 0 && cp &lt;= 1) {                     left = 0;                     right = dt;                 } else {                     left = dt + 1;                     right = -1;                 }             } else {                 left \/= a;                 right \/= a;                 if(a &lt; 0) std::swap(left, right);             }             return std::make_tuple(left, right);         };          float ls, rs, lr, rr;         \/\/ls &lt;= t &lt;= rs         std::tie(ls, rs) = getInequation(s);         \/\/lr &lt;= t &lt;= rr         std::tie(lr, rr) = getInequation(r);          \/\/\u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441 0 &lt;= t &lt;= dt         float mx = std::max(0.f, std::max(ls, lr));         float mn = std::min(dt, std::min(rs, rr));         return mx &lt;= mn;     }     return false; }  void Game::RequestRestart(float t) {     wantRestart = true;     restartTimer = t; }  void Game::Pause() {     isLevelRunning = false;     Controls::onPause(); }  void Game::Resume() {     isLevelRunning = true;     Controls::onResume();     timer.Tick(); }  void Game::SetPlayerPos(const Ship& player) {     playerPos = player.getPosition(); }  Vec2 Game::GetPlayerPos() {     return playerPos; }  void Game::AddPoints(int pointsToAdd) {     Score::AddPoints(pointsToAdd); }  void Game::DecAsteroidCount(const Asteroid& a) {     asteroidCount--;     if(asteroidCount == Constant::asteroidUfoCount * 2 && !isUfoPresent) {         GameObject::Create&lt;UFO&gt;(GetUfoSpawn());     }     if(asteroidCount &lt;= Constant::asteroidRespawnCount * 2) {         SpawnAsteroids(Constant::asteroidTargetCount - Constant::asteroidRespawnCount);     } }  \/\/\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u043d\u0430 2, \u0442.\u043a. asteroidCount \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043f\u043e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0430\u0441\u0442\u0435\u0440\u043e\u0438\u0434\u0430 void Game::IncAsteroidCount(const Asteroid& a) {     asteroidCount += 2; }  void Game::ResetLogic() {     asteroidCount = 0;     isUfoPresent = false; }  void Game::SpawnAsteroids(int n) {     for(int i = 0; i &lt; n; ++i) {         GameObject::Create&lt;Asteroid&gt;(GetSpawnPosition());     } }  \/\/\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0430\u0441\u0442\u0435\u0440\u043e\u0438\u0434 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0441\u0440\u0430\u0437\u0443 \u043d\u0435 \u0443\u0431\u0438\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u0430 (\u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0437\u0430\u0446\u0438\u043a\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438\u0433\u0440\u043e\u0432\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442) Transform Game::GetSpawnPosition() {     std::uniform_real_distribution&lt;float&gt; zone(-Constant::asteroidSpawnZone, Constant::asteroidSpawnZone);     Vec2 pos(Constant::worldRatio + 0.2, 1.2);     if(fabs(playerPos.x) &gt; Constant::asteroidSpawnZone &&          fabs(playerPos.y) &lt; Constant::asteroidSpawnZone) {         pos.y = zone(Random::generator);     } else if(fabs(playerPos.x) &lt; Constant::asteroidSpawnZone &&                 fabs(playerPos.y) &gt; Constant::asteroidSpawnZone) {         pos.x = zone(Random::generator);     } else {         if(Random::flipCoin()) {             pos.x = zone(Random::generator);         } else {             pos.y = zone(Random::generator);         }     }     return Transform(pos); }  Transform Game::GetUfoSpawn() {     std::uniform_real_distribution&lt;float&gt; zone(-Constant::ufoZone, Constant::ufoZone);     return Transform((Constant::worldRatio + 0.12) * (playerPos.x &gt; 0 ? -1 : 1), zone(Random::generator)); }  void Game::OnUfoCreated(const UFO& u) {     isUfoPresent = true; }  void Game::OnUfoDestroyed(const UFO& u) {     isUfoPresent = false; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">model_handler.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>#include &quot;model_handler.h&quot;  #include &lt;time.h&gt; #include &lt;math.h&gt; #include &lt;cstdlib&gt;  using namespace model;  namespace {     const double tickTime = 40.00;      const unsigned int asteroidNumber = 8;     const float projectileSpeed = 10.0;      const float smallAsteroidRadiusK =  1.5;     const float minLargeAsteroidRadius = 35.0;     const float maxLargeAsteroidRadius = minLargeAsteroidRadius * smallAsteroidRadiusK - 1.0;     const float minAsteroidSpeed = 1.5;     const float maxAsteroidSpeed = 6.5;      const float explosionK = 50000.0;  }  ModelHandler::ModelHandler(float worldWidth, float worldHeight):     _isGameOver(false),     _worldWidth(worldWidth),     _worldHeight(worldHeight),     _tickTime(0),     _ship(ShipPtr(new Ship(Point(worldWidth \/ 2.0, worldHeight \/ 2.0)))) {      srand(time(0)); }  void ModelHandler::newGame() {     _asteroids.clear();     _projectiles.clear();     _ship.reset(new Ship(Point(_worldWidth \/ 2.0, _worldHeight \/ 2.0)));     _isGameOver = false; }  bool ModelHandler::isGameOver() const {     return _isGameOver; }  void ModelHandler::update(double deltaTime) {     if (this-&gt;isGameOver()) return;      _tickTime += deltaTime;     while (_tickTime &gt; tickTime) {          if (_asteroids.size() &lt; ::asteroidNumber) {             this-&gt;addAsteroid();         }          for (ObjectPtr& obj: this-&gt;allObjects()) {             obj-&gt;move();         }          this-&gt;checkObjects(&_asteroids);         this-&gt;checkObjects(&_projectiles);          if (!this-&gt;withinBoundaries(_ship)) {             this-&gt;removeShip();         }          _tickTime -= tickTime;     } }  ShipPtr ModelHandler::ship() const {     return _ship; }  void ModelHandler::removeShip() {     _isGameOver = true; }  void ModelHandler::removeAsteroid(const AsteroidPtr& asteroid) {     if (asteroid-&gt;collisionRadius() &gt;= ::minLargeAsteroidRadius) {          const model::Vector v1(asteroid-&gt;velocity()                                + model::Vector(-asteroid-&gt;velocity().y, asteroid-&gt;velocity().x));         const model::Vector v2(asteroid-&gt;velocity()                                + model::Vector(asteroid-&gt;velocity().y, -asteroid-&gt;velocity().x));          this-&gt;addAsteroid(asteroid, v1);         this-&gt;addAsteroid(asteroid, v2);     }     _asteroids.remove(asteroid); }  void ModelHandler::addAsteroid(const AsteroidPtr& asteroid) {     _asteroids.push_back(asteroid); }  std::list&lt;AsteroidPtr&gt; ModelHandler::asteroids() const {     return _asteroids; }  std::list&lt;ProjectilePtr&gt; ModelHandler::projectiles() const {     return _projectiles; }  void ModelHandler::removeProjectile(const ProjectilePtr& projectile) {     _projectiles.remove(projectile); }  void ModelHandler::addProjectile() {     Vector projectileSpeed = _ship-&gt;direction() * ::projectileSpeed + ship()-&gt;velocity();     _projectiles.push_back(ProjectilePtr(new Projectile(_ship-&gt;point(), projectileSpeed))); }  void ModelHandler::processHit(const ProjectilePtr& projectile, const AsteroidPtr& asteroid) {     if (asteroid-&gt;collisionRadius() &gt;= ::minLargeAsteroidRadius) {         const Vector ox = asteroid-&gt;velocity().normaVector();         Vector explosionVector(ox.y, -ox.x);          if (ox * asteroid-&gt;velocity() &lt; 0) {             explosionVector = explosionVector * (-1.0);         }          const Vector v1(asteroid-&gt;velocity() + model::Vector(-asteroid-&gt;velocity().y, asteroid-&gt;velocity().x)                         + explosionVector * (-::explosionK \/ asteroid-&gt;mass()));         const Vector v2(asteroid-&gt;velocity() + model::Vector(asteroid-&gt;velocity().y, -asteroid-&gt;velocity().x)                         + explosionVector * (::explosionK \/ asteroid-&gt;mass()));          this-&gt;addAsteroid(asteroid, v1);         this-&gt;addAsteroid(asteroid, v2);     }     _projectiles.remove(projectile);     _asteroids.remove(asteroid); }  std::list&lt;ObjectPtr&gt; ModelHandler::allObjects() const {     std::list&lt;ObjectPtr&gt; objects;     objects.insert(objects.end(), _asteroids.begin(), _asteroids.end());     objects.insert(objects.end(), _projectiles.begin(), _projectiles.end());     objects.push_back(_ship);     return objects; }  void ModelHandler::addAsteroid() {      const float r = common::rangeRand(::minLargeAsteroidRadius, ::maxLargeAsteroidRadius);      Point point;     bool isCorrect = false;     while (!isCorrect) {         point = randPoint(r);         isCorrect = true;         for (const AsteroidPtr& asteroid : _asteroids) {             const float d = model::distance(asteroid-&gt;point(), point);             if (d &lt; (asteroid-&gt;collisionRadius() + r)) {                 isCorrect = false;                 break;             }         }     }      const float distToCenter = ::distance(point.x, point.y, _worldWidth \/ 2.0, _worldHeight \/ 2.0);     const float vx = (_worldWidth \/ 2.0 - point.x) \/ distToCenter             * common::rangeRand(::minAsteroidSpeed, ::maxAsteroidSpeed);     const float vy = (_worldHeight \/ 2.0 - point.y) \/ distToCenter             * common::rangeRand(::minAsteroidSpeed, ::maxAsteroidSpeed);      _asteroids.push_back(AsteroidPtr(new Asteroid(point, r, Vector(vx, vy)))); }  void ModelHandler::addAsteroid(const AsteroidPtr& oldAsteroid, const Vector& newVelocity) {     Point point = oldAsteroid-&gt;point();     point.move(newVelocity.normaVector() * oldAsteroid-&gt;collisionRadius());     _asteroids.push_back(AsteroidPtr(new Asteroid(point, oldAsteroid-&gt;collisionRadius()                                                   \/ ::smallAsteroidRadiusK, newVelocity))); }  Point ModelHandler::randPoint(float r) const {     float x = 0;     float y = 0;     switch (rand() % 4) {     case 0:         x = common::rangeRand(0 - r, _worldWidth + r);         y = 0 - r;         break;     case 1:         x = common::rangeRand(0 - r, _worldWidth + r);         y = _worldHeight - r;         break;     case 2:         x = 0 - r;         y = common::rangeRand(0 - r, _worldHeight + r);         break;     case 3:         x = _worldWidth + r;         y = common::rangeRand(0 - r, _worldHeight + r);         break;     default:         break;     }      return Point(x, y); }  bool ModelHandler::withinBoundaries(const ObjectPtr& obj) const {     return (obj-&gt;x() &gt; (0 - _worldWidth * 0.1) && obj-&gt;x() &lt; (_worldWidth * 1.1)             && obj-&gt;y() &gt; (0 - _worldHeight * 0.1) && obj-&gt;y() &lt; (_worldHeight * 1.1)); }  template&lt;class T&gt; void ModelHandler::checkObjects(std::list&lt;T&gt;* objects) {     typename std::list&lt;T&gt;::iterator it = objects-&gt;begin();     while (it != objects-&gt;end())     {         if (!this-&gt;withinBoundaries(*it)) {             it = objects-&gt;erase(it++);         } else {             ++it;         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0441\u0440\u0435\u0434\u0438 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f. \u0412\u0441\u0435\u0445 \u0430\u0432\u0442\u043e\u0440\u043e\u0432 \u043c\u044b \u043f\u043e\u0437\u0432\u0430\u043b\u0438 \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435. \u0421\u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0433\u0430\u0434\u0430\u0442\u044c, \u0447\u0435\u043c \u043e\u0434\u0438\u043d \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u043b\u0441\u044f \u043e\u0442 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445? \u0414\u043b\u044f \u043c\u0435\u043d\u044f \u044d\u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u044f \u0432\u0438\u0436\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435, \u043d\u043e \u0434\u0440\u0443\u0437\u044c\u044f \u043d\u0435 \u0432\u0435\u0440\u044f\u0442.      \t<\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/254009\/\"> http:\/\/habrahabr.ru\/post\/254009\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>     \t\u041f\u0440\u0438\u0432\u0435\u0442!<\/p>\n<p>   <a href=\"http:\/\/habrahabr.ru\/users\/23derevo\/\" class=\"user_link\">23derevo<\/a> \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435\u043c \u043d\u0430 Mobius \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043c\u0435\u043d\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 Zeptolab.<\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/5d5\/481\/c50\/5d5481c50ef64895b185a6537706b1fd.jpg\"\/><\/p>\n<p>  \u041d\u0430\u0447\u043d\u0443 \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u043d\u0430 C++ \u0438 \u043d\u0430 \u0441\u0432\u043e\u0451\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435, \u043e\u0442 \u043b\u044e\u0431\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 OpenGL. \u0414\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \u0441 \u043d\u0443\u043b\u044f \u0441\u0442\u0440\u043e\u0438\u043c \u0441\u0432\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0441\u0432\u043e\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044b \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u0437\u044f\u0442\u044c \u0434\u0435\u0432\u0435\u043b\u043e\u043f\u0435\u0440\u0430 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0432 \u0442\u0435\u043e\u0440\u0438\u0438, \u0435\u043c\u0443 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u043f\u043b\u044e\u0441\u044b. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u044d\u0442\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0435 \u0442\u0430\u043a. <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-253826","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/253826","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=253826"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/253826\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=253826"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=253826"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=253826"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}