{"id":349880,"date":"2023-07-06T15:02:59","date_gmt":"2023-07-06T15:02:59","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=349880"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=349880","title":{"rendered":"<span>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u043f\u0435\u0440\u0432\u0443\u044e \u0438\u0433\u0440\u0443 \u043d\u0430 Godot 3.5 (\u0447\u0430\u0441\u0442\u044c 3)<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/745716\/\" rel=\"noopener noreferrer nofollow\"><u>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c<\/u><\/a><\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/745956\/\" rel=\"noopener noreferrer nofollow\"><u>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0432\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u044c<\/u><\/a><\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u043f\u0435\u0440\u0432\u0443\u044e \u0438\u0433\u0440\u0443 \u043d\u0430 Godot 3.5. \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0438 \u0434\u043b\u044f \u043e\u0440\u0443\u0436\u0438\u044f, \u043d\u0435\u0447\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435\u0435 \u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e \u0438 \u0441\u0446\u0435\u043d\u0443 \u0438\u0433\u0440\u044b. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u0433\u0440\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439, \u043c\u0435\u043d\u044e \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430, \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0431\u0443\u0434\u0435\u043c \u0432\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0439 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u043b\u0438\u0434\u0435\u0440\u0431\u043e\u0440\u0434, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0430\u0433\u043e\u0432 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0430\u043c\u0438, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043c\u0443\u0437\u044b\u043a\u0443 \u043a \u043d\u0430\u0448\u0435\u0439 \u0438\u0433\u0440\u0435 \u0438 \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441\u0446\u0435\u043d\u0443 \u0438\u0433\u0440\u044b.<\/p>\n<h2>\u041f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0438<\/h2>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0440\u0438\u0441\u0443\u0435\u043c \u0435\u0449\u0451 3-\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439. \u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430\u043c\u0438 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u043c \u0438\u043c\u0438 \u043e\u0440\u0443\u0436\u0438\u0435 \u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0438 \u0432 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0430\u0445( \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c, \u0445\u043f), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0449\u0451 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0443 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0443 \u0443\u0440\u043e\u043d\u0430, \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u0442\u0441\u044f \u0443\u0440\u043e\u043d \u043e\u0440\u0443\u0436\u0438\u044f.<\/p>\n<h3>\u0421\u0438\u043d\u0433\u043b\u0442\u043e\u043d WeaponsName<\/h3>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0447\u043d\u0451\u043c \u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0433\u043e \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0441\u0435\u0431\u0435 \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442(\u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u0446\u0435\u043d\u044b \u043e\u0440\u0443\u0436\u0438\u044f) \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u043c \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u043c.<\/p>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/935\/514\/5ef\/9355145efa0efe8d7e5565c76d871218.png\" width=\"418\" height=\"330\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/935\/514\/5ef\/9355145efa0efe8d7e5565c76d871218.png\"\/><\/figure>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b Node \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0435\u0433\u043e \u0432 \u043f\u0430\u043f\u043a\u0443 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432. \u0412 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u044b. \u041f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 -> \u0410\u0432\u0442\u043e\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0443\u0442\u044c \u043a \u043d\u0430\u0448\u0435\u043c\u0443 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u0443, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0438 \u0441\u0442\u0430\u0432\u0438\u043c \u0433\u0430\u043b\u043e\u0447\u043a\u0443 \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435 &#171;\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f&#187;.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u043a\u0440\u0438\u043f\u0442\u0430. \u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u044b \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u0440\u0443\u0436\u0438\u044f:<\/p>\n<pre><code class=\"python\">extends Node #\u0423 \u0432\u0430\u0441 \u043f\u0443\u0442\u044c \u043a \u0441\u0446\u0435\u043d\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0447\u0442\u043e #\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0435 \u0441\u0441\u044b\u043b\u043a\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u043e\u0440\u0443\u0436\u0438\u0435.tscn \u043d\u0435 \u043d\u0430 .gd \u0438\u043b\u0438 \u043d\u0435 \u043d\u0430 \u043f\u0443\u043b\u044f.tscn const BLASTER = preload(\"res:\/\/scenes\/Weapons\/Blaster\/Blaster.tscn\") const SHOTGUN = preload(\"res:\/\/scenes\/Weapons\/Shotgun\/Shotgun.tscn\") const RIFLE = preload(\"res:\/\/scenes\/Weapons\/Rifle\/Rifle.tscn\") const BAZOOKA = preload(\"res:\/\/scenes\/Weapons\/Bazooka\/Bazooka.tscn\")<\/code><\/pre>\n<h3>DefaultCharacter<\/h3>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0439 \u0431\u043e\u043b\u0432\u0430\u043d\u043a\u0438. \u0412 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 DefaultCharacter, \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0443\u0440\u043e\u043d\u0430 \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a \u043f\u0443\u0441\u0442\u044b\u043c.<\/p>\n<pre><code class=\"python\">export var damage_scale:float = 1#\u041c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \u0443\u0440\u043e\u043d\u0430 var backpack_items = [null,null,null,null,null,null]#\u0440\u044e\u043a\u0437\u0430\u043a<\/code><\/pre>\n<p>\u0422\u0430\u043a-\u0436\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442, \u0443\u0440\u043e\u043d, \u043d\u0443\u0436\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0443\u0440\u043e\u043d \u043e\u0440\u0443\u0436\u0438\u044f, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e equip_item():<\/p>\n<pre><code class=\"python\">#\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f \u043e\u0440\u0443\u0436\u0438\u044f func equip_item(slot):# \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u0435 if (backpack_items[slot] != null):#\u0415\u0441\u043b\u0438 \u0441\u043b\u043e\u0442 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d var weapon = backpack_items[slot].instance() weapon.position = _backpack.get_slot_position(slot)#\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0443\u044e \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0442\u0430 weapon.name = \"WeaponSlot\" + String(slot)#\u0418\u043c\u0435\u043d\u044f \u043e\u0440\u0443\u0436\u0438\u044f WeaponSlot0..5 add_child(weapon) weapon.scale = Vector2(0.5,0.5)# \u0443 \u043c\u0435\u043d\u044f \u0441\u0442\u043e\u0438\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u0435, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 weapon.damage = ceil(weapon.damage*damage_scale)#\u041f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u0443\u0440\u043e\u043d \u0441 \u043d\u0430\u0448\u0438\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c \u0438 \u043e\u043a\u0440\u0443\u0433\u043b\u044f\u0435\u043c \u0432 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443<\/code><\/pre>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/996\/67c\/e81\/99667ce81dc2312bf5f42e2ffe9bbbf1.png\" width=\"224\" height=\"242\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/996\/67c\/e81\/99667ce81dc2312bf5f42e2ffe9bbbf1.png\"\/><\/figure>\n<p> \u0422\u0430\u043a-\u0436\u0435 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u043c \u043a Camera2D \u0434\u043e\u0447\u0435\u0440\u043d\u044e\u044e \u0441\u0446\u0435\u043d\u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0433\u0440\u044b. \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c \u0443\u0437\u0435\u043b \u0432 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u0443\u0433\u043e\u043b \u043a\u0430\u043c\u0435\u0440\u044b. \u0422\u0430\u043a-\u0436\u0435 \u0443\u0431\u0435\u0440\u0451\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 \u0441 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0446\u0435\u043d\u044b \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u044d\u0442\u043e \u0432 \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e take_damage(dmg)<\/p>\n<pre><code class=\"python\">#\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 func take_damage(dmg): if(_immortal_timer.is_stopped()): #\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0435 \u0431\u0435\u0441\u0441\u043c\u0435\u0440\u0442\u0435\u043d \u043b\u0438 \u043d\u0430\u0448 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436 health -= dmg _animated_sprite.play(\"TakeDamage\") emit_signal(\"take_damage\",dmg) #\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0443\u0440\u043e\u043d\u0430 _user_interface.take_damage(dmg) _immortal_timer.start() #\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0430\u0439\u043c\u0435\u0440 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 if(health == 0): emit_signal(\"dead\")#\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u0441\u043c\u0435\u0440\u0442\u0438<\/code><\/pre>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439 \u0442\u0430\u043a-\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e, \u043a\u0430\u043a \u0438 \u043e\u0440\u0443\u0436\u0438\u0435 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u0443\u044e \u0441\u0446\u0435\u043d\u0443, \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c \u0441\u0446\u0435\u043d\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0431\u043e\u043b\u0432\u0430\u043d\u043a\u0443 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430, \u043c\u0435\u043d\u044f\u0435\u043c \u0435\u043c\u0443 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c SpriteFrame \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043c\u0443\u0437\u044b\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0442\u0435\u043c\u0443 \u0438 \u0420\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442.<\/p>\n<p>\u0412 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0440\u0443\u0436\u0438\u044f \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0443 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 _ready():<\/p>\n<pre><code>func _ready(): add_equip_item(WeaponsName.BLASTER) #\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0432 \u043d\u0435\u044e # \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0438\u0437 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u0430<\/code><\/pre>\n<p>\u041f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430\u043c\u0438. \u041d\u0438\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043c\u043e\u0438\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u041f\u0435\u0440\u0441\u043e\u043d\u0430\u0436<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0440\u0443\u0436\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0425\u041f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0423\u0440\u043e\u043d<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">BrutalHero<\/p>\n<\/td>\n<td>\n<p align=\"left\">1x\u0411\u043b\u0430\u0441\u0442\u0435\u0440<\/p>\n<\/td>\n<td>\n<p align=\"left\">5<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">200<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Cowboy<\/p>\n<\/td>\n<td>\n<p align=\"left\">1x\u0414\u0440\u043e\u0431\u043e\u0432\u0438\u043a<\/p>\n<\/td>\n<td>\n<p align=\"left\">3<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.5<\/p>\n<\/td>\n<td>\n<p align=\"left\">150<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Robot<\/p>\n<\/td>\n<td>\n<p align=\"left\">1x\u0412\u0438\u043d\u0442\u043e\u0432\u043a\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">10<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.75<\/p>\n<\/td>\n<td>\n<p align=\"left\">300<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Soldier<\/p>\n<\/td>\n<td>\n<p align=\"left\">1x\u0411\u0430\u0437\u0443\u043a\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">5<\/p>\n<\/td>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">150<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u0421\u0438\u043d\u0433\u043b\u0442\u043e\u043d CharacterNames<\/h3>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4aa\/468\/46b\/4aa46846baab47f6839ea10763c2b1df.png\" width=\"421\" height=\"331\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4aa\/468\/46b\/4aa46846baab47f6839ea10763c2b1df.png\"\/><\/figure>\n<p>\u041f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0435\u0433\u043e \u0432 \u0442\u0443 \u0436\u0435 \u043f\u0430\u043f\u043a\u0443, \u0447\u0442\u043e \u0438 \u0434\u0432\u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u0430 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0432 \u0430\u0432\u0442\u043e\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e.<\/p>\n<pre><code class=\"python\">extends Node  const BRUTALHERO = preload(\"res:\/\/scenes\/Character\/BrutalHero\/BrutalHero.tscn\") const COWBOY = preload(\"res:\/\/scenes\/Character\/Cowboy\/Cowboy.tscn\") const SOLDIER = preload(\"res:\/\/scenes\/Character\/Soldier\/Soldier.tscn\") const ROBOT = preload(\"res:\/\/scenes\/Character\/Robot\/Robot.tscn\") <\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0441 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430\u043c\u0438 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c\u0443 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043e\u0440\u0443\u0436\u0438\u044f.<\/p>\n<h2>\u041e\u0440\u0443\u0436\u0438\u0435<\/h2>\n<p>\u0412 \u043e\u0440\u0443\u0436\u0438\u0435 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u0432\u0443\u043a\u0438 \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0430.<\/p>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e5a\/d8b\/838\/e5ad8b838d94bdfffa1338a454c2d6ea.png\" width=\"219\" height=\"109\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e5a\/d8b\/838\/e5ad8b838d94bdfffa1338a454c2d6ea.png\"\/><\/figure>\n<p>\u041d\u0430 \u0441\u0446\u0435\u043d\u0443 \u0431\u043e\u043b\u0432\u0430\u043d\u043a\u0443 \u0434\u043b\u044f \u043e\u0440\u0443\u0436\u0438\u044f \u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c AudioStreamPlayer(WeaponSound). \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u0432\u0443\u043a\u0430 \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0430 \u043e\u0440\u0443\u0436\u0438\u044f. \u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043c\u0443\u0437\u044b\u043a\u0443 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c WeaponSound \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0412 \u0438\u043d\u0441\u043f\u0435\u043a\u0442\u043e\u0440\u0435 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 Stream \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0441\u0432\u043e\u0439 \u0444\u0430\u0439\u043b \u0441 \u043c\u0443\u0437\u044b\u043a\u043e\u0439, \u0434\u043b\u044f \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0430, \u043b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c .wav \u0444\u0430\u0439\u043b\u044b, \u0434\u043b\u044f \u0444\u043e\u043d\u043e\u0432\u043e\u0439 \u043c\u0443\u0437\u044b\u043a\u0438, \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 .ogg \u0444\u043e\u0440\u043c\u0430\u0442, \u043d\u043e \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 wav \u0438\u043b\u0438 mp3, \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0433\u043e, \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u0438 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0439 \u043e\u0442 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442.<\/p>\n<p>\u0418 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u043a\u0440\u0438\u043f\u0442\u0430, \u0432 \u043d\u0451\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0443\u044e\u0441\u044f \u043d\u0430 WeaponSound:<\/p>\n<pre><code class=\"python\">onready var _weapon_sound = $WeaponSound<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0446\u0435\u043d\u0435 \u0441 \u043e\u0440\u0443\u0436\u0438\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0432\u0443\u043a \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0430 \u043e\u0442 \u043e\u0440\u0443\u0436\u0438\u044f \u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e fire() \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0440\u0443\u0436\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c:<\/p>\n<pre><code class=\"python\">_weapon_sound.play()<\/code><\/pre>\n<p>\u0422\u0430\u043a-\u0436\u0435 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c \u0437\u0432\u0443\u043a\u0430, \u043e\u043d\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f, \u043d\u043e \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0433\u043b\u0443\u0448\u0438\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u0430. \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0438\u043b\u0438 \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0443\u0442\u0451\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 Volume dB, \u0443 \u0443\u0437\u043b\u0430 AudioPlayer.<\/p>\n<h3>\u0411\u0430\u0437\u0443\u043a\u0430<\/h3>\n<p>\u041d\u0430 \u0431\u0430\u0437\u0443\u043a\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0432\u0443\u043a \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0430 \u0441\u043d\u0430\u0440\u044f\u0434\u0430, \u043d\u043e \u0438 \u0437\u0432\u0443\u043a \u0432\u0437\u0440\u044b\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f. <\/p>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d83\/7e9\/cb0\/d837e9cb0be61de849caefb311838504.png\" width=\"227\" height=\"221\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d83\/7e9\/cb0\/d837e9cb0be61de849caefb311838504.png\"\/><\/figure>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043d\u0430 \u0441\u0446\u0435\u043d\u0443 \u0440\u0430\u043a\u0435\u0442\u044b \u0431\u0430\u0437\u0443\u043a\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c AudioStreamPlayer(BumSound), \u043a\u0430\u043a \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443 Bum<\/p>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043a\u043e\u0434\u0430:<\/p>\n<p>\u041d\u0443\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0443\u0437\u0435\u043b BumSound \u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0437\u0432\u0443\u043a \u0432\u0437\u0440\u044b\u0432\u0430 \u0432 collision_action:<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0440\u0430\u043a\u0435\u0442\u044b<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">extends \"res:\/\/scenes\/Weapons\/DefaultWeapon\/DefaultBullet.gd\"  onready var _collision_shape = $CollisionShape2D#\u0424\u0438\u0433\u0443\u0440\u0430 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439 \u0440\u0430\u043a\u0435\u0442\u044b onready var _collision_shape_bum = $Bum\/CollisionShapeBum#\u0424\u0438\u0433\u0443\u0440\u0430 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439 \u0432\u0437\u0440\u044b\u0432\u0430 onready var _bum_live_time = $Bum\/BumLiveTime #\u0422\u0430\u0439\u043c\u0435\u0440 \u0436\u0438\u0437\u043d\u0438 \u0432\u0437\u0440\u044b\u0432\u0430 onready var _bum_sound = $Bum\/BumSound #\u0417\u0432\u0443\u043a \u0432\u0437\u0440\u044b\u0432\u0430  func collision_action(_collision_object):# \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0441\u043d\u0430\u0440\u044f\u0434\u0430 if(_animated_sprite.animation == \"Fly\"):# \u0435\u0441\u043b\u0438 \u043e\u043d \u0431\u044b\u043b \u0441\u043d\u0430\u0440\u044f\u0434\u043e\u043c _animated_sprite.play(\"Bum\")# \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0432 \u0432\u0437\u0440\u044b\u0432 _collision_shape.disabled = true # \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u0444\u0438\u0433\u0443\u0440\u0443 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f _collision_shape_bum.disabled = false # \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0444\u0438\u0433\u0443\u0440\u0443 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0432\u0437\u0440\u044b\u0432\u0430 scale = Vector2(10,10)  # \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0432 10 \u0440\u0430\u0437,  #\u0443 \u0432\u0430\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437, \u0434\u043b\u044f \u043c\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044d\u0442\u043e \u0432 \u0441\u0430\u043c\u044b\u0439 \u0440\u0430\u0437 velocity=Vector2(position.x,position.y) _bum_live_time.start() _bum_sound.play() func _on_Bum_body_entered(body): if(body.has_method(\"hit\")): body.hit(damage)   func _on_BumLiveTime_timeout(): queue_free()<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u0412\u0440\u0430\u0433\u0438<\/h2>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u043e\u043c\u0431\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0434\u0451\u0442 \u043d\u0430 \u0438\u0433\u0440\u043e\u043a\u0430 \u0438 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u0443\u0434\u0430\u0440\u0438\u0442\u044c. \u041c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0449\u0451 4 \u0432\u0438\u0434\u0430 \u0432\u0440\u0430\u0433\u0430:<\/p>\n<ul>\n<li>\n<p>\u0423\u043c\u043d\u044b\u0439 \u0437\u043e\u043c\u0431\u0438(\u043a\u043e\u0433\u0434\u0430 \u0438\u0433\u0440\u043e\u043a \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u0432 \u0435\u0433\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u0443, \u043e\u043d \u0431\u0435\u0436\u0438\u0442 \u043e\u0442 \u0438\u0433\u0440\u043e\u043a\u0430, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u0442 \u0431\u0435\u0436\u0438\u0442 \u043d\u0430 \u0438\u0433\u0440\u043e\u043a\u0430)<\/p>\n<\/li>\n<li>\n<p>\u0417\u043e\u043c\u0431\u0438 \u0437\u0430 \u0449\u0438\u0442\u043e\u043c(\u043e\u043d \u0433\u0434\u0435-\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u043b \u043a\u0443\u0441\u043e\u043a \u0436\u0435\u043b\u0435\u0437\u0430, \u0435\u0441\u043b\u0438 \u0441\u0442\u0440\u0435\u043b\u044f\u0442\u044c \u043d\u0435 \u0442\u043e\u0447\u043d\u043e, \u0442\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u043b\u043e\u043c\u0430\u0442\u044c \u0449\u0438\u0442, \u043f\u043e\u0442\u043e\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0438\u0442\u044c \u0437\u043e\u043c\u0431\u0438)<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0440\u0430\u0448\u043d\u044b\u0439 \u0437\u043e\u043c\u0431\u0438(\u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0438 \u0441\u0442\u0440\u0430\u0448\u043d\u044b\u0439)<\/p>\n<\/li>\n<li>\n<p>\u0422\u043e\u043b\u0441\u0442\u044b\u0439 \u0437\u043e\u043c\u0431\u0438(\u0411\u043e\u043b\u044c\u0448\u043e\u0439, \u0442\u043e\u043b\u0441\u0442\u044b\u0439 \u0438 \u0441\u0442\u0440\u0430\u0448\u043d\u044b\u0439, \u043f\u0440\u0438 \u0441\u043c\u0435\u0440\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0435\u0449\u0451 3-\u0445 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0437\u043e\u043c\u0431\u0438)<\/p>\n<\/li>\n<li>\n<p>\u0422\u0430\u043a-\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0443\u0431\u0438\u0439\u0441\u0442\u0432\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043b\u0443\u0436\u0430 \u043a\u0440\u043e\u0432\u0438<\/p>\n<\/li>\n<\/ul>\n<h3>ZombieBlood<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u0443\u044e \u0441\u0446\u0435\u043d\u0443, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c \u0441\u0446\u0435\u043d\u044b Area2D(ZombieBlood), \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b:<\/p>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7a2\/baa\/dce\/7a2baadce4c1e6922c319b837d1df525.png\" width=\"224\" height=\"88\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7a2\/baa\/dce\/7a2baadce4c1e6922c319b837d1df525.png\"\/><\/figure>\n<p>\u2981AnimatedSprite<br \/> \u2981Timer(BloodLive)<\/p>\n<p>\u0412 AnimatedSprite \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u0441\u043f\u0440\u0430\u0439\u0442 \u0444\u0440\u0435\u0439\u043c \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e, \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u0438\u0434\u0430 \u043a\u0440\u043e\u0432\u0430\u0432\u043e\u0439 \u043b\u0443\u0447\u0448\u0435( \u0443 \u043c\u0435\u043d\u044f 3), \u043b\u0443\u0447\u0448\u0435 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043d\u0435 1, \u0447\u0442\u043e\u0431\u044b \u0432\u0435\u0441\u044c \u043f\u043e\u043b \u043d\u0435 \u0431\u044b\u043b \u0437\u0430\u043b\u0438\u0442 \u043e\u0434\u043d\u0438\u043c \u0432\u0438\u0434\u043e\u043c \u043a\u0440\u043e\u0432\u0430\u0432\u044b\u0445 \u043b\u0443\u0436. <\/p>\n<p>\u0422\u0430\u0439\u043c\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0443\u0436\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0436\u0438\u0437\u043d\u0438 \u043b\u0443\u0436\u0438, One Shoot \u0438 Autostart &#8212; \u0432\u043a\u043b, Wait Time \u044f \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b 30 \u0441\u0435\u043a\u0443\u043d\u0434, \u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0435\u0440\u0435\u0437 30 \u0441\u0435\u043a\u0443\u043d\u0434 \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043b\u044f\u0442\u044c\u0441\u044f \u043b\u0443\u0436\u0430. <\/p>\n<p>\u041d\u0430\u0432\u0435\u0448\u0438\u0432\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 ZombieBlood \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0435\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e:<\/p>\n<pre><code class=\"python\">extends Area2D #\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 \u0434\u0435\u0440\u0435\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 onready var _animated_sprite = $AnimatedSprite onready var _blood_live = $BloodLive  func _ready(): #\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0432\u0438\u0434 \u043a\u0440\u043e\u0432\u0438 var animation_types = _animated_sprite.frames.get_animation_names() var animation = animation_types[randi() % animation_types.size()] _animated_sprite.play(animation)   func _on_BloodLive_timeout(): #\u0412\u0435\u0448\u0430\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u0438 \u043f\u043e \u0438\u0441\u0442\u0438\u0447\u0435\u043d\u0438\u044e \u0443\u0434\u0430\u043b\u044f\u0435\u043c queue_free()<\/code><\/pre>\n<p>\u0422\u0430\u043a-\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u0440\u043e\u0432\u044c \u0432 \u0433\u0440\u0443\u043f\u043f\u0443 all_enemy. \u041a\u0442\u043e \u0437\u0430\u0431\u044b\u043b, \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 Area2D(\u0412 \u0434\u0435\u0440\u0435\u0432\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432), \u0432 \u0438\u043d\u0441\u043f\u0435\u043a\u0442\u043e\u0440\u0435 \u043d\u0430\u0436\u0430\u0442\u044c &#171;\u0423\u0437\u0435\u043b&#187;->\u0413\u0440\u0443\u043f\u043f\u044b, \u0432\u0432\u0435\u0441\u0442\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438 \u043d\u0430\u0436\u0430\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c. \u041a\u0440\u043e\u0432\u044c \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0434\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c <\/p>\n<h3>DefaultEnemy<\/h3>\n<p>\u041d\u0443\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u0446\u0435\u043d\u0443 \u043a\u0440\u043e\u0432\u0438, \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u0440\u043e\u0432\u044c \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0441 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043e\u043c, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432 _ready() \u0440\u0430\u043d\u0434\u043e\u043c\u0430\u0439\u0437\u0435\u0440 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u0440\u043e\u0432\u0438, \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043d\u0447\u0438\u043b\u0438\u0441\u044c \u0436\u0438\u0437\u043d\u0438, \u0435\u0449\u0451 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0437\u043e\u043c\u0431\u0438 float.<\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u0447\u0442\u043e \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430:<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u043e\u043b\u0432\u0430\u043d\u043a\u0438 \u0432\u0440\u0430\u0433\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">extends KinematicBody2D  #\u043f\u043e\u0434\u0433\u0440\u0443\u0437\u0438\u043b\u0438 \u0441\u0446\u0435\u043d\u0443 \u0441 \u043a\u0440\u043e\u0432\u044c\u044e var blood_scene = preload(\"res:\/\/scenes\/Enemy\/ZombieBlood\/ZombieBlood.tscn\")  #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0435\u0440\u0435\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u043a\u043e\u0434 onready var _animated_sprite = $AnimatedSprite onready var _red_health = $HealthBar\/RedHealth  #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0438\u0433\u0440\u043e\u043a\u0430, \u043f\u043e\u0437\u0436\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f export onready var player  #\u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0432\u0440\u0430\u0433\u0430 export var health = 5 export var speed:float = 2 export var damage = 1 #\u0415\u0449\u0451 \u0447\u0443-\u0447\u0443\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 #\u0414\u043b\u0438\u043d\u0430 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 RedHealth, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f 1 \u0435\u0434. \u0443\u0440\u043e\u043d\u0430 onready var health_size = _red_health.rect_size.x \/ health   var motion = Vector2.ZERO var dir = Vector2.ZERO  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u044e \u043f\u0443\u0442\u0438 \u043a \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 func find_position(pos): dir = (pos - position).normalized() motion = dir.normalized() * speed if(dir.x &lt; 0): _animated_sprite.set_flip_h(true) else: _animated_sprite.set_flip_h(false)   func _ready(): randomize()#\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0440\u0430\u043d\u0434\u043e\u043c\u0430\u0439\u0437\u0435\u0440  _animated_sprite.playing = true #\u0412\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 func hit(damage): health -= damage _red_health.rect_size.x -= health_size * damage if (health &lt;= 0): #\u0415\u0441\u043b\u0438 &lt;= 0, \u0442\u043e \u0443\u0434\u0430\u043b\u0438\u043b\u0441\u044f spawn_blood() #\u0412\u044b\u044b\u0437\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043f\u0430\u0432\u043d\u0430 \u043a\u0440\u043e\u0432\u0438 queue_free()  func _physics_process(delta): #\u0415\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a\u0430 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0442\u043e \u043d\u0435\u043a\u0443\u0434\u0430 \u0438\u0434\u0442\u0438 if (player != null): find_position(player.position) var collision = move_and_collide(motion) if collision:#\u0415\u0441\u043b\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f if collision.collider.has_method(\"take_damage\"):#\u0418 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 take_damage collision.collider.take_damage(damage)#\u043d\u0430\u043d\u0451\u0441 \u0443\u0440\u043e\u043d  #\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043f\u0430\u0432\u043d\u0430 \u043a\u0440\u043e\u0432\u0438 func spawn_blood(): var b = blood_scene.instance()  b.position = position#\u0437\u0430\u0434\u0430\u043b\u0438 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 b.rotation_degrees = randi() % 361#\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0443\u0433\u043e\u043b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430  get_parent().add_child(b)#\u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043a\u0440\u043e\u0432\u044c  func get_health(): return health <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0438\u0445 \u0437\u043e\u043c\u0431\u0438.<\/p>\n<h4>\u0423\u043c\u043d\u044b\u0439 \u0437\u043e\u043c\u0431\u0438<\/h4>\n<p>\u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c, \u043a\u0430\u043a \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u0446\u0435\u043d\u0443 DefaultEnemy, \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0435\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e:<\/p>\n<pre><code class=\"python\">extends \"res:\/\/scenes\/Enemy\/DefaultEnemy\/DefaultEnemy.gd\"   #\u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0442\u0438 func find_position(pos): dir = (pos - position).normalized() #\u0415\u0441\u043b\u0438 dir.x &lt; 0, \u0437\u043d\u0430\u0447\u0438\u0442 \u0438\u0433\u0440\u043e\u043a \u0441\u043b\u0435\u0432\u0430, \u0435\u0441\u043b\u0438 _animated_sprite \u0438\u0433\u0440\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u0432\u0451\u0440\u043d\u0443\u0442 # \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0443 \u043c\u0435\u043d\u044f \u0441\u043f\u0440\u0430\u0439\u0442\u044b \u0441\u043c\u043e\u0442\u0440\u044f\u0442 \u0432 \u043f\u0440\u0430\u0432\u043e, \u0437\u043d\u0430\u0447\u0438\u0442 \u0438\u0433\u0440\u043e\u043a \u0441\u043c\u043e\u0442\u0440\u0438 \u043d\u0430 \u0437\u043e\u043c\u0431\u0438 # \u0447\u0442\u043e\u0431\u044b \u0438\u0434\u0442\u0438 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438, \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 -\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c if (dir.x &lt; 0 &amp;&amp; !player._animated_sprite.flip_h): motion = dir.normalized() * -speed #\u0422\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 dir.x &lt; 0, \u0437\u043d\u0430\u0447\u0438\u0442 \u0438\u0433\u0440\u043e\u043a \u0441\u043f\u0440\u0430\u0432\u0430 \u0438 \u0435\u0441\u043b\u0438 \u043e\u043d \u043f\u043e\u0432\u0451\u0440\u043d\u0443\u0442 # \u0442\u043e \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u043d\u0430 \u0437\u043e\u043c\u0431\u0438 elif (dir.x > 0 &amp;&amp; player._animated_sprite.flip_h): motion = dir.normalized() * -speed else: # \u0432\u043e \u0432\u0441\u0435\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0438\u0434\u0451\u043c \u043d\u0430 \u0438\u0433\u0440\u043e\u043a\u0430 motion = dir.normalized() * speed if(dir.x &lt; 0):# \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0437\u043e\u043c\u0431\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0448\u0451\u043b _animated_sprite.set_flip_h(true) else: _animated_sprite.set_flip_h(false) <\/code><\/pre>\n<p>\u0412\u0441\u0451 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u0440\u043e\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0437\u043e\u043c\u0431\u0438.<\/p>\n<h4>\u0422\u043e\u043b\u0441\u0442\u044b\u0439 \u0437\u043e\u043c\u0431\u0438<\/h4>\n<p>\u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c, \u043a\u0430\u043a \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u0446\u0435\u043d\u0443 DefaultEnemy, \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0435\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e:<\/p>\n<pre><code class=\"python\">extends \"res:\/\/scenes\/Enemy\/DefaultEnemy\/DefaultEnemy.gd\" #\u041f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0441\u0446\u0435\u043d\u0443 \u0441 \u0441\u0430\u043c\u044b\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0437\u043e\u043c\u0431\u0438, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0445 \u0437\u043e\u043c\u0431\u0438 var zombie_scene = preload(\"res:\/\/scenes\/Enemy\/Zombie1\/Zombie1.tscn\")  #\u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 func hit(damage): health -= damage _red_health.rect_size.x -= health_size * damage if (health &lt;= 0): #\u0415\u0441\u043b\u0438 &lt;= 0, \u0442\u043e \u0443\u043c\u0435\u0440  spawn_blood() # \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u0440\u043e\u0432\u044c spawn_zombie(Vector2(position.x,position.y - 50)) #\u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0437\u043e\u043c\u0431\u0438 \u0441\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f\u043c\u0438 spawn_zombie(Vector2(position.x,position.y + 50)) #\u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0437\u043e\u043c\u0431\u0438 \u0441\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f\u043c\u0438 spawn_zombie(Vector2(position.x + 50,position.y)) #\u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0437\u043e\u043c\u0431\u0438 \u0441\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f\u043c\u0438 queue_free()  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043f\u0430\u0432\u043d\u0430 \u0437\u043e\u043c\u0431\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 Vector2 func spawn_zombie(pos): var z = zombie_scene.instance() #\u0437\u0430\u0434\u0430\u0451\u043c \u0434\u043b\u044f \u0437\u043e\u043c\u0431\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e z.position = pos #\u043f\u043e\u0432\u043e\u0440\u043e\u0442 z.rotation = rotation #\u0438\u0433\u0440\u043e\u043a\u0430 z.player = player get_parent().add_child(z)# \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u043e\u043c\u0431\u0438<\/code><\/pre>\n<p>\u0412\u0441\u0451 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u0440\u043e\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0437\u043e\u043c\u0431\u0438.<\/p>\n<h4>\u0417\u043e\u043c\u0431\u0438 \u0437\u0430 \u0449\u0438\u0442\u043e\u043c<\/h4>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0441\u0446\u0435\u043d\u0443 \u0434\u043b\u044f \u0449\u0438\u0442\u0430.<\/p>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c StaticBody2D(Shield), \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b:<\/p>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bff\/943\/8f6\/bff9438f642c5f9da72758f79f16fb16.png\" width=\"215\" height=\"134\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bff\/943\/8f6\/bff9438f642c5f9da72758f79f16fb16.png\"\/><\/figure>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u0441\u043f\u0440\u0430\u0439\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c AnimatedSprite, \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e \u0447\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0443 \u0449\u0438\u0442\u0430 \u0445\u043f, \u0442\u0435\u043c \u043e\u043d \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0430\u0437\u0440\u0443\u0448\u0430\u0435\u0442\u0441\u044f. \u0417\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439 \u0431\u0443\u0434\u0435\u043c \u0447\u0435\u0440\u0435\u0437 CollisionPolygon2D, \u043d\u0430\u043c \u0432\u0430\u0436\u043d\u043e \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0449\u0438\u0442\u0430 \u0431\u044b\u043b\u0438 \u0442\u043e\u0447\u043d\u043e, \u043a\u0430\u043a \u0441\u043f\u0440\u0430\u0439\u0442, \u043f\u043e\u0442\u043e\u043c\u0443-\u0447\u0442\u043e \u043c\u0435\u0442\u043a\u0438\u043c \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u043e\u043c \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u043d\u043e\u0441\u0438\u0442\u044c \u0443\u0440\u043e\u043d \u0437\u043e\u043c\u0431\u0438. \u0418 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c 2 ColorRect, \u0434\u043b\u044f \u043f\u043e\u043b\u043e\u0441\u043a\u0438 \u0436\u0438\u0437\u043d\u0438, \u043a\u0430\u043a \u0443 \u0437\u043e\u043c\u0431\u0438.<\/p>\n<p>\u041a\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f CollisionPolygon2D, \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 CollisionPolygon2D \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0440\u0435\u0436\u0438\u043c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f(Q) <img loading=\"lazy\" decoding=\"async\" inline=\"true\" class=\"image image-inline\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/80d\/843\/0ce\/80d8430ceb1d3a7ecd6fd1da16a23dee.png\" width=\"35\" height=\"32\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/80d\/843\/0ce\/80d8430ceb1d3a7ecd6fd1da16a23dee.png\"\/>\u0415\u0441\u043b\u0438 \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d, \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043f\u043e \u043a\u043e\u043d\u0442\u0443\u0440\u0443 \u0441\u043f\u0440\u0430\u0439\u0442\u0430<\/p>\n<p>\u0422\u0430\u043a-\u0436\u0435 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0437\u0430\u0434\u0430\u0451\u043c \u0438\u043c\u044f \u043d\u043e\u0432\u043e\u043c\u0443 \u0441\u043b\u043e\u044e \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439( \u0443 \u043c\u0435\u043d\u044f 6-\u0439 \u0438 \u043d\u0430\u0437\u0432\u0430\u043b Enemy_armor). \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u0441\u0446\u0435\u043d\u0443 DefaultBullet \u0438 \u0441\u0442\u0430\u0432\u0438\u043c \u0434\u043b\u044f \u043d\u0435\u0451 \u043d\u043e\u0432\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/28c\/b58\/b33\/28cb58b337a15a0fa50bb3f437fcd688.png\" alt=\"DefaultBullet\" title=\"DefaultBullet\" width=\"262\" height=\"160\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/28c\/b58\/b33\/28cb58b337a15a0fa50bb3f437fcd688.png\"\/><\/p>\n<div><figcaption>DefaultBullet<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430\u0432\u0435\u0448\u0438\u0432\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 Shield \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0435\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e:<\/p>\n<pre><code class=\"python\">extends StaticBody2D #\u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0435\u0440\u0435\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 onready var _red_health = $HealthBar\/RedHealth #\u0426\u0435\u043d\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0436\u0438\u0437\u043d\u0435\u0439 var health_size #\u0420\u0430\u0437\u043c\u0435\u0440 \u0436\u0438\u0437\u043d\u0435\u0439 export var health = 10  func _ready(): #\u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0446\u0435\u043d\u0443 \u0434\u0435\u043b\u0435\u043d\u0438\u044f health_size = round(_red_health.rect_size.x \/ health)  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 func hit(damage): health -= damage _red_health.rect_size.x -= health_size * damage if (health &lt;= 0): #\u0415\u0441\u043b\u0438 &lt;= 0, \u0442\u043e \u0443\u0434\u0430\u043b\u0438\u043b\u0441\u044f queue_free()<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0441\u0430\u043c\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438:<\/p>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5c5\/090\/5a0\/5c50905a0f47c7d79e6e9f1e718b4a23.png\" width=\"226\" height=\"168\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5c5\/090\/5a0\/5c50905a0f47c7d79e6e9f1e718b4a23.png\"\/><\/figure>\n<p>\u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c, \u043a\u0430\u043a \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u0446\u0435\u043d\u0443 DefaultEnemy, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c Position2D(ShieldPosition) \u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0422\u0443\u0442 \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u043e\u044f\u0442\u044c \u0449\u0438\u0442, \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u043f\u043e\u0434 \u0432\u0430\u0448 \u0441\u043f\u0440\u0430\u0439\u0442. \u0420\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e:<\/p>\n<pre><code class=\"python\">extends \"res:\/\/scenes\/Enemy\/DefaultEnemy\/DefaultEnemy.gd\" #\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0435\u0440\u0435\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 onready var _shield_position = $ShieldPosition #\u0421\u0446\u0435\u043d\u0430 \u0441 \u0449\u0438\u0442\u043e\u043c var shield_scene = preload(\"res:\/\/scenes\/Enemy\/ZombieShield\/Shield.tscn\")  #\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0440\u0430\u043d\u0434\u043e\u043c\u0430\u0439\u0437, \u0434\u043b\u044f \u043a\u0440\u043e\u0432\u0438 func _ready(): randomize() _animated_sprite.playing = true #\u0412\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e spawn_shield()#\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043f\u0430\u0432\u043d\u0430 \u0449\u0438\u0442\u0430   func spawn_shield():  var s = shield_scene.instance() #\u0434\u0430\u043b\u0438 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f s.position = _shield_position.position #\u043f\u043e\u0432\u0435\u0440\u043d\u0443\u043b\u0438 s.rotation = rotation add_child(s)# \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0449\u0438\u0442<\/code><\/pre>\n<p>\u0412\u0441\u0451 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u0440\u043e\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b. \u0415\u0449\u0451 \u0443 \u043d\u0430\u0441 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u0441\u0442\u0440\u0430\u0448\u043d\u044b\u0439 \u0437\u043e\u043c\u0431\u0438 \u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0439, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0443\u0440\u043e\u043a\u0435. \u0418\u0445 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0435\u043c \u0443 \u043d\u0438\u0445 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438.<\/p>\n<p>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0430\u043c\u0438:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0417\u043e\u043c\u0431\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0445\u043f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0443\u0440\u043e\u043d<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041e\u0431\u044b\u0447\u043d\u044b\u0439<\/p>\n<\/td>\n<td>\n<p align=\"left\">5<\/p>\n<\/td>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0423\u043c\u043d\u044b\u0439<\/p>\n<\/td>\n<td>\n<p align=\"left\">3<\/p>\n<\/td>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0421\u0442\u0440\u0430\u0448\u043d\u044b\u0439<\/p>\n<\/td>\n<td>\n<p align=\"left\">3<\/p>\n<\/td>\n<td>\n<p align=\"left\">6<\/p>\n<\/td>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0422\u043e\u043b\u0441\u0442\u044b\u0439<\/p>\n<\/td>\n<td>\n<p align=\"left\">10<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.5<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0417\u0430 \u0449\u0438\u0442\u043e\u043c<\/p>\n<\/td>\n<td>\n<p align=\"left\">5<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0429\u0438\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">10<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u0421\u0438\u043d\u0433\u043b\u0442\u043e\u043d EnemyNames<\/h3>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0435\u0449\u0451 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0441\u043e \u0441\u0446\u0435\u043d\u0430\u043c\u0438 \u0432\u0440\u0430\u0433\u043e\u0432.<\/p>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a29\/6f2\/497\/a296f2497636c763f30e085abac6e611.png\" width=\"417\" height=\"332\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a29\/6f2\/497\/a296f2497636c763f30e085abac6e611.png\"\/><\/figure>\n<p>\u041f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0435\u0433\u043e \u0432 \u0442\u0443 \u0436\u0435 \u043f\u0430\u043f\u043a\u0443, \u0447\u0442\u043e \u0438 \u0442\u0440\u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u0430 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0432 \u0430\u0432\u0442\u043e\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e.<\/p>\n<pre><code class=\"python\">extends Node #\u043e\u0431\u044b\u0447\u043d\u044b\u0439 const ZOMBIE1 = preload(\"res:\/\/scenes\/Enemy\/Zombie1\/Zombie1.tscn\") #\u0443\u043c\u043d\u044b\u0439 const SMARTZOMBIE = preload(\"res:\/\/scenes\/Enemy\/SmartZombie\/SmartZombie.tscn\") #\u0441\u0442\u0440\u0430\u0448\u043d\u044b\u0439 const ZOMBIESCARY = preload(\"res:\/\/scenes\/Enemy\/ZombieScary\/ZombieScary.tscn\") #\u0442\u043e\u0441\u043b\u0442\u044b\u0439 const FATZOMBIE = preload(\"res:\/\/scenes\/Enemy\/FatZombie\/FatZombie.tscn\") #\u0437\u0430 \u0449\u0438\u0442\u043e\u043c const ZOMBIESHEILD = preload(\"res:\/\/scenes\/Enemy\/ZombieShield\/ZombieShield.tscn\") #\u0449\u0438\u0442 const SHIELD = preload(\"res:\/\/scenes\/Enemy\/ZombieShield\/Shield.tscn\") #\u043a\u0440\u043e\u0432\u044c const ZOMBIEBLOOD = preload(\"res:\/\/scenes\/Enemy\/ZombieBlood\/ZombieBlood.tscn\")<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e preload \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u044f \u0441\u0446\u0435\u043d\u0443 \u0438\u0433\u0440\u044b.<\/p>\n<details class=\"spoiler\">\n<summary>\u0413\u0434\u0435 \u043c\u0435\u043d\u044f\u0442\u044c?<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">#DefaultEnemy 4 \u0441\u0442\u0440\u043e\u043a\u0430 var blood_scene = EnemyNames.ZOMBIEBLOOD<\/code><\/pre>\n<pre><code class=\"python\">#FatZombie 3 \u0441\u0442\u0440\u043e\u043a\u0430 var zombie_scene = EnemyNames.ZOMBIE1<\/code><\/pre>\n<pre><code class=\"python\">#ZombieShield 5 \u0441\u0442\u0440\u043e\u043a\u0430 var shield_scene = EnemyNames.SHIELD<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0441 \u0432\u0440\u0430\u0433\u0430\u043c\u0438 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438.<\/p>\n<h2>\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e<\/h2>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/855\/e7d\/ede\/855e7dede3b0143895bc82d0ac688115.png\" width=\"220\" height=\"308\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/855\/e7d\/ede\/855e7dede3b0143895bc82d0ac688115.png\"\/><\/figure>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c 2 AudioStreamPlayer2D, \u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (ClickSound) \u0438 (MusicTheme). ClickSound &#8212; \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u044c \u0437\u0432\u0443\u043a \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043c\u044b\u0448\u043a\u043e\u0439, MusicTheme &#8212; \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u044c \u0444\u043e\u043d\u043e\u0432\u0443\u044e \u043c\u0443\u0437\u044b\u043a\u0443. \u041d\u0430 MusicTheme \u0441\u0442\u0430\u0432\u0438\u043c autoplay &#8212; true, \u0438 \u0437\u0430\u0446\u0438\u043a\u043b\u0438\u0432\u0430\u0435\u043c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 \u043d\u0430\u0448\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u0443\u044e \u0430\u0443\u0434\u0438\u043e\u0437\u0430\u043f\u0438\u0441\u044c, \u043e\u0442\u043a\u0440\u043e\u044e\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u0442\u0430\u043c \u0441\u0442\u0430\u0432\u0438\u043c \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c loop, \u043e\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0430\u043c\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f, \u043d\u0438\u0436\u0435 3 \u043f\u0440\u0438\u043c\u0435\u0440\u0430.. \u0412 \u043a\u043e\u0434 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c:<\/p>\n<pre><code class=\"python\">#\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u044d\u043b\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0434\u0435\u0440\u0435\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 onready var _click_sound = $ClickSound  func _process(delta): if (Input.is_action_just_pressed(\"fire\")):#\u0415\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0430 \u041b\u041a\u041c _click_sound.play()<\/code><\/pre>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a5d\/57e\/fd6\/a5d57efd647c89088cbb4da3454eb029.png\" alt=\"\u0414\u043b\u044f .mp3\" title=\"\u0414\u043b\u044f .mp3\" width=\"269\" height=\"93\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a5d\/57e\/fd6\/a5d57efd647c89088cbb4da3454eb029.png\"\/><\/p>\n<div><figcaption>\u0414\u043b\u044f .mp3<\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ab2\/994\/a94\/ab2994a940d0fd7456926089aa1907f7.png\" alt=\"\u0414\u043b\u044f .ogg\" title=\"\u0414\u043b\u044f .ogg\" width=\"273\" height=\"96\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ab2\/994\/a94\/ab2994a940d0fd7456926089aa1907f7.png\"\/><\/p>\n<div><figcaption>\u0414\u043b\u044f .ogg<\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/360\/f1f\/f20\/360f1ff20fd3df462a42fe198c555c5c.png\" alt=\"\u0414\u043b\u044f .wav\" title=\"\u0414\u043b\u044f .wav\" width=\"275\" height=\"202\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/360\/f1f\/f20\/360f1ff20fd3df462a42fe198c555c5c.png\"\/><\/p>\n<div><figcaption>\u0414\u043b\u044f .wav<\/figcaption><\/div>\n<\/figure>\n<h2>\u0421\u0438\u043d\u0433\u043b\u0442\u043e\u043d SelectedCharacter<\/h2>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u0446\u0435\u043d\u0443 \u0441 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u043c \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u043c. \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b, \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0435\u0433\u043e \u0432 \u043f\u0430\u043f\u043a\u0443 scripts \u0438 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0441\u0442\u0430\u0432\u0438\u043c \u0430\u0432\u0442\u043e\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439.<\/p>\n<pre><code class=\"python\">extends Node #\u043f\u0435\u0440\u043c\u0435\u043d\u0430\u043d\u0430\u044f \u0445\u0440\u0430\u043d\u044f\u0449\u0430\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0433\u0435\u0440\u043e\u044f var Character  #\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0433\u0435\u0440\u043e\u044f func set_character(scene): Character = scene<\/code><\/pre>\n<h2>\u041c\u0435\u043d\u044e \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 4 \u0438\u0433\u0440\u043e\u0432\u044b\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430, \u0437\u043d\u0430\u0447\u0438\u0442 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438 Start Game, \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0441\u0446\u0435\u043d\u0430 \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0447\u0430\u0442\u044c\u0441\u044f \u0438\u0433\u0440\u0430 \u0437\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430. \u0417\u043d\u0430\u0447\u0438\u0442 \u043d\u0430 \u0441\u0446\u0435\u043d\u0435 \u0432\u044b\u0431\u043e\u0440\u0430, \u0438\u0433\u0440\u043e\u043a \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430, \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d \u0438 \u0432  \u0444\u0443\u043d\u043a\u0446\u0438\u0438  _init() \u0441\u0446\u0435\u043d\u044b \u0438\u0433\u0440\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0446\u0435\u043d\u0443 \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430, \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c Node2D, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b:<\/p>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3bb\/6ed\/46d\/3bb6ed46d19b2bbc8184faf74e537e36.png\" width=\"218\" height=\"365\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3bb\/6ed\/46d\/3bb6ed46d19b2bbc8184faf74e537e36.png\"\/><\/figure>\n<p>\u2981Sprite<br \/> \u2981TextureButton(BrutalHeroBtn)<br \/> \u2981TextureButton(CowboyBtn)<br \/> \u2981TextureButton(SoldierBtn)<br \/> \u2981TextureButton(RobotBtn)<br \/> \u2981TextureButton(StartGameBtn)<br \/> \u2981AnimatedSprite<br \/> \u2981TextureButton(StartGameBtn)<br \/> \u2981label(StartGameLbl)-\u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u043a StartGameBtn<br \/> \u2981TextureButton(ReturnBtn)<br \/> \u2981Label(ReturnLbl) &#8212; \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u043a ReturnBtn<br \/> \u2981AudioStreamPlayer2D(ClickSound)<br \/> \u2981Label(CharacterParam)<br \/> \u2981AudioStreamPlayer2D(MusicTheme)<\/p>\n<p>Sprite &#8212; \u044d\u0442\u043e \u043d\u0430\u0448 \u0437\u0430\u0434\u043d\u0438\u0439 \u0444\u043e\u043d \u043c\u0435\u043d\u044e \u0432\u044b\u0431\u043e\u0440\u0430, \u043f\u0435\u0440\u0432\u044b\u0435 4 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u0432\u044b\u0431\u043e\u0440 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430, AnimatedSprite &#8212; \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u0442\u0430\u043d\u0446\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430, StartGameBtn &#8212; \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0438\u0433\u0440\u0443, ReturnBtn &#8212; \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432 \u043c\u0435\u043d\u044e. CharacterParam &#8212; \u0432 \u043d\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435(\u0443\u0440\u043e\u043d, \u0445\u043f&#8230;), ClickSound &#8212; \u0437\u0432\u0443\u043a \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438, Musictheme &#8212; \u0444\u043e\u043d\u043e\u0432\u0430\u044f \u043c\u0443\u0437\u044b\u043a\u0430.<\/p>\n<p>\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2f6\/a36\/87a\/2f6a3687ab6d47c0e790bfc2544afa02.png\" alt=\"\u0421\u0446\u0435\u043d\u0430 \u0432\u044b\u0431\u043e\u0440\u0430 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435\" title=\"\u0421\u0446\u0435\u043d\u0430 \u0432\u044b\u0431\u043e\u0440\u0430 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435\" width=\"769\" height=\"576\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2f6\/a36\/87a\/2f6a3687ab6d47c0e790bfc2544afa02.png\"\/><\/p>\n<div><figcaption>\u0421\u0446\u0435\u043d\u0430 \u0432\u044b\u0431\u043e\u0440\u0430 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/73b\/9a4\/4e9\/73b9a44e97bfac193f254200f9c1b7c4.png\" alt=\"\u0421\u0446\u0435\u043d\u0430 \u0432\u044b\u0431\u043e\u0440\u0430, \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430.\" title=\"\u0421\u0446\u0435\u043d\u0430 \u0432\u044b\u0431\u043e\u0440\u0430, \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430.\" width=\"1026\" height=\"780\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/73b\/9a4\/4e9\/73b9a44e97bfac193f254200f9c1b7c4.png\"\/><\/p>\n<div><figcaption>\u0421\u0446\u0435\u043d\u0430 \u0432\u044b\u0431\u043e\u0440\u0430, \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430.<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0438 \u0432 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u043a\u0430\u0445 &#8212; \u044d\u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0438 \u0432\u044b\u0431\u043e\u0440\u0430. \u0414\u043b\u044f \u043a\u043d\u043e\u043f\u043e\u043a \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043a\u0438, \u0434\u043b\u044f \u043d\u0430\u0434\u043f\u0438\u0441\u0435\u0439 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0448\u0440\u0438\u0444\u0442, \u043a\u043d\u043e\u043f\u043a\u0443 StartGameBtn &#8212; \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u0435\u043b\u0430\u0435\u043c disable, \u0441\u0442\u0430\u043d\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430. \u0412 AnimatedSprite \u0437\u0430\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0448\u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0442\u0430\u043d\u0446\u0435\u0432 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0443\u0441\u0442\u0443\u044e Default. CharacterParam, \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0432 \u0431\u043b\u043e\u043a\u043d\u043e\u0442\u0435. \u0417\u0430\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u0432\u0443\u043a\u0438. \u041d\u0430\u0432\u0435\u0448\u0438\u0432\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0435\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e:<\/p>\n<pre><code class=\"python\">extends Node2D  #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0435\u0440\u0435\u0432\u0430 onready var _animated_sprite = $AnimatedSprite onready var _brutalhero_btn = $BrutalHeroBtn onready var _cowboy_btn = $CowboyBtn onready var _soldier_btn = $SoldierBtn onready var _robot_btn = $RobotBtn onready var _click_sound = $ClickSound onready var _start_game_btn = $StartGameBtn onready var _return_btn = $ReturnBtn onready var _character_param = $CharacterParam  #\u0421\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0449\u0435\u043b\u0447\u0451\u043a \u043c\u044b\u0448\u0438, \u0434\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0437\u0432\u0443\u043a\u0430 func _process(delta): if (Input.is_action_just_pressed(\"fire\")): _click_sound.play()  #\u0415\u0441\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d BrutalHero func _on_BrutalHeroBtn_pressed(): _animated_sprite.play(\"Dance1\")#\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0435\u0433\u043e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e _start_game_btn.disabled = false#\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u0441\u0442\u0430\u0440\u0442\u0430 \u0438\u0433\u0440\u044b _character_param.text = \"Character \\nBrutalHero \\nDamage: 1 \\nHP: 5 \\nSpeed: 200 \\nEquip: Blaster\"#\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442 SelectedCharacter.set_character(CharacterNames.BRUTALHERO)#\u0412 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c BrutalHero  #\u0415\u0441\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d Cowboy func _on_CowboyBtn_pressed(): _animated_sprite.play(\"Dance2\")#\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0435\u0433\u043e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e _start_game_btn.disabled = false#\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u0441\u0442\u0430\u0440\u0442\u0430 \u0438\u0433\u0440\u044b _character_param.text = \"Character \\nCowboy \\nDamage: 2.5 \\nHP: 3 \\nSpeed: 150 \\nEquip: Shotgun\"#\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442 SelectedCharacter.set_character(CharacterNames.COWBOY)#\u0412 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c Cowboy  #\u0415\u0441\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d Soldier func _on_SoldierBtn_pressed(): _animated_sprite.play(\"Dance3\")#\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0435\u0433\u043e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e _start_game_btn.disabled = false#\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u0441\u0442\u0430\u0440\u0442\u0430 \u0438\u0433\u0440\u044b _character_param.text = \"Character \\nSoldier \\nDamage: 1 \\nHP: 5 \\nSpeed: 200 \\nEquip: Bazooka\"#\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442 SelectedCharacter.set_character(CharacterNames.SOLDIER)#\u0412 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c Soldier  #\u0415\u0441\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d Robot func _on_RobotBtn_pressed(): _animated_sprite.play(\"Dance4\")#\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0435\u0433\u043e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e _start_game_btn.disabled = false#\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u0441\u0442\u0430\u0440\u0442\u0430 \u0438\u0433\u0440\u044b _character_param.text = \"Character \\nRobot \\nDamage: 0.75 \\nHP: 10 \\nSpeed: 300 \\nEquip: Rifle\"#\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442 SelectedCharacter.set_character(CharacterNames.ROBOT)#\u0412 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c Robot  #\u041d\u0430\u0436\u0430\u0442\u0430 \u043a\u043d\u043e\u043f\u043a\u0430 Return func _on_ReturnBtn_pressed(): SceneLoader.build_map_path(\"MainMenu\")#\u0412\u0435\u0440\u043d\u0443\u043b\u0438\u0441\u044c \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e  #\u041d\u0430\u0436\u0430\u0442\u0430 \u043a\u043d\u043e\u043f\u043a\u0430 StartGame func _on_StartGameBtn_pressed(): SceneLoader.build_map_path(\"GameScene\")#\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0441\u0446\u0435\u043d\u0443 \u0438\u0433\u0440\u044b.<\/code><\/pre>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u0441\u043a\u0440\u0438\u043f\u0442\u0443 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e \u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e _on_StartGameBtn_pressed():<\/p>\n<pre><code class=\"python\">#\u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0433\u0440\u044b, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0421\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u0430 \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0446\u0435\u043d\u0443 \u0432\u044b\u0431\u043e\u0440\u0430 func _on_StartGameBtn_pressed(): SceneLoader.build_map_path(\"PickMenu\")<\/code><\/pre>\n<h2>\u0422\u043e\u0447\u043a\u0430 \u0441\u043f\u0430\u0432\u043d\u0430 \u0432\u0440\u0430\u0433\u043e\u0432<\/h2>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u043c\u044b \u0438\u043c\u0435\u0435\u043c, \u0447\u0442\u043e \u0437\u043e\u043c\u0431\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0435\u0440\u0443\u0442 \u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0431\u0435\u0437 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u043e \u043f\u0435\u0440\u0438\u043c\u0435\u0442\u0440\u0443 \u043d\u0430\u0448\u0435\u0433\u043e MobPath. \u041d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435, \u0442\u0430\u043a \u0441\u043a\u0430\u0436\u0435\u043c. \u0412 \u0447\u0451\u043c \u0437\u0430\u0434\u0443\u043c\u043a\u0430, \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043d\u0435 \u0437\u043e\u043c\u0431\u0438, \u0430 \u0442\u043e\u0447\u043a\u0430 \u0433\u0434\u0435 \u043e\u043d \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0438 \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0432\u0440\u0430\u0433.<\/p>\n<p>\u0412 \u044d\u0442\u0443 \u0442\u043e\u0447\u043a\u0443 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0441\u0446\u0435\u043d\u0443 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0438 \u0441\u0446\u0435\u043d\u0443 \u0437\u043e\u043c\u0431\u0438.<\/p>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ed8\/3d4\/693\/ed83d4693c853c667f057cda5160f003.png\" width=\"213\" height=\"71\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ed8\/3d4\/693\/ed83d4693c853c667f057cda5160f003.png\"\/><\/figure>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c \u0441\u0446\u0435\u043d\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c StaticBody2D(SpawnPoint) \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c AnimationSprite2D(\u0410\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043a\u0440\u0443\u0433\u0430, \u0432 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435) \u0447\u0442\u043e\u0431\u044b  \u0431\u044b\u043b\u043e \u0432\u0438\u0434\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0435\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e:<\/p>\n<pre><code class=\"python\">extends StaticBody2D #\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0445\u0440\u0430\u043d\u044f\u0449\u0430\u044f \u0441\u0446\u0435\u043d\u0443 \u0437\u043e\u043c\u0431\u0438, \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u0435\u0451 \u0431\u0443\u0434\u0435\u043c \u043d\u0430 \u0441\u0446\u0435\u043d\u0435 \u0438\u0433\u0440\u044b export onready var zombie_enemy #\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0445\u0440\u0430\u043d\u044f\u0449\u0430\u044f \u0441\u0446\u0435\u043d\u0443 \u0438\u0433\u0440\u043e\u043a\u0430, \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u0435\u0451 \u0431\u0443\u0434\u0435\u043c \u043d\u0430 \u0441\u0446\u0435\u043d\u0435 \u0438\u0433\u0440\u044b export onready var player  #\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e func _ready(): $AnimatedSprite.play(\"Idle\") #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043f\u0430\u0432\u043d\u0430 \u0437\u043e\u043c\u0431\u0438 func spawn_zombie(): var z = zombie_enemy.instance()  z.position = position#\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e  z.player = player get_parent().add_child(z)# \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u043e\u043c\u0431\u0438  queue_free()  #\u0423 \u043c\u0435\u043d\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0438\u0434\u0451\u0442 \u0440\u043e\u0432\u043d\u043e 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0438 \u043f\u043e \u0435\u0451 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u043e\u043c\u0431\u0438. func _on_AnimatedSprite_animation_finished(): spawn_zombie()<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u044d\u0442\u0443 \u0441\u0446\u0435\u043d\u0443 \u0432 \u043d\u0430\u0448 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d EnemyNames.<\/p>\n<pre><code>#\u0421\u043f\u0430\u0432\u043d\u041f\u043e\u0438\u043d\u0442 const SPAWNPOINT = preload(\"res:\/\/scenes\/Enemy\/SpawnPoint\/SpawnPoint.tscn\")<\/code><\/pre>\n<p>\u0418 \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0433\u0440\u0443\u043f\u043f\u0443 all_enemy.<\/p>\n<p>\u0421 \u044d\u0442\u0438\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c, \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 DefaultCharacter.<\/p>\n<h2>DefaultCharacter<\/h2>\n<p>\u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u0445\u0440\u0430\u043d\u044f\u0449\u0443\u044e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0440\u0443\u0436\u0438\u044f \u0443 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 true, \u0435\u0441\u043b\u0438 \u0435\u0449\u0451 \u0435\u0441\u0442\u044c \u0441\u043b\u043e\u0442\u044b \u0434\u043b\u044f \u043e\u0440\u0443\u0436\u0438\u044f \u0438 false, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u0441\u043b\u043e\u0442\u043e\u0432.<\/p>\n<pre><code class=\"python\">var weapon_count = 0 #\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0445\u0440\u0430\u043d\u044f\u0449\u0430\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0440\u0443\u0436\u0438\u044f func can_add(): if (weapon_count &lt; 6): return true else: return false<\/code><\/pre>\n<p>\u0422\u0430\u043a-\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 add_equip_item() \u0438 remove_equip_item() \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439.<\/p>\n<pre><code class=\"python\">#\u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043e\u0440\u0443\u0436\u0438\u0435 func remove_equip_item(slot):#\u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430 if (slot >= 0 &amp;&amp; slot &lt;=5):#\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430 var item = get_node(\"WeaponSlot\" + slot) backpack_items[slot] = null#\u043e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 item.queue_free()#\u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 weapon_count -=1 #\u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u0438 \u043d\u0430 1 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u0440\u0443\u0436\u0438\u044f  #\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0440\u0443\u0436\u0438\u0435 func add_equip_item(item): for i in range(6): if (backpack_items[i] == null):#\u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0443\u0441\u0442\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 backpack_items[i] = item#\u0437\u0430\u043b\u0438\u0432\u0430\u0435\u043c \u0432 \u043d\u0435\u0433\u043e \u0441\u0446\u0435\u043d\u0443 \u043e\u0440\u0443\u0436\u0438\u044f weapon_count +=1 #\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043b\u0438 \u043d\u0430 1 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u0440\u0443\u0436\u0438\u044f equip_all()#\u041e\u0434\u0435\u0432\u0430\u0435\u043c \u0432\u0441\u0451 \u043e\u0440\u0443\u0436\u0438\u0435 return<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u043e\u043b\u0432\u0430\u043d\u043a\u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">extends KinematicBody2D   #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0435\u0440\u0435\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u043a\u043e\u0434 onready var _animated_sprite = $AnimatedSprite onready var _idle_animation_timer = $IdleAnimationTimer onready var _immortal_timer = $ImmortalTimer onready var _backpack = $Backpack onready var _user_interface = $Camera2D\/UserInterface #\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0438\u0437\u0432\u043d\u0435  export var health = 5 #\u0416\u0438\u0437\u043d\u0438 export var speed = 200 #\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c  export var damage_scale:float = 1#\u041c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \u0443\u0440\u043e\u043d\u0430 #\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 var velocity = Vector2.ZERO #\u0412\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f var direction = Vector2.ZERO #\u0412\u0435\u043a\u0442\u043e\u0440 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f var backpack_items = [null,null,null,null,null,null]#\u0440\u044e\u043a\u0437\u0430\u043a var weapon_count = 0 #\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0445\u0440\u0430\u043d\u044f\u0449\u0430\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0440\u0443\u0436\u0438\u044f #\u0421\u0438\u0433\u043d\u0430\u043b \u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0443\u0440\u043e\u043d\u0430 signal take_damage(damage) #\u0421\u0438\u0433\u043d\u0430\u043b \u043e \u0441\u043c\u0435\u0440\u0442\u0438 signal dead #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0436\u0430\u0442\u0438\u0439 func get_input(): velocity = Vector2.ZERO if Input.is_action_pressed(\"left\"): velocity.x -= 1 if Input.is_action_pressed(\"right\"): velocity.x += 1 if Input.is_action_pressed(\"up\"): velocity.y -= 1 if Input.is_action_pressed(\"down\"): velocity.y += 1 direction = velocity.normalized() * speed  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 func get_anim(): if (_immortal_timer.is_stopped()): #\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f-\u043b\u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0431\u0435\u0441\u0441\u043c\u0435\u0440\u0442\u0438\u044f if (velocity != Vector2.ZERO): #\u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f, \u0442\u043e \u0438\u0434\u0451\u043c  _animated_sprite.play(\"Walk\") else: if (_animated_sprite.animation != \"IdleAnimation\"): #\u0418\u043d\u0430\u0447\u0435 \u0435\u0441\u043b\u0438 \u043d\u0435 \u0431\u0440\u0443\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f, \u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u043e\u0438\u043c _animated_sprite.play(\"Stand\") if (_idle_animation_timer.is_stopped()): #\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043e\u0442\u0447\u0451\u0442 \u0434\u043e \u0431\u0440\u0443\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 _idle_animation_timer.start() if (velocity.x > 0): # \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f _animated_sprite.flip_h = false  if (velocity.x &lt; 0): _animated_sprite.flip_h = true  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 func take_damage(dmg): if(_immortal_timer.is_stopped()): #\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0435 \u0431\u0435\u0441\u0441\u043c\u0435\u0440\u0442\u0435\u043d \u043b\u0438 \u043d\u0430\u0448 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436 health -= dmg _animated_sprite.play(\"TakeDamage\") emit_signal(\"take_damage\",dmg) #\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0443\u0440\u043e\u043d\u0430 _user_interface.take_damage(dmg) _immortal_timer.start() #\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0430\u0439\u043c\u0435\u0440 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 if(health == 0): emit_signal(\"dead\")#\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u0441\u043c\u0435\u0440\u0442\u0438   func _ready(): _animated_sprite.animation = \"Stand\" # \u041f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u043e\u044f\u0442\u044c equip_all()   func _physics_process(delta): get_input() get_anim() var collider = move_and_collide(direction * delta) # \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e collider \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f   func _on_IdleAnimationTimer_timeout(): _animated_sprite.play(\"IdleAnimation\") # \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0411\u0420\u0423\u0422\u0410\u041b\u042c\u041d\u0423\u042e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u0442\u0430\u0439\u043c\u0435\u0440\u0430  #\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f \u043e\u0440\u0443\u0436\u0438\u044f func equip_item(slot):# \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u0435 if (backpack_items[slot] != null):#\u0415\u0441\u043b\u0438 \u0441\u043b\u043e\u0442 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d var weapon = backpack_items[slot].instance() weapon.position = _backpack.get_slot_position(slot)#\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0443\u044e \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0442\u0430 weapon.name = \"WeaponSlot\" + String(slot)#\u0418\u043c\u0435\u043d\u044f \u043e\u0440\u0443\u0436\u0438\u044f WeaponSlot0..5 add_child(weapon) weapon.scale = Vector2(0.5,0.5)# \u0443 \u043c\u0435\u043d\u044f \u0441\u0442\u043e\u0438\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u0435, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 weapon.damage = ceil(weapon.damage*damage_scale)#\u041f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u0443\u0440\u043e\u043d \u0441 \u043d\u0430\u0448\u0438\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c \u0438 \u043e\u043a\u0440\u0443\u0433\u043b\u044f\u0435\u043c \u0432 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443   #\u043e\u0434\u0435\u0432\u0430\u0435\u043c \u0432\u0441\u0451 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0435 \u043e\u0440\u0443\u0436\u0438\u0435 func equip_all(): for i in range(6):#\u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0443 backpack_item if(get_node(\"WeaponSlot\"+String(i)) != null): var item =get_node(\"WeaponSlot\"+String(i)) #\u0418\u0449\u0435\u043c \u0443\u0437\u0435\u043b if (item != null): #\u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0442\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0441\u043e \u0441\u0446\u0435\u043d\u044b item.queue_free() equip_item(i)# \u0438 \u0440\u0438\u0441\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u0439  #\u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043e\u0440\u0443\u0436\u0438\u0435 func remove_equip_item(slot):#\u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430 if (slot >= 0 &amp;&amp; slot &lt;=5):#\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430 var item = get_node(\"WeaponSlot\" + slot) backpack_items[slot] = null#\u043e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 item.queue_free()#\u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 weapon_count -=1 #\u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u0438 \u043d\u0430 1 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u0440\u0443\u0436\u0438\u044f  #\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0440\u0443\u0436\u0438\u0435 func add_equip_item(item): for i in range(6): if (backpack_items[i] == null):#\u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0443\u0441\u0442\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 backpack_items[i] = item#\u0437\u0430\u043b\u0438\u0432\u0430\u0435\u043c \u0432 \u043d\u0435\u0433\u043e \u0441\u0446\u0435\u043d\u0443 \u043e\u0440\u0443\u0436\u0438\u044f weapon_count +=1 #\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043b\u0438 \u043d\u0430 1 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u0440\u0443\u0436\u0438\u044f equip_all()#\u041e\u0434\u0435\u0432\u0430\u0435\u043c \u0432\u0441\u0451 \u043e\u0440\u0443\u0436\u0438\u0435 return  func can_add(): if (weapon_count &lt; 6): return true else: return false <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u0421\u0446\u0435\u043d\u0430 \u0438\u0433\u0440\u044b<\/h2>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/555\/35f\/b19\/55535fb19747b029b996e16abd6131d4.png\" width=\"221\" height=\"325\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/555\/35f\/b19\/55535fb19747b029b996e16abd6131d4.png\"\/><\/figure>\n<p>\u041d\u0430 \u0441\u0446\u0435\u043d\u0443 \u0438\u0433\u0440\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c Position2D(CharacterSpawnPoint), AudioStreamPlayer2D(MusicTheme), Timer(Difficult), ColorRect(Spawn). CharacterSpawnPoint &#8212; \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u043f\u0440\u0438 \u043d\u0430\u0447\u0430\u043b\u0435 \u0438\u0433\u0440\u044b.MusicTheme &#8212; \u043d\u0430\u0448\u0430 \u0444\u043e\u043d\u043e\u0432\u0430\u044f \u043c\u0443\u0437\u044b\u043a\u0430,Difficult- \u0442\u0430\u0439\u043c\u0435\u0440 \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c,Spawn &#8212; \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e, \u0432 \u043b\u044e\u0431\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0437\u043e\u043c\u0431\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/31e\/0e5\/6d4\/31e0e56d40ebaba94ba541f2e3fcb8d7.png\" alt=\"\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 ColorRect(Spawn)\" title=\"\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 ColorRect(Spawn)\" width=\"951\" height=\"589\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/31e\/0e5\/6d4\/31e0e56d40ebaba94ba541f2e3fcb8d7.png\"\/><\/p>\n<div><figcaption>\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 ColorRect(Spawn)<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 ColorRect(Spawn), \u0432 \u0438\u043d\u0441\u043f\u0435\u043a\u0442\u043e\u0440\u0435 color, \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c A(alfa) &#8212; \u0434\u0435\u043b\u0430\u0435\u043c \u0440\u0430\u0432\u043d\u044b\u043c 0. \u0414\u043b\u044f Timer(Difficult), \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c autostart = true \u0438 Wait Time( \u0443 \u043c\u0435\u043d\u044f 10, \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0435 10 \u0441\u0435\u043a\u0443\u043d\u0434 \u0438\u0433\u0440\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u0435\u0435). \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043c\u0443\u0437\u044b\u043a\u0443 MusicTheme \u0438 \u0437\u0430\u0446\u0438\u043a\u043b\u0438\u0432\u0430\u0435\u043c \u0435\u0451, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u043e autoplay.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0435\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c.<\/p>\n<h3>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043f\u0430\u0432\u043d\u0430 \u0433\u0435\u0440\u043e\u044f<\/h3>\n<pre><code class=\"python\">#\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0433\u0435\u0440\u043e\u044f func spawn_hero(pos): var p if(SelectedCharacter.Character != null):#\u0415\u0441\u043b\u0438 \u0433\u0435\u0440\u043e\u0439 \u0432\u044b\u0431\u0440\u0430\u043d p = SelectedCharacter.Character.instance() else:#\u0415\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d p = CharacterNames.BRUTALHERO.instance() p.name = \"Player\"#\u0417\u0430\u0434\u0430\u0451\u043c \u0438\u043c\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 p.position = pos add_child(p) player = p p.z_index = 2#\u0417\u0430\u0434\u0430\u0451\u043c z_index - 2, \u0447\u0442\u043e\u044b\u0431 \u0433\u0435\u0440\u043e\u0439 \u0445\u043e\u0434\u0438\u043b \u0441\u0432\u0435\u0440\u0445\u0443 \u043a\u0440\u043e\u0432\u0438<\/code><\/pre>\n<p>\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 _init():<\/p>\n<pre><code class=\"python\">#\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 func _init(): spawn_hero(Vector2(0,0))#\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0433\u0435\u0440\u043e\u044f<\/code><\/pre>\n<h3>\u0424\u0443\u043d\u043a\u0446\u0438\u044f _ready<\/h3>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043d\u0430\u0448\u0438 \u043d\u043e\u0432\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 \u0434\u0435\u0440\u0435\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/p>\n<pre><code class=\"python\">onready var _character_spawn_point = $CharacterSpawnPoint onready var spawn = $Spawn<\/code><\/pre>\n<p>\u0418\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f _ready():<\/p>\n<pre><code class=\"python\">#\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0442\u0430\u0440\u0442\u0430(\u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 _init) func _ready(): _mob_spawn_timer.start()#\u0412\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0442\u0430\u0439\u043c\u0435\u0440 \u0441\u043f\u0430\u0432\u043d\u0430 randomize()# \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b player.position = _character_spawn_point.global_position #\u041f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u0438\u0433\u0440\u043e\u043a\u0443 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 player._user_interface.init_health(player.health)# \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448 UI player.connect(\"dead\",self,\"_on_Player_dead\")#\u041f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u0441\u043c\u0435\u0440\u0442\u0438 \u0438\u0433\u0440\u043e\u043a\u0430<\/code><\/pre>\n<h3>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u043e\u0447\u043a\u0438 \u0441\u043f\u0430\u0432\u043d\u0430 \u0432\u0440\u0430\u0433\u0430<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443\u0434\u0430\u043b\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e spawn_zombie() \u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e spawn_point():<\/p>\n<pre><code class=\"python\">#\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u0437\u044b\u0432\u0430 \u0442\u043e\u0447\u043a\u0438 \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0446\u0435\u043d\u0430 \u0441 \u0432\u0440\u0430\u0433\u043e\u043c func spawn_point(enemy): var z = EnemyNames.SPAWNPOINT.instance() var rect_pos = spawn.rect_global_position var rect_size = spawn.rect_size #\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u0441 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u043e\u043c\u0431\u0438 \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u0441\u044f #\u0434\u043b\u044f \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043f\u043e \u0445 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430: #\u0431\u0435\u0440\u0451\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 \u043e\u043f \u0445, \u043a\u0430\u043a \u043c\u0438\u043d\u043d\u0438\u043c\u0443\u043c #\u0438 \u0433\u043b\u043e\u0431\u0430\u043b \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0445 + \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u043e \u0445, \u043a\u0430\u043a \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c #\u0434\u043b\u044f y \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0445-y z.position = Vector2(rand_range(rect_pos.x,rect_pos.x+rect_size.x),rand_range(rect_pos.y,rect_pos.y+rect_size.y)) z.z_index = 100#\u0421\u0442\u0430\u0432\u0438\u043c z_index \u0431\u043e\u043b\u044c\u0448\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0442\u043e\u0447\u043a\u0430 \u0441\u043f\u0430\u0432\u043d\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0433\u0430\u043b\u0430\u0441\u044c \u043f\u043e\u0432\u0435\u0440\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 z.player = player#\u0417\u0430\u0434\u0430\u0451\u043c \u0438\u0433\u0440\u043e\u043a\u0430 z.zombie_enemy = enemy#\u0417\u0430\u0434\u0430\u0451\u043c \u0432\u0440\u0430\u0433\u0430 get_parent().add_child(z)# \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u0447\u043a\u0443 \u0441\u043f\u0430\u0432\u043d\u0430<\/code><\/pre>\n<h3>\u0423\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u044b \u0441 \u0442\u0435\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/h3>\n<p>\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u044b:<\/p>\n<pre><code class=\"python\">#\u041c\u0430\u0441\u0441\u0438\u0432 \u0432\u0441\u0435\u0433\u043e \u043e\u0440\u0443\u0436\u0438\u044f var weapon_massiv = [WeaponsName.BLASTER,WeaponsName.RIFLE, WeaponsName.BAZOOKA, WeaponsName.SHOTGUN] #\u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0433\u0440\u044b var spawn_time = 5 #\u0412\u0440\u0435\u043c\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u0441\u043f\u0430\u0432\u043d\u0430 \u0432\u0440\u0430\u0433\u043e\u0432 var zombie1_chance = 40#\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438 var smart_chance = 40#\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0443\u043c\u043d\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438 var shield_chance = 12#\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0437\u043e\u043c\u0431\u0438 \u0441 \u0449\u0438\u0442\u043e\u043c var scary_chance = 4#\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438 var fat_chance = 4#\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0442\u043e\u043b\u0441\u0442\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438 var spawn_count = 3#\u043a\u043e\u043b-\u0432\u043e \u043f\u0440\u0438\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0437\u043e\u043c\u0431\u0438 var difficult_tick = 0#\u043a\u043e\u043b-\u0432\u043e \u0440\u0430\u0437, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0430\u0441\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c var weapon_add_chance = 0#\u0448\u0430\u043d\u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432<\/code><\/pre>\n<p>\u0421\u0430\u043c\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u044b, \u0431\u0443\u0434\u0435\u0442 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0443 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 Difficult:<\/p>\n<pre><code class=\"python\">#\u0423\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u043c \u0438\u0433\u0440\u0443 func _on_Difficult_timeout(): #\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0448\u0430\u043d\u0441 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0440\u0443\u0436\u0438\u044f var weapon_chance = randi() % 100 #\u0415\u0441\u043b\u0438 \u0447\u0438\u0441\u0442\u043e \u043c\u0435\u043d\u044c\u0448\u0435, \u043d\u0430\u0448\u0435\u0433\u043e \u0448\u0430\u043d\u0441\u0430 \u0438 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c if (weapon_chance &lt;= weapon_add_chance &amp;&amp; player.can_add()): #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u043e\u0440\u0443\u0436\u0438\u044f \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u043e\u0440\u0443\u0436\u0438\u0435 player.add_equip_item(weapon_massiv[randi() % weapon_massiv.size()]) #\u041e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u0448\u0430\u043d\u0441 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 weapon_add_chance = 0 else: #\u0415\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438, \u0442\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0448\u0430\u043d\u0441 weapon_add_chance+=5 #\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u044f difficult_tick += 1 #\u041a\u043e\u0433\u0434\u0430 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u043a\u0440\u0430\u0442\u0435\u043d 3, \u0442\u043e if (difficult_tick % 3 == 0): #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438 spawn_count+=1 #\u0438 \u043c\u0435\u043d\u044f\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0438 shield_chance += 4 if (shield_chance > 20): #\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 20% shield_chance = 20 fat_chance += 2 if (fat_chance > 20): #\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 20% fat_chance = 20 scary_chance += 2 if (scary_chance > 20):#\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 20% scary_chance = 20 zombie1_chance -= 4 if (zombie1_chance &lt; 20):#\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 20% zombie1_chance = 20 smart_chance -= 4 if (smart_chance &lt; 20):#\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 20% smart_chance = 20 #zombie1 \u0438 smart \u043a\u0440\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0445 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c, \u0437\u0430 \u0441\u0447\u0451\u0442 \u044d\u0442\u043e\u0433\u043e #\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u0437\u043e\u043c\u0431\u0438 #\u0441\u0443\u043c\u043c\u0430 \u0448\u0430\u043d\u0441\u0430 \u043f\u0440\u0438\u0437\u044b\u0432\u0430 \u0432\u0441\u0435\u0445 \u0437\u043e\u043c\u0431\u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u043d\u0430 100.<\/code><\/pre>\n<h3>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043e\u0442 MobSpawnTimer<\/h3>\n<pre><code class=\"python\">#\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u0439\u043c\u0435\u0440\u0430 MobSpawnTimer func _on_MobSpawnTimer_timeout(): #\u0417\u0430\u0434\u0430\u0451\u043c \u0446\u0438\u043a\u043b \u0434\u043b\u044f \u043f\u0440\u0438\u0437\u044b\u0432\u0430 \u0437\u043e\u043c\u0431\u0438 for i in range(spawn_count): #\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0448\u0430\u043d\u0441, \u0434\u0435\u043b\u0430\u0435\u043c \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 101 - \u0431\u0443\u0434\u0443\u0442 \u0447\u0438\u0441\u043b\u0430 \u0432 \u0440\u0430\u0434\u0438\u0443\u0441\u0435 \u043e\u0442 (0 \u0434\u043e 100) var chance = randi() % 101 if (chance &lt;= zombie1_chance): spawn_point(EnemyNames.ZOMBIE1) elif (chance &lt;= zombie1_chance + smart_chance): spawn_point(EnemyNames.SMARTZOMBIE) elif (chance &lt;= zombie1_chance + smart_chance + shield_chance): spawn_point(EnemyNames.ZOMBIESHEILD) elif (chance &lt;= zombie1_chance + smart_chance + shield_chance + scary_chance): spawn_point(EnemyNames.ZOMBIESCARY) elif (chance &lt;= zombie1_chance + smart_chance + + shield_chance + scary_chance + fat_chance): spawn_point(EnemyNames.FATZOMBIE) #\u0415\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a, \u0442\u043e \u0441\u043f\u0430\u0432\u043d\u0438\u043c Zombie1 else: spawn_point(EnemyNames.ZOMBIE1) #\u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u043b\u0435\u0434. \u0434\u0430\u043d\u043d\u044b\u0445 #zombie1_chance = 40 #smart_chance = 40 #shield_chance = 12 #scary_chance = 4 #fat_chance = 4 #\u0415\u0441\u043b\u0438 \u043e\u0442 0 \u0434\u043e 40, \u0442\u043e Zombie1, \u0435\u0441\u043b\u0438 \u043e\u0442 41 \u0434\u043e 80, \u0442\u043e Smart_zombie, #\u0415\u0441\u043b\u0438 \u0442\u043e 81 \u0434\u043e 92, \u0442\u043e Zombie_shield, \u0435\u0441\u043b\u0438 \u043e\u0442 93 \u0434\u043e 96, \u0442\u043e Zombie_scary #\u0415\u0441\u043b\u0438 \u043e\u0442 97 \u0434\u043e 100, \u0442\u043e Fat_zombie _mob_spawn_timer.wait_time = spawn_time#\u0437\u0430\u0434\u0430\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f _mob_spawn_timer.start()#\u0432\u043a\u043b\u044e\u0447\u0438\u043b\u0438<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u0446\u0435\u043d\u044b \u0438\u0433\u0440\u044b<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">extends Node2D   #\u0421\u0446\u0435\u043d\u0430 \u0412\u0440\u0430\u0433\u0430 export (PackedScene) var zombie_enemy  #\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0435\u0440\u0435\u0432\u0430 onready var _mob_spawn_timer = $MobSpawnTimer onready var player = $Player onready var _character_spawn_point = $CharacterSpawnPoint onready var spawn = $Spawn #\u041c\u0430\u0441\u0441\u0438\u0432 \u0432\u0441\u0435\u0433\u043e \u043e\u0440\u0443\u0436\u0438\u044f var weapon_massiv = [WeaponsName.BLASTER,WeaponsName.RIFLE, WeaponsName.BAZOOKA, WeaponsName.SHOTGUN] #\u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0433\u0440\u044b var spawn_time = 5 #\u0412\u0440\u0435\u043c\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u0441\u043f\u0430\u0432\u043d\u0430 \u0432\u0440\u0430\u0433\u043e\u0432 var zombie1_chance = 40#\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438 var smart_chance = 40#\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0443\u043c\u043d\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438 var shield_chance = 12#\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0437\u043e\u043c\u0431\u0438 \u0441 \u0449\u0438\u0442\u043e\u043c var scary_chance = 4#\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438 var fat_chance = 4#\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0442\u043e\u043b\u0441\u0442\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438 var spawn_count = 3#\u043a\u043e\u043b-\u0432\u043e \u043f\u0440\u0438\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0437\u043e\u043c\u0431\u0438 var difficult_tick = 0#\u043a\u043e\u043b-\u0432\u043e \u0440\u0430\u0437, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0430\u0441\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c var weapon_add_chance = 0#\u0448\u0430\u043d\u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u0437\u044b\u0432\u0430 \u0442\u043e\u0447\u043a\u0438 \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0446\u0435\u043d\u0430 \u0441 \u0432\u0440\u0430\u0433\u043e\u043c func spawn_point(enemy): var z = EnemyNames.SPAWNPOINT.instance() var rect_pos = spawn.rect_global_position var rect_size = spawn.rect_size #\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u0441 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u043e\u043c\u0431\u0438 \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u0441\u044f #\u0434\u043b\u044f \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043f\u043e \u0445 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430: #\u0431\u0435\u0440\u0451\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 \u043e\u043f \u0445, \u043a\u0430\u043a \u043c\u0438\u043d\u043d\u0438\u043c\u0443\u043c #\u0438 \u0433\u043b\u043e\u0431\u0430\u043b \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0445 + \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u043e \u0445, \u043a\u0430\u043a \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c #\u0434\u043b\u044f y \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0445-y z.position = Vector2(rand_range(rect_pos.x,rect_pos.x+rect_size.x),rand_range(rect_pos.y,rect_pos.y+rect_size.y)) z.z_index = 100#\u0421\u0442\u0430\u0432\u0438\u043c z_index \u0431\u043e\u043b\u044c\u0448\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0442\u043e\u0447\u043a\u0430 \u0441\u043f\u0430\u0432\u043d\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0433\u0430\u043b\u0430\u0441\u044c \u043f\u043e\u0432\u0435\u0440\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 z.player = player#\u0417\u0430\u0434\u0430\u0451\u043c \u0438\u0433\u0440\u043e\u043a\u0430 z.zombie_enemy = enemy#\u0417\u0430\u0434\u0430\u0451\u043c \u0432\u0440\u0430\u0433\u0430 get_parent().add_child(z)# \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u0447\u043a\u0443 \u0441\u043f\u0430\u0432\u043d\u0430  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 func _init(): spawn_hero(Vector2(0,0))#\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0433\u0435\u0440\u043e\u044f  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0442\u0430\u0440\u0442\u0430(\u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 _init) func _ready(): _mob_spawn_timer.start()#\u0412\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0442\u0430\u0439\u043c\u0435\u0440 \u0441\u043f\u0430\u0432\u043d\u0430 randomize()# \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b player.position = _character_spawn_point.global_position #\u041f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u0438\u0433\u0440\u043e\u043a\u0443 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 player._user_interface.init_health(player.health)# \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448 UI player.connect(\"dead\",self,\"_on_Player_dead\")#\u041f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u0441\u043c\u0435\u0440\u0442\u0438 \u0438\u0433\u0440\u043e\u043a\u0430  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u0439\u043c\u0435\u0440\u0430 MobSpawnTimer func _on_MobSpawnTimer_timeout(): #\u0417\u0430\u0434\u0430\u0451\u043c \u0446\u0438\u043a\u043b \u0434\u043b\u044f \u043f\u0440\u0438\u0437\u044b\u0432\u0430 \u0437\u043e\u043c\u0431\u0438 for i in range(spawn_count): #\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0448\u0430\u043d\u0441, \u0434\u0435\u043b\u0430\u0435\u043c \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 101 - \u0431\u0443\u0434\u0443\u0442 \u0447\u0438\u0441\u043b\u0430 \u0432 \u0440\u0430\u0434\u0438\u0443\u0441\u0435 \u043e\u0442 (0 \u0434\u043e 100) var chance = randi() % 101 if (chance &lt;= zombie1_chance): spawn_point(EnemyNames.ZOMBIE1) elif (chance &lt;= zombie1_chance + smart_chance): spawn_point(EnemyNames.SMARTZOMBIE) elif (chance &lt;= zombie1_chance + smart_chance + shield_chance): spawn_point(EnemyNames.ZOMBIESHEILD) elif (chance &lt;= zombie1_chance + smart_chance + shield_chance + scary_chance): spawn_point(EnemyNames.ZOMBIESCARY) elif (chance &lt;= zombie1_chance + smart_chance + + shield_chance + scary_chance + fat_chance): spawn_point(EnemyNames.FATZOMBIE) #\u0415\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a, \u0442\u043e \u0441\u043f\u0430\u0432\u043d\u0438\u043c Zombie1 else: spawn_point(EnemyNames.ZOMBIE1) #\u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u043b\u0435\u0434. \u0434\u0430\u043d\u043d\u044b\u0445 #zombie1_chance = 40 #smart_chance = 40 #shield_chance = 12 #scary_chance = 4 #fat_chance = 4 #\u0415\u0441\u043b\u0438 \u043e\u0442 0 \u0434\u043e 40, \u0442\u043e Zombie1, \u0435\u0441\u043b\u0438 \u043e\u0442 41 \u0434\u043e 80, \u0442\u043e Smart_zombie, #\u0415\u0441\u043b\u0438 \u0442\u043e 81 \u0434\u043e 92, \u0442\u043e Zombie_shield, \u0435\u0441\u043b\u0438 \u043e\u0442 93 \u0434\u043e 96, \u0442\u043e Zombie_scary #\u0415\u0441\u043b\u0438 \u043e\u0442 97 \u0434\u043e 100, \u0442\u043e Fat_zombie _mob_spawn_timer.wait_time = spawn_time#\u0437\u0430\u0434\u0430\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f _mob_spawn_timer.start()#\u0432\u043a\u043b\u044e\u0447\u0438\u043b\u0438    #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b, \u043e\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u043e \u0441\u043c\u0435\u0440\u0442\u0438 func _on_Player_dead(): get_tree().call_group(\"all_enemy\", \"queue_free\")#\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0441\u0435\u0445 \u0432\u0440\u0430\u0433\u043e\u0432 \u0441\u043e \u0441\u0446\u0435\u043d\u044b SceneLoader.build_map_path(\"MainMenu\")#\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0433\u0435\u0440\u043e\u044f func spawn_hero(pos): var p if(SelectedCharacter.Character != null):#\u0415\u0441\u043b\u0438 \u0433\u0435\u0440\u043e\u0439 \u0432\u044b\u0431\u0440\u0430\u043d p = SelectedCharacter.Character.instance() else:#\u0415\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d p = CharacterNames.BRUTALHERO.instance() p.name = \"Player\"#\u0417\u0430\u0434\u0430\u0451\u043c \u0438\u043c\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 p.position = pos add_child(p) player = p p.z_index = 2#\u0417\u0430\u0434\u0430\u0451\u043c z_index - 2, \u0447\u0442\u043e\u044b\u0431 \u0433\u0435\u0440\u043e\u0439 \u0445\u043e\u0434\u0438\u043b \u0441\u0432\u0435\u0440\u0445\u0443 \u043a\u0440\u043e\u0432\u0438   #\u0423\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u043c \u0438\u0433\u0440\u0443 func _on_Difficult_timeout(): #\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0448\u0430\u043d\u0441 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0440\u0443\u0436\u0438\u044f var weapon_chance = randi() % 100 #\u0415\u0441\u043b\u0438 \u0447\u0438\u0441\u0442\u043e \u043c\u0435\u043d\u044c\u0448\u0435, \u043d\u0430\u0448\u0435\u0433\u043e \u0448\u0430\u043d\u0441\u0430 \u0438 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c if (weapon_chance &lt;= weapon_add_chance &amp;&amp; player.can_add()): #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u043e\u0440\u0443\u0436\u0438\u044f \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u043e\u0440\u0443\u0436\u0438\u0435 player.add_equip_item(weapon_massiv[randi() % weapon_massiv.size()]) #\u041e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u0448\u0430\u043d\u0441 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 weapon_add_chance = 0 else: #\u0415\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438, \u0442\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0448\u0430\u043d\u0441 weapon_add_chance+=5 #\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u044f difficult_tick += 1 #\u041a\u043e\u0433\u0434\u0430 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u043a\u0440\u0430\u0442\u0435\u043d 3, \u0442\u043e if (difficult_tick % 3 == 0): #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438 spawn_count+=1 #\u0438 \u043c\u0435\u043d\u044f\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0438 shield_chance += 4 if (shield_chance > 20): #\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 20% shield_chance = 20 fat_chance += 2 if (fat_chance > 20): #\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 20% fat_chance = 20 scary_chance += 2 if (scary_chance > 20):#\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 20% scary_chance = 20 zombie1_chance -= 4 if (zombie1_chance &lt; 20):#\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 20% zombie1_chance = 20 smart_chance -= 4 if (smart_chance &lt; 20):#\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 20% smart_chance = 20 #zombie1 \u0438 smart \u043a\u0440\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0445 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c, \u0437\u0430 \u0441\u0447\u0451\u0442 \u044d\u0442\u043e\u0433\u043e #\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u0437\u043e\u043c\u0431\u0438 #\u0441\u0443\u043c\u043c\u0430 \u0448\u0430\u043d\u0441\u0430 \u043f\u0440\u0438\u0437\u044b\u0432\u0430 \u0432\u0441\u0435\u0445 \u0437\u043e\u043c\u0431\u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u043d\u0430 100. <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u0441\u0447\u0451\u0442\u0430<\/h2>\n<p>\u041f\u043e\u0434 \u043a\u043e\u043d\u0435\u0446 \u0441\u0442\u0430\u0442\u044c\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u0441\u0447\u0451\u0442\u0430. \u0411\u0443\u0434\u0435\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0432 \u0444\u0430\u0439\u043b Save.Save, \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (C:\\Users\\\u0438\u043c\u044f_\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\\AppData\\Roaming\\Godot\\app_userdata\\\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430). \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u0430\u043c \u0444\u0430\u0439\u043b \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0432 \u043d\u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0447\u0451\u0442\u0430:<\/p>\n<pre><code class=\"python\">#\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0441\u0447\u0451\u0442\u0430 func get_score(): return int(_score.text)<\/code><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u043d\u0430\u0448 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d \u0441 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043d\u0435\u0433\u043e \u0442\u0430\u043a-\u0436\u0435 \u0438\u0445 \u043b\u0443\u0447\u0448\u0438\u0435 \u0441\u0447\u0435\u0442\u0430 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0438\u0445:<\/p>\n<pre><code class=\"python\">#\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441 \u043b\u0443\u0447\u0448\u0438\u043c\u0438 \u0441\u0447\u0435\u0442\u0430\u043c\u0438 var brutalhero_score var cowboy_score var soldier_score var robot_score  #\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043b\u0443\u0447\u0448\u0438\u0439 \u0441\u0447\u0451\u0442 func set_score(): var file = File.new()#\u043d\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b file.open(\"user:\/\/Save.Save\", File.READ)#\u041e\u0442\u043a\u0440\u044b\u043b\u0438 var content = file.get_as_text()#\u0417\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0444\u0430\u0439\u043b\u0430 var dir = parse_json(content)#\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u043a\u043e\u043d\u0442\u0435\u043d\u0442, \u043a\u0430\u043a \"\u0421\u043b\u043e\u0432\u0430\u0440\u044c\" #\u0415\u0441\u043b\u0438 \u0441\u043b\u043e\u0432\u0430\u0442\u044c \u043d\u0435 null, \u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043d\u0435\u0433\u043e  if(dir!=null): brutalhero_score = dir[\"BrutalHero\"] cowboy_score = dir[\"Cowboy\"] soldier_score = dir[\"Soldier\"] robot_score = dir[\"Robot\"] #\u0418\u043d\u0430\u0447\u0435 \u043d\u043e\u043b\u0438\u043a\u0438 else: brutalhero_score = 0 cowboy_score = 0 soldier_score = 0 robot_score = 0<\/code><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u0446\u0435\u043d\u044b \u0438\u0433\u0440\u044b, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0447\u0451\u0442\u0430 \u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0451 \u043f\u0440\u0438 \u0441\u043c\u0435\u0440\u0442\u0438 \u0438\u0433\u0440\u043e\u043a\u0430.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"python\">#\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0431\u0435\u0440\u0451\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0447\u0451\u0442 func save_record(score): #\u041e\u0431\u044a\u044f\u0432\u0438\u043b\u0438 \u043d\u0432\u043e\u044b\u0439 \u0444\u0430\u0439\u043b var save_file = File.new() #\u0421\u043e\u0437\u0434\u0430\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 \"\u0441\u043b\u043e\u0432\u0430\u0440\u044c\" \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0432 \u043d\u0435\u0433\u043e \u043b\u0443\u0447\u0448\u0438\u0439 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 var save_dict ={ \"BrutalHero\": CharacterNames.brutalhero_score, \"Cowboy\":CharacterNames.cowboy_score, \"Robot\":CharacterNames.robot_score, \"Soldier\":CharacterNames.soldier_score, } #\u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0439 \u0433\u0435\u0440\u043e\u0439 \u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0447\u0451\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043b\u0443\u0447\u0448\u0435\u0433\u043e, \u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0434\u0440\u0443\u0433\u043e\u0439 if(SelectedCharacter.Character == CharacterNames.BRUTALHERO &amp;&amp; score > save_dict[\"BrutalHero\"]): save_dict[\"BrutalHero\"] = score if(SelectedCharacter.Character == CharacterNames.COWBOY &amp;&amp; score > save_dict[\"Cowboy\"]): save_dict[\"Cowboy\"] = score if(SelectedCharacter.Character == CharacterNames.ROBOT &amp;&amp; score > save_dict[\"Robot\"]): save_dict[\"Robot\"] = score if(SelectedCharacter.Character == CharacterNames.SOLDIER &amp;&amp; score > save_dict[\"Soldier\"]): save_dict[\"Soldier\"] = score #\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0438\u043b \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c save_file.open(\"user:\/\/save.save\", File.WRITE) #\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c save_file.store_line(to_json(save_dict))<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043e \u0441\u043c\u0435\u0440\u0442\u0438 \u0438\u0433\u0440\u043e\u043a\u0430:<\/p>\n<pre><code class=\"python\">#\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b, \u043e\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u043e \u0441\u043c\u0435\u0440\u0442\u0438 func _on_Player_dead(): get_tree().call_group(\"all_enemy\", \"queue_free\")#\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0441\u0435\u0445 \u0432\u0440\u0430\u0433\u043e\u0432 \u0441\u043e \u0441\u0446\u0435\u043d\u044b save_record(player._user_interface.get_score())#\u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b SceneLoader.build_map_path(\"MainMenu\")#\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e<\/code><\/pre>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u0446\u0435\u043d\u0443 \u0441 \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430. \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 _ready() \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 set_score, \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u0430 CharacterNames. \u0438 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0432 \u043d\u0430\u0434\u043f\u0438\u0441\u044c \u0431\u0443\u0434\u0435\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0440\u0435\u043a\u043e\u0440\u0434.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f _ready():<\/p>\n<pre><code class=\"python\">func _ready(): CharacterNames.set_score()#\u0412\u0437\u044f\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f<\/code><\/pre>\n<p>\u041e\u0434\u0438\u043d \u0438\u0437 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430:<\/p>\n<pre><code class=\"python\">#\u0415\u0441\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d BrutalHero func _on_BrutalHeroBtn_pressed(): _animated_sprite.play(\"Dance1\")#\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0435\u0433\u043e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e _start_game_btn.disabled = false#\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u0441\u0442\u0430\u0440\u0442\u0430 \u0438\u0433\u0440\u044b _character_param.text = \"Character \\nBrutalHero \\nDamage: 1 \\nHP: 5 \\nSpeed: 200 \\nEquip: Blaster \\nMax score: \" + String(CharacterNames.brutalhero_score)#\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442 SelectedCharacter.set_character(CharacterNames.BRUTALHERO)#\u0412 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c BrutalHero<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u0435\u043d\u044e \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430<\/summary>\n<div class=\"spoiler__content\">\n<\/div>\n<\/details>\n<hr\/>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0434\u043e\u0448\u043b\u0430 \u043a \u043a\u043e\u043d\u0446\u0443. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043d\u0430 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0433\u0440\u0443 \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d\u043d\u043e\u0439 \u0432 \u043d\u0435\u0451 \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0433\u0440\u0430\u0442\u044c \u0438 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0451 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0440\u0435\u043a\u043e\u0440\u0434\u044b. \u0415\u0449\u0451 \u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0439\u0434\u0435\u0442 \u043e\u0434\u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c: \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u0435\u0440, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043a, \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0443 \u043f\u043e\u0434\u043d\u044f\u0442\u0438\u044f \u0443\u0440\u043e\u0432\u043d\u044f \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0441 \u0447\u0435\u043c-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0434\u0435\u0440\u0435\u0432\u0430 \u0442\u0430\u043b\u0430\u043d\u0442\u043e\u0432, \u0432\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0438 3 \u043f\u0443\u043d\u043a\u0442\u0430 \u0432 \u043e\u043f\u0440\u043e\u0441\u0435 \u043f\u043e\u0434 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439(\u0432\u0441\u0435 \u043d\u0430\u0431\u0440\u0430\u043b\u0438 \u043f\u043e 7, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f 777, \u043d\u0430 \u0443\u0434\u0430\u0447\u0443 \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c).<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p> <!----> <!----><\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/746328\/\"> https:\/\/habr.com\/ru\/articles\/746328\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/745716\/\" rel=\"noopener noreferrer nofollow\"><u>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c<\/u><\/a><\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/745956\/\" rel=\"noopener noreferrer nofollow\"><u>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0432\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u044c<\/u><\/a><\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u043f\u0435\u0440\u0432\u0443\u044e \u0438\u0433\u0440\u0443 \u043d\u0430 Godot 3.5. \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0438 \u0434\u043b\u044f \u043e\u0440\u0443\u0436\u0438\u044f, \u043d\u0435\u0447\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435\u0435 \u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e \u0438 \u0441\u0446\u0435\u043d\u0443 \u0438\u0433\u0440\u044b. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u0433\u0440\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439, \u043c\u0435\u043d\u044e \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430, \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0431\u0443\u0434\u0435\u043c \u0432\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0439 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u043b\u0438\u0434\u0435\u0440\u0431\u043e\u0440\u0434, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0430\u0433\u043e\u0432 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0430\u043c\u0438, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043c\u0443\u0437\u044b\u043a\u0443 \u043a \u043d\u0430\u0448\u0435\u0439 \u0438\u0433\u0440\u0435 \u0438 \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441\u0446\u0435\u043d\u0443 \u0438\u0433\u0440\u044b.<\/p>\n<h2>\u041f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0438<\/h2>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0440\u0438\u0441\u0443\u0435\u043c \u0435\u0449\u0451 3-\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439. \u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430\u043c\u0438 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u043c \u0438\u043c\u0438 \u043e\u0440\u0443\u0436\u0438\u0435 \u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0438 \u0432 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0430\u0445( \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c, \u0445\u043f), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0449\u0451 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0443 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0443 \u0443\u0440\u043e\u043d\u0430, \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u0442\u0441\u044f \u0443\u0440\u043e\u043d \u043e\u0440\u0443\u0436\u0438\u044f.<\/p>\n<h3>\u0421\u0438\u043d\u0433\u043b\u0442\u043e\u043d WeaponsName<\/h3>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0447\u043d\u0451\u043c \u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0433\u043e \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0441\u0435\u0431\u0435 \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442(\u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u0446\u0435\u043d\u044b \u043e\u0440\u0443\u0436\u0438\u044f) \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u043c \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u043c.<\/p>\n<figure class=\"float\"><\/figure>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b Node \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0435\u0433\u043e \u0432 \u043f\u0430\u043f\u043a\u0443 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432. \u0412 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u044b. \u041f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 -> \u0410\u0432\u0442\u043e\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0443\u0442\u044c \u043a \u043d\u0430\u0448\u0435\u043c\u0443 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u0443, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0438 \u0441\u0442\u0430\u0432\u0438\u043c \u0433\u0430\u043b\u043e\u0447\u043a\u0443 \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435 &#171;\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f&#187;.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u043a\u0440\u0438\u043f\u0442\u0430. \u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u044b \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u0440\u0443\u0436\u0438\u044f:<\/p>\n<pre><code class=\"python\">extends Node #\u0423 \u0432\u0430\u0441 \u043f\u0443\u0442\u044c \u043a \u0441\u0446\u0435\u043d\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0447\u0442\u043e #\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0435 \u0441\u0441\u044b\u043b\u043a\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u043e\u0440\u0443\u0436\u0438\u0435.tscn \u043d\u0435 \u043d\u0430 .gd \u0438\u043b\u0438 \u043d\u0435 \u043d\u0430 \u043f\u0443\u043b\u044f.tscn const BLASTER = preload(\"res:\/\/scenes\/Weapons\/Blaster\/Blaster.tscn\") const SHOTGUN = preload(\"res:\/\/scenes\/Weapons\/Shotgun\/Shotgun.tscn\") const RIFLE = preload(\"res:\/\/scenes\/Weapons\/Rifle\/Rifle.tscn\") const BAZOOKA = preload(\"res:\/\/scenes\/Weapons\/Bazooka\/Bazooka.tscn\")<\/code><\/pre>\n<h3>DefaultCharacter<\/h3>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0439 \u0431\u043e\u043b\u0432\u0430\u043d\u043a\u0438. \u0412 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 DefaultCharacter, \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0443\u0440\u043e\u043d\u0430 \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a \u043f\u0443\u0441\u0442\u044b\u043c.<\/p>\n<pre><code class=\"python\">export var damage_scale:float = 1#\u041c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \u0443\u0440\u043e\u043d\u0430 var backpack_items = [null,null,null,null,null,null]#\u0440\u044e\u043a\u0437\u0430\u043a<\/code><\/pre>\n<p>\u0422\u0430\u043a-\u0436\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442, \u0443\u0440\u043e\u043d, \u043d\u0443\u0436\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0443\u0440\u043e\u043d \u043e\u0440\u0443\u0436\u0438\u044f, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e equip_item():<\/p>\n<pre><code class=\"python\">#\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f \u043e\u0440\u0443\u0436\u0438\u044f func equip_item(slot):# \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u0435 if (backpack_items[slot] != null):#\u0415\u0441\u043b\u0438 \u0441\u043b\u043e\u0442 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d var weapon = backpack_items[slot].instance() weapon.position = _backpack.get_slot_position(slot)#\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0443\u044e \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0442\u0430 weapon.name = \"WeaponSlot\" + String(slot)#\u0418\u043c\u0435\u043d\u044f \u043e\u0440\u0443\u0436\u0438\u044f WeaponSlot0..5 add_child(weapon) weapon.scale = Vector2(0.5,0.5)# \u0443 \u043c\u0435\u043d\u044f \u0441\u0442\u043e\u0438\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u0435, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 weapon.damage = ceil(weapon.damage*damage_scale)#\u041f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u0443\u0440\u043e\u043d \u0441 \u043d\u0430\u0448\u0438\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c \u0438 \u043e\u043a\u0440\u0443\u0433\u043b\u044f\u0435\u043c \u0432 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443<\/code><\/pre>\n<figure class=\"float\"><\/figure>\n<p> \u0422\u0430\u043a-\u0436\u0435 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u043c \u043a Camera2D \u0434\u043e\u0447\u0435\u0440\u043d\u044e\u044e \u0441\u0446\u0435\u043d\u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0433\u0440\u044b. \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c \u0443\u0437\u0435\u043b \u0432 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u0443\u0433\u043e\u043b \u043a\u0430\u043c\u0435\u0440\u044b. \u0422\u0430\u043a-\u0436\u0435 \u0443\u0431\u0435\u0440\u0451\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 \u0441 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0446\u0435\u043d\u044b \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u044d\u0442\u043e \u0432 \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e take_damage(dmg)<\/p>\n<pre><code class=\"python\">#\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 func take_damage(dmg): if(_immortal_timer.is_stopped()): #\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0435 \u0431\u0435\u0441\u0441\u043c\u0435\u0440\u0442\u0435\u043d \u043b\u0438 \u043d\u0430\u0448 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436 health -= dmg _animated_sprite.play(\"TakeDamage\") emit_signal(\"take_damage\",dmg) #\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0443\u0440\u043e\u043d\u0430 _user_interface.take_damage(dmg) _immortal_timer.start() #\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0430\u0439\u043c\u0435\u0440 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 if(health == 0): emit_signal(\"dead\")#\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u0441\u043c\u0435\u0440\u0442\u0438<\/code><\/pre>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439 \u0442\u0430\u043a-\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e, \u043a\u0430\u043a \u0438 \u043e\u0440\u0443\u0436\u0438\u0435 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u0443\u044e \u0441\u0446\u0435\u043d\u0443, \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c \u0441\u0446\u0435\u043d\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0431\u043e\u043b\u0432\u0430\u043d\u043a\u0443 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430, \u043c\u0435\u043d\u044f\u0435\u043c \u0435\u043c\u0443 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c SpriteFrame \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043c\u0443\u0437\u044b\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0442\u0435\u043c\u0443 \u0438 \u0420\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442.<\/p>\n<p>\u0412 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0440\u0443\u0436\u0438\u044f \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0443 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 _ready():<\/p>\n<pre><code>func _ready(): add_equip_item(WeaponsName.BLASTER) #\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0432 \u043d\u0435\u044e # \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0438\u0437 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u0430<\/code><\/pre>\n<p>\u041f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430\u043c\u0438. \u041d\u0438\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043c\u043e\u0438\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u041f\u0435\u0440\u0441\u043e\u043d\u0430\u0436<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0440\u0443\u0436\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0425\u041f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0423\u0440\u043e\u043d<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">BrutalHero<\/p>\n<\/td>\n<td>\n<p align=\"left\">1x\u0411\u043b\u0430\u0441\u0442\u0435\u0440<\/p>\n<\/td>\n<td>\n<p align=\"left\">5<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">200<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Cowboy<\/p>\n<\/td>\n<td>\n<p align=\"left\">1x\u0414\u0440\u043e\u0431\u043e\u0432\u0438\u043a<\/p>\n<\/td>\n<td>\n<p align=\"left\">3<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.5<\/p>\n<\/td>\n<td>\n<p align=\"left\">150<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Robot<\/p>\n<\/td>\n<td>\n<p align=\"left\">1x\u0412\u0438\u043d\u0442\u043e\u0432\u043a\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">10<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.75<\/p>\n<\/td>\n<td>\n<p align=\"left\">300<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Soldier<\/p>\n<\/td>\n<td>\n<p align=\"left\">1x\u0411\u0430\u0437\u0443\u043a\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">5<\/p>\n<\/td>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">150<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u0421\u0438\u043d\u0433\u043b\u0442\u043e\u043d CharacterNames<\/h3>\n<figure class=\"float\"><\/figure>\n<p>\u041f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0435\u0433\u043e \u0432 \u0442\u0443 \u0436\u0435 \u043f\u0430\u043f\u043a\u0443, \u0447\u0442\u043e \u0438 \u0434\u0432\u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u0430 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0432 \u0430\u0432\u0442\u043e\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e.<\/p>\n<pre><code class=\"python\">extends Node  const BRUTALHERO = preload(\"res:\/\/scenes\/Character\/BrutalHero\/BrutalHero.tscn\") const COWBOY = preload(\"res:\/\/scenes\/Character\/Cowboy\/Cowboy.tscn\") const SOLDIER = preload(\"res:\/\/scenes\/Character\/Soldier\/Soldier.tscn\") const ROBOT = preload(\"res:\/\/scenes\/Character\/Robot\/Robot.tscn\") <\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0441 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430\u043c\u0438 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c\u0443 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043e\u0440\u0443\u0436\u0438\u044f.<\/p>\n<h2>\u041e\u0440\u0443\u0436\u0438\u0435<\/h2>\n<p>\u0412 \u043e\u0440\u0443\u0436\u0438\u0435 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u0432\u0443\u043a\u0438 \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0430.<\/p>\n<figure class=\"float\"><\/figure>\n<p>\u041d\u0430 \u0441\u0446\u0435\u043d\u0443 \u0431\u043e\u043b\u0432\u0430\u043d\u043a\u0443 \u0434\u043b\u044f \u043e\u0440\u0443\u0436\u0438\u044f \u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c AudioStreamPlayer(WeaponSound). \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u0432\u0443\u043a\u0430 \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0430 \u043e\u0440\u0443\u0436\u0438\u044f. \u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043c\u0443\u0437\u044b\u043a\u0443 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c WeaponSound \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0412 \u0438\u043d\u0441\u043f\u0435\u043a\u0442\u043e\u0440\u0435 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 Stream \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0441\u0432\u043e\u0439 \u0444\u0430\u0439\u043b \u0441 \u043c\u0443\u0437\u044b\u043a\u043e\u0439, \u0434\u043b\u044f \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0430, \u043b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c .wav \u0444\u0430\u0439\u043b\u044b, \u0434\u043b\u044f \u0444\u043e\u043d\u043e\u0432\u043e\u0439 \u043c\u0443\u0437\u044b\u043a\u0438, \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 .ogg \u0444\u043e\u0440\u043c\u0430\u0442, \u043d\u043e \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 wav \u0438\u043b\u0438 mp3, \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0433\u043e, \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u0438 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0439 \u043e\u0442 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442.<\/p>\n<p>\u0418 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u043a\u0440\u0438\u043f\u0442\u0430, \u0432 \u043d\u0451\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0443\u044e\u0441\u044f \u043d\u0430 WeaponSound:<\/p>\n<pre><code class=\"python\">onready var _weapon_sound = $WeaponSound<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0446\u0435\u043d\u0435 \u0441 \u043e\u0440\u0443\u0436\u0438\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0432\u0443\u043a \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0430 \u043e\u0442 \u043e\u0440\u0443\u0436\u0438\u044f \u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e fire() \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0440\u0443\u0436\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c:<\/p>\n<pre><code class=\"python\">_weapon_sound.play()<\/code><\/pre>\n<p>\u0422\u0430\u043a-\u0436\u0435 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c \u0437\u0432\u0443\u043a\u0430, \u043e\u043d\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f, \u043d\u043e \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0433\u043b\u0443\u0448\u0438\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u0430. \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0438\u043b\u0438 \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0443\u0442\u0451\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 Volume dB, \u0443 \u0443\u0437\u043b\u0430 AudioPlayer.<\/p>\n<h3>\u0411\u0430\u0437\u0443\u043a\u0430<\/h3>\n<p>\u041d\u0430 \u0431\u0430\u0437\u0443\u043a\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0432\u0443\u043a \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0430 \u0441\u043d\u0430\u0440\u044f\u0434\u0430, \u043d\u043e \u0438 \u0437\u0432\u0443\u043a \u0432\u0437\u0440\u044b\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f. <\/p>\n<figure class=\"float\"><\/figure>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043d\u0430 \u0441\u0446\u0435\u043d\u0443 \u0440\u0430\u043a\u0435\u0442\u044b \u0431\u0430\u0437\u0443\u043a\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c AudioStreamPlayer(BumSound), \u043a\u0430\u043a \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443 Bum<\/p>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043a\u043e\u0434\u0430:<\/p>\n<p>\u041d\u0443\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0443\u0437\u0435\u043b BumSound \u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0437\u0432\u0443\u043a \u0432\u0437\u0440\u044b\u0432\u0430 \u0432 collision_action:<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0440\u0430\u043a\u0435\u0442\u044b<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">extends \"res:\/\/scenes\/Weapons\/DefaultWeapon\/DefaultBullet.gd\"  onready var _collision_shape = $CollisionShape2D#\u0424\u0438\u0433\u0443\u0440\u0430 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439 \u0440\u0430\u043a\u0435\u0442\u044b onready var _collision_shape_bum = $Bum\/CollisionShapeBum#\u0424\u0438\u0433\u0443\u0440\u0430 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439 \u0432\u0437\u0440\u044b\u0432\u0430 onready var _bum_live_time = $Bum\/BumLiveTime #\u0422\u0430\u0439\u043c\u0435\u0440 \u0436\u0438\u0437\u043d\u0438 \u0432\u0437\u0440\u044b\u0432\u0430 onready var _bum_sound = $Bum\/BumSound #\u0417\u0432\u0443\u043a \u0432\u0437\u0440\u044b\u0432\u0430  func collision_action(_collision_object):# \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0441\u043d\u0430\u0440\u044f\u0434\u0430 if(_animated_sprite.animation == \"Fly\"):# \u0435\u0441\u043b\u0438 \u043e\u043d \u0431\u044b\u043b \u0441\u043d\u0430\u0440\u044f\u0434\u043e\u043c _animated_sprite.play(\"Bum\")# \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0432 \u0432\u0437\u0440\u044b\u0432 _collision_shape.disabled = true # \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u0444\u0438\u0433\u0443\u0440\u0443 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f _collision_shape_bum.disabled = false # \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0444\u0438\u0433\u0443\u0440\u0443 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0432\u0437\u0440\u044b\u0432\u0430 scale = Vector2(10,10)  # \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0432 10 \u0440\u0430\u0437,  #\u0443 \u0432\u0430\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437, \u0434\u043b\u044f \u043c\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044d\u0442\u043e \u0432 \u0441\u0430\u043c\u044b\u0439 \u0440\u0430\u0437 velocity=Vector2(position.x,position.y) _bum_live_time.start() _bum_sound.play() func _on_Bum_body_entered(body): if(body.has_method(\"hit\")): body.hit(damage)   func _on_BumLiveTime_timeout(): queue_free()<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u0412\u0440\u0430\u0433\u0438<\/h2>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u043e\u043c\u0431\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0434\u0451\u0442 \u043d\u0430 \u0438\u0433\u0440\u043e\u043a\u0430 \u0438 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u0443\u0434\u0430\u0440\u0438\u0442\u044c. \u041c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0449\u0451 4 \u0432\u0438\u0434\u0430 \u0432\u0440\u0430\u0433\u0430:<\/p>\n<ul>\n<li>\n<p>\u0423\u043c\u043d\u044b\u0439 \u0437\u043e\u043c\u0431\u0438(\u043a\u043e\u0433\u0434\u0430 \u0438\u0433\u0440\u043e\u043a \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u0432 \u0435\u0433\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u0443, \u043e\u043d \u0431\u0435\u0436\u0438\u0442 \u043e\u0442 \u0438\u0433\u0440\u043e\u043a\u0430, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u0442 \u0431\u0435\u0436\u0438\u0442 \u043d\u0430 \u0438\u0433\u0440\u043e\u043a\u0430)<\/p>\n<\/li>\n<li>\n<p>\u0417\u043e\u043c\u0431\u0438 \u0437\u0430 \u0449\u0438\u0442\u043e\u043c(\u043e\u043d \u0433\u0434\u0435-\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u043b \u043a\u0443\u0441\u043e\u043a \u0436\u0435\u043b\u0435\u0437\u0430, \u0435\u0441\u043b\u0438 \u0441\u0442\u0440\u0435\u043b\u044f\u0442\u044c \u043d\u0435 \u0442\u043e\u0447\u043d\u043e, \u0442\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u043b\u043e\u043c\u0430\u0442\u044c \u0449\u0438\u0442, \u043f\u043e\u0442\u043e\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0438\u0442\u044c \u0437\u043e\u043c\u0431\u0438)<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0440\u0430\u0448\u043d\u044b\u0439 \u0437\u043e\u043c\u0431\u0438(\u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0438 \u0441\u0442\u0440\u0430\u0448\u043d\u044b\u0439)<\/p>\n<\/li>\n<li>\n<p>\u0422\u043e\u043b\u0441\u0442\u044b\u0439 \u0437\u043e\u043c\u0431\u0438(\u0411\u043e\u043b\u044c\u0448\u043e\u0439, \u0442\u043e\u043b\u0441\u0442\u044b\u0439 \u0438 \u0441\u0442\u0440\u0430\u0448\u043d\u044b\u0439, \u043f\u0440\u0438 \u0441\u043c\u0435\u0440\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0435\u0449\u0451 3-\u0445 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0437\u043e\u043c\u0431\u0438)<\/p>\n<\/li>\n<li>\n<p>\u0422\u0430\u043a-\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0443\u0431\u0438\u0439\u0441\u0442\u0432\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043b\u0443\u0436\u0430 \u043a\u0440\u043e\u0432\u0438<\/p>\n<\/li>\n<\/ul>\n<h3>ZombieBlood<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u0443\u044e \u0441\u0446\u0435\u043d\u0443, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c \u0441\u0446\u0435\u043d\u044b Area2D(ZombieBlood), \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b:<\/p>\n<figure class=\"float\"><\/figure>\n<p>\u2981AnimatedSprite<br \/> \u2981Timer(BloodLive)<\/p>\n<p>\u0412 AnimatedSprite \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u0441\u043f\u0440\u0430\u0439\u0442 \u0444\u0440\u0435\u0439\u043c \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e, \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u0438\u0434\u0430 \u043a\u0440\u043e\u0432\u0430\u0432\u043e\u0439 \u043b\u0443\u0447\u0448\u0435( \u0443 \u043c\u0435\u043d\u044f 3), \u043b\u0443\u0447\u0448\u0435 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043d\u0435 1, \u0447\u0442\u043e\u0431\u044b \u0432\u0435\u0441\u044c \u043f\u043e\u043b \u043d\u0435 \u0431\u044b\u043b \u0437\u0430\u043b\u0438\u0442 \u043e\u0434\u043d\u0438\u043c \u0432\u0438\u0434\u043e\u043c \u043a\u0440\u043e\u0432\u0430\u0432\u044b\u0445 \u043b\u0443\u0436. <\/p>\n<p>\u0422\u0430\u0439\u043c\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0443\u0436\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0436\u0438\u0437\u043d\u0438 \u043b\u0443\u0436\u0438, One Shoot \u0438 Autostart &#8212; \u0432\u043a\u043b, Wait Time \u044f \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b 30 \u0441\u0435\u043a\u0443\u043d\u0434, \u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0435\u0440\u0435\u0437 30 \u0441\u0435\u043a\u0443\u043d\u0434 \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043b\u044f\u0442\u044c\u0441\u044f \u043b\u0443\u0436\u0430. <\/p>\n<p>\u041d\u0430\u0432\u0435\u0448\u0438\u0432\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 ZombieBlood \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0435\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e:<\/p>\n<pre><code class=\"python\">extends Area2D #\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 \u0434\u0435\u0440\u0435\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 onready var _animated_sprite = $AnimatedSprite onready var _blood_live = $BloodLive  func _ready(): #\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0432\u0438\u0434 \u043a\u0440\u043e\u0432\u0438 var animation_types = _animated_sprite.frames.get_animation_names() var animation = animation_types[randi() % animation_types.size()] _animated_sprite.play(animation)   func _on_BloodLive_timeout(): #\u0412\u0435\u0448\u0430\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u0438 \u043f\u043e \u0438\u0441\u0442\u0438\u0447\u0435\u043d\u0438\u044e \u0443\u0434\u0430\u043b\u044f\u0435\u043c queue_free()<\/code><\/pre>\n<p>\u0422\u0430\u043a-\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u0440\u043e\u0432\u044c \u0432 \u0433\u0440\u0443\u043f\u043f\u0443 all_enemy. \u041a\u0442\u043e \u0437\u0430\u0431\u044b\u043b, \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 Area2D(\u0412 \u0434\u0435\u0440\u0435\u0432\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432), \u0432 \u0438\u043d\u0441\u043f\u0435\u043a\u0442\u043e\u0440\u0435 \u043d\u0430\u0436\u0430\u0442\u044c &#171;\u0423\u0437\u0435\u043b&#187;->\u0413\u0440\u0443\u043f\u043f\u044b, \u0432\u0432\u0435\u0441\u0442\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438 \u043d\u0430\u0436\u0430\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c. \u041a\u0440\u043e\u0432\u044c \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0434\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c <\/p>\n<h3>DefaultEnemy<\/h3>\n<p>\u041d\u0443\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u0446\u0435\u043d\u0443 \u043a\u0440\u043e\u0432\u0438, \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u0440\u043e\u0432\u044c \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0441 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043e\u043c, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432 _ready() \u0440\u0430\u043d\u0434\u043e\u043c\u0430\u0439\u0437\u0435\u0440 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u0440\u043e\u0432\u0438, \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043d\u0447\u0438\u043b\u0438\u0441\u044c \u0436\u0438\u0437\u043d\u0438, \u0435\u0449\u0451 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0437\u043e\u043c\u0431\u0438 float.<\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u0447\u0442\u043e \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430:<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u043e\u043b\u0432\u0430\u043d\u043a\u0438 \u0432\u0440\u0430\u0433\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">extends KinematicBody2D  #\u043f\u043e\u0434\u0433\u0440\u0443\u0437\u0438\u043b\u0438 \u0441\u0446\u0435\u043d\u0443 \u0441 \u043a\u0440\u043e\u0432\u044c\u044e var blood_scene = preload(\"res:\/\/scenes\/Enemy\/ZombieBlood\/ZombieBlood.tscn\")  #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0435\u0440\u0435\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u043a\u043e\u0434 onready var _animated_sprite = $AnimatedSprite onready var _red_health = $HealthBar\/RedHealth  #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0438\u0433\u0440\u043e\u043a\u0430, \u043f\u043e\u0437\u0436\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f export onready var player  #\u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0432\u0440\u0430\u0433\u0430 export var health = 5 export var speed:float = 2 export var damage = 1 #\u0415\u0449\u0451 \u0447\u0443-\u0447\u0443\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 #\u0414\u043b\u0438\u043d\u0430 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 RedHealth, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f 1 \u0435\u0434. \u0443\u0440\u043e\u043d\u0430 onready var<\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-349880","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/349880","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=349880"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/349880\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=349880"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=349880"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=349880"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}