{"id":322643,"date":"2021-05-05T15:01:28","date_gmt":"2021-05-05T15:01:28","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=322643"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=322643","title":{"rendered":"\u041e\u0434\u043d\u043e\u0439 \u043b\u0438\u0448\u044c \u043c\u044b\u0448\u043a\u043e\u0439"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u043c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u044f\u0447\u0435\u0441\u043b\u0430\u0432 \u0438 \u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442, \u043d\u0443 \u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0433\u0435\u0439\u043c\u0434\u0435\u0432\u043e\u043c \u043d\u0430 GodotEngine, \u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0432\u0435\u0434\u0443 \u0441\u0432\u043e\u0439 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u043c \u043a\u0430\u043d\u0430\u043b, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0438\u0448\u0443 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0441\u0432\u043e\u0435\u0439 \u0438\u0433\u0440\u044b \u043d\u0430 \u044d\u0442\u043e\u043c \u0434\u0432\u0438\u0436\u043a\u0435 \u0438 \u043f\u043e\u0434\u043a\u0438\u0434\u044b\u0432\u0430\u044e \u043d\u043e\u0432\u0438\u0447\u043a\u0430\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0434\u043b\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u0413\u043e\u0434\u043e.<\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u0434\u0435\u043b\u0443, \u0430 \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0430\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044c \u0441 Drag&amp;Drop`\u043e\u043c \u0438 \u0431\u043e\u043d\u0443\u0441\u043e\u043c \u043e\u0442 \u043c\u0435\u043d\u044f?<\/p>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c. \u042f \u043d\u0435 \u0434\u0438\u0437\u0430\u0439\u043d\u0435\u0440, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u0437\u0430\u0434\u0438\u0437\u0430\u0439\u043d\u0438\u0442\u0435 \u043f\u043e\u0442\u043e\u043c \u0441\u0430\u043c\u0438.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043d\u0430\u043a\u0438\u0434\u0430\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u043e\u0434\u044b \u0432 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435:&nbsp;<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bb5\/0dc\/759\/bb50dc7595d93258d7a06fea1b4503cc.png\" width=\"209\" height=\"97\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u043a\u043e\u043d\u0442\u0440\u043e\u043b \u043a\u0438\u0434\u0430\u0435\u043c PanelContainer, \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 Layout(\u0412\u0438\u0434) \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u043c \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0443 \u0438 \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u0444\u043b\u0430\u0433\u0438 \u043d\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043f\u043e \u0432\u044b\u0441\u043e\u0442\u0435 \u0438 \u0448\u0438\u0440\u0438\u043d\u0435:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e57\/9e8\/671\/e579e8671638891e0a239fe7126c0275.png\" width=\"187\" height=\"238\"><figcaption><\/figcaption><\/figure>\n<p>\u0427\u0438\u043b\u0434\u043e\u043c \u043a\u0438\u0434\u0430\u0435\u043c \u0413\u0440\u0438\u0434\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440(\u0441\u0435\u0442\u043a\u0430), \u0432 \u043d\u0435\u0451 \u043c\u044b \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u043c \u043a\u0438\u0434\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0442\u0430\u043a \u0436\u0435 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u201c\u043f\u043e\u0434\u043d\u044f\u0442\u0438\u044f\u201d \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430, \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u043c \u043a\u043e\u043b-\u0432\u043e\u043c.<\/p>\n<p>\u0423 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 8 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0432 \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u0435 \u0438 4 \u0441\u0442\u0440\u043e\u0447\u043a\u0438, \u0434\u043b\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b \u0438\u043a\u043e\u043d\u043a\u0438 \u0438\u0442\u0435\u043c\u043e\u0432.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/20c\/b6a\/4ea\/20cb6a4eaa2b0adffd0eca00c2ea0fc0.png\" width=\"513\" height=\"330\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u043a\u0430\u0447\u0430\u0435\u043c \u0441 \u0433\u0443\u0433\u043b\u0430 \u0448\u0440\u0438\u0444\u0442 \u0438 \u0437\u0430\u043a\u0438\u043d\u0435\u043c \u0435\u0433\u043e \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b, \u0447\u0442\u043e\u0431\u044b \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u043c\u0435\u043d\u044f\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cfc\/a71\/e80\/cfca71e80e2a21c1f075c3627e86ce74.png\" width=\"1337\" height=\"583\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0447\u0443\u0442\u044c \u0441\u0442\u0438\u043b\u0438\u0437\u0443\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0431\u044b\u043b\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044c, \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0434\u0438\u043d \u0441\u043b\u043e\u0442, \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u0442.\u043a. \u043c\u044b \u0435\u0433\u043e \u0431\u0443\u0434\u0435\u043c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0442\u044b:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/043\/ceb\/975\/043ceb975acbedccd03336ee2765dcd9.png\" width=\"1366\" height=\"736\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0437\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u0432 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0441\u0446\u0435\u043d\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u043a\u0440\u0438\u043f\u0442:<\/p>\n<pre><code class=\"python\">extends Control  export (int, 1, 20) var columns = 8 export (int, 1, 20) var rows = 4 onready var inv = $InvContainer\/InvContent const slot_scene = preload(\"res:\/\/Slot.tscn\") func _ready():  inv.columns = columns  for i in range(columns*rows):   var slot = slot_scene.instance()   inv.add_child(slot) <\/code><\/pre>\n<p>\u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d79\/bf6\/9cb\/d79bf69cbe3679a4c7a052cf3cdc1b63.png\" width=\"598\" height=\"382\"><figcaption><\/figcaption><\/figure>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0441\u0446\u0435\u043d\u0443 \u0441\u043b\u043e\u0442\u0430, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0443\u0434\u0430 \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u043f\u0430\u043d\u0435\u043b\u044c, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0439 \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u0438\u043b\u044c, \u0432 \u043d\u0435\u0451 TextureRect \u0434\u043b\u044f \u0438\u043a\u043e\u043d\u043a\u0438 \u0438 Label \u0434\u043b\u044f \u043a\u043e\u043b-\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fb5\/83f\/00f\/fb583f00fe0cb7436b3fb8c41f4bda95.png\" width=\"1358\" height=\"641\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u0442\u0430\u0432\u0438\u043c \u0434\u043b\u044f \u0418\u043a\u043e\u043d\u043a\u0438 \u0442\u0430\u043a\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445, \u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u0440\u043e \u0432\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0432 \u0441\u0442\u0430\u0442\u044c\u0435:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6e2\/bcc\/124\/6e2bcc124d9399a48e9a07332789015d.png\" width=\"287\" height=\"563\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4b3\/28a\/caf\/4b328acafd7a1fd9a7dd34b21a156951.png\" width=\"281\" height=\"656\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 Slot \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0441\u043a\u0440\u0438\u043f\u0442, \u0438 \u043a\u0438\u0434\u0430\u0435\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"python\">extends PanelContainer  onready var item = $Item onready var icon = $Item\/Icon onready var count = $Item\/Count  var item_type = null var item_count = 0  func _ready():  update_data({\"type\": \"item_type_1\", \"count\": 0})  func update_data(data = null):  item.visible = data != null  if data:   icon.texture = load(\"res:\/\/graphics\/%s.png\" % data.type) #\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438\u043a\u043e\u043d\u043a\u0438   count.text = str(data.count) <\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/037\/110\/402\/037110402c4d3b4749d8eeb3863658b7.png\" width=\"773\" height=\"476\"><figcaption><\/figcaption><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u0439\u043c\u0451\u043c\u0441\u044f \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u043e\u0447\u0438\u0441\u0442\u043a\u0438:<\/p>\n<p>\u0418\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442:<\/p>\n<pre><code class=\"python\">extends Control  export (int, 1, 20) var columns = 8 export (int, 1, 20) var rows = 4  onready var inv = $InvContainer\/InvContent  const slot_scene = preload(\"res:\/\/Slot.tscn\")  func _ready():  $InvContainer\/HBoxContainer\/Clear.connect(\"pressed\", self, \"clear_inventory\")  inv.columns = columns  for i in range(columns*rows):   var slot = slot_scene.instance()   inv.add_child(slot)    func clear_inventory():  for child in inv.get_children(): #\u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c \u043f\u043e \u0447\u0438\u043b\u0434\u0430\u043c \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044f   child.update_data() #\u0434\u0435\u043b\u0430\u0435\u043c \u0430\u043f\u0434\u0435\u0439\u0442 \u0431\u0435\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 <\/code><\/pre>\n<p>\u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u0438\u043c\u0441\u044f \u043a \u0441\u0438\u0433\u043d\u0430\u043b\u0443 \u043a\u043d\u043e\u043f\u043a\u0438 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u043e\u0439 \u043e\u0447\u0438\u0449\u0430\u0435\u043c \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044c.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043a\u043d\u043e\u043f\u043a\u0430 \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0432 \u0441\u043a\u0440\u0438\u043f\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">extends PanelContainer  onready var item = $Item onready var icon = $Item\/Icon onready var count = $Item\/Count  var item_data = null  func _ready():  update_data()  func empty():  return item_data == null  func update_data(data = null):  item.visible = data != null  item_data = data  if item:   icon.texture = load(\"res:\/\/graphics\/%s.png\" % item_data.type) #\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438\u043a\u043e\u043d\u043a\u0438   count.text = str(item_data.count)  return true <\/code><\/pre>\n<p>\u0417\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u0432 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u043e\u0432\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"python\">&nbsp;func has_empty_slot(): #\u041c\u0435\u0442\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u043e\u0439 \u043f\u0443\u0441\u0442\u043e\u0439 \u044f\u0447\u0435\u043a\u0438  for child in inv.get_children(): #\u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c \u043f\u043e \u0447\u0438\u043b\u0434\u0430\u043c \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044f   if child.empty():    return true  return false  func get_empty_slot(): #\u041c\u0435\u0442\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u043f\u0443\u0441\u0442\u043e\u0439 \u044f\u0447\u0435\u043a\u0438  var slot = null  if has_empty_slot():&nbsp;   #\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0435 \u044f\u0447\u0435\u0439\u043a\u0438   #\u0418\u043d\u0430\u0447\u0435 \u043f\u0440\u0438 \u043f\u043e\u043b\u043d\u043e\u043c \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u0435 \u0431\u0443\u0434\u0435\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043f\u0440\u0438 \u043f\u043e\u043b\u043d\u043e\u043c \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u0435 \u0438 \u0438\u0433\u0440\u0430 \u0437\u0430\u0432\u0438\u0441\u043d\u0435\u0442   while slot == null: #\u0418\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u0443\u044e \u043f\u0443\u0441\u0442\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0451\u043c    var temp_slot = inv.get_child(rng.randi_range(0, columns*rows-1))    if temp_slot.empty():     slot = temp_slot     break  return slot  func add_item(): #\u0421\u043b\u043e\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043a \u043a\u043d\u043e\u043f\u043a\u0435  var slot = get_empty_slot()  if slot:   var data = {\"type\":\"\", \"count\": 0}   data.type = \"item_type_\" + str(rng.randi_range(1, 8))   data.count = rng.randi_range(1, 999)   slot.update_data(data) <\/code><\/pre>\n<p>\u0418 \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043c\u0435\u0442\u043e\u0434\u0443 \u201cadd_item\u201d, \u0438 \u0432\u0441\u0451 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f D&amp;D(Drag&amp;Drop).<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0446\u0435\u043d\u0443 \u0438\u0442\u0435\u043c\u0430, \u0442.\u043a. \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0432 \u0434\u0432\u0443\u0445 \u043c\u0435\u0441\u0442\u0430\u0445.<\/p>\n<p>\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/112\/cc9\/644\/112cc9644436cf6b6a70b6a259ac130a.png\" width=\"430\" height=\"234\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0438\u0442\u0435\u043c\u0430, \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u0447\u0438\u0441\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"python\">extends PanelContainer  onready var icon = $Icon onready var count = $Count  const path_to_items_icons = \"res:\/\/graphics\/%s.png\"  func set_data(item_data):  icon.texture = load(path_to_items_icons % item_data.type) #\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438\u043a\u043e\u043d\u043a\u0438  count.text = str(item_data.count) <\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0435\u043c \u043a \u0441\u043b\u043e\u0442\u0443:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6c9\/779\/ed5\/6c9779ed5b47158b14b3a553ba00a30f.png\" width=\"645\" height=\"421\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u044e\u0434\u0430 \u043c\u044b \u0437\u0430\u043a\u0438\u043d\u0443\u043b\u0438 \u043d\u0430\u0448\u0443 \u0441\u0446\u0435\u043d\u0443 \u0441 \u0438\u0442\u0435\u043c\u043e\u043c, \u043f\u043b\u044e\u0441 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0441\u044f \u043b\u0435\u0439\u0431\u043b \u201cNum\u201d, \u0432 \u043d\u0451\u043c \u043b\u0435\u0436\u0438\u0442 \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430, \u044f \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u0440\u044b\u0442\u044c \u0435\u0433\u043e \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0441\u0446\u0435\u043d\u044b \u0438 \u0438\u0437 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0446\u0435\u043d\u044b. \u041a\u0441\u0442\u0430\u0442\u0438 \u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0446\u0435\u043d\u0435, \u0432 \u043d\u0435\u0439 \u0442\u043e\u0436\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9a6\/3b6\/0cf\/9a63b60cf9ecd6524ca595b04ce48e68.png\" width=\"285\" height=\"236\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043b\u0441\u044f \u043a\u0430\u043a \u0440\u0430\u0437 \u043d\u0430\u0448 \u0438\u0442\u0435\u043c, \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043d\u043e \u043d\u0438 \u043a \u0447\u0435\u043c\u0443 \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 (\u0431\u0435\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432), \u0430 \u0437\u0430\u0447\u0435\u043c \u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0434\u0430\u043b\u044c\u0448\u0435)<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c\u043e\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435, \u044d\u0442\u043e \u0441\u043a\u0440\u0438\u043f\u0442 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0446\u0435\u043d\u044b, \u0442\u0430\u043c \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u043a\u0443\u0447\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435:<\/p>\n<pre><code class=\"python\">extends Control  export (int, 1, 20) var columns = 8 #\u043a\u043e\u043b-\u0432\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044f export (int, 1, 20) var rows = 4 #\u043a\u043e\u043b-\u0432\u043e \u0441\u0442\u0440\u043e\u0447\u0435\u043a \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044f  const slot_scene = preload(\"res:\/\/Slot.tscn\") #\u041f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043f\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0441\u0446\u0435\u043d\u0443 \u0441\u043b\u043e\u0442\u0430  onready var inv = $InvContainer\/InvContent #\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0441\u043b\u043e\u0442\u043e\u0432 onready var titem = $TempItem #\u042d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u043d\u0430\u0448 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c, \u043e\u043d \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u044f onready var rng = RandomNumberGenerator.new() #\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0440\u0430\u043d\u0434\u043e\u043c\u0430\u0439\u0437\u0435\u0440\u0430 onready var item_dragging = null #\u0417\u0434\u0435\u0441\u044c \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0438\u0442\u0435\u043c \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0438 onready var prev_slot = null #\u0421\u043b\u043e\u0442 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0435\u043c \u0438\u0442\u0435\u043c  func ready():  titem.visible = false #\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c  rng.randomize() #\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0440\u0430\u043d\u0434\u043e\u043c\u0430\u0439\u0437\u0435\u0440  $InvContainer\/HBoxContainer\/Clear.connect(\"pressed\", self, \"clear_inventory\")  $InvContainer\/HBoxContainer\/Add.connect(\"pressed\", self, \"add_item\")  inv.columns = columns #\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u043a\u043e\u043b-\u0432\u043e \u0441\u043b\u043e\u043b\u0431\u0446\u043e\u0432 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f  for i in range(columns*rows): #\u0426\u0438\u043a\u043b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043b\u043e\u0442\u043e\u0432   var slot = slot_scene.instance() #\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043b\u043e\u0442\u0430   slot.name = \"Slot%d\" % i #\u0417\u0430\u0434\u0430\u0451\u043c \u0435\u043c\u0443 \u0438\u043c\u044f, \u0432 \u0446\u0435\u043b\u043e\u043c \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u043d\u043e \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0443\u0434\u043e\u0431\u043d\u043e   slot.get_node(\"Num\").text = str(i) #\u041a\u0430\u043a \u0440\u0430\u0437 \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430, \u0435\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0435 \u0438\u0437 \u0441\u0446\u0435\u043d\u044b \u0441\u043b\u043e\u0442\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435, \u0442\u043e \u044d\u0442\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u0442\u043e\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c   inv.add_child(slot) #\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043b\u043e\u0442\u0430 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435  func clear_inventory(): #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430  for child in inv.get_children(): #\u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c \u043f\u043e \u0447\u0438\u043b\u0434\u0430\u043c \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044f   child.update_data() #\u0434\u0435\u043b\u0430\u0435\u043c \u0430\u043f\u0434\u0435\u0439\u0442 \u0431\u0435\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432  func has_empty_slot(): #\u041c\u0435\u0442\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u043e\u0439 \u043f\u0443\u0441\u0442\u043e\u0439 \u044f\u0447\u0435\u043a\u0438  for child in inv.get_children(): #\u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c \u043f\u043e \u0447\u0438\u043b\u0434\u0430\u043c \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044f   if child.empty():    return true  return false  func get_empty_slot(): #\u041c\u0435\u0442\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u043f\u0443\u0441\u0442\u043e\u0439 \u044f\u0447\u0435\u043a\u0438  var slot = null  if has_empty_slot():&nbsp;   #\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0435 \u044f\u0447\u0435\u0439\u043a\u0438   #\u0418\u043d\u0430\u0447\u0435 \u043f\u0440\u0438 \u043f\u043e\u043b\u043d\u043e\u043c \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u0435 \u0431\u0443\u0434\u0435\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043f\u0440\u0438 \u043f\u043e\u043b\u043d\u043e\u043c \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u0435 \u0438 \u0438\u0433\u0440\u0430 \u0437\u0430\u0432\u0438\u0441\u043d\u0435\u0442   while slot == null: #\u0418\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u0443\u044e \u043f\u0443\u0441\u0442\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0451\u043c    var temp_slot = inv.get_child(rng.randi_range(0, columns*rows-1))    if temp_slot.empty():     slot = temp_slot     break  return slot  func add_item(): #\u0421\u043b\u043e\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043a \u043a\u043d\u043e\u043f\u043a\u0435  var slot = get_empty_slot()  if slot:   var data = {\"type\":\"\", \"count\": 0}   data.type = \"item_type_\" + str(rng.randi_range(1, 8))   data.count = rng.randi_range(1, 999)   slot.update_data(data)    func find_slot(pos:Vector2, need_data = false): #\u041c\u0435\u0442\u043e\u0434 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u043b\u043e\u0442\u0430 \u043f\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c  #\u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 - \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439, \u043e\u043d \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0441\u043b\u043e\u0442 \u0441 \u0438\u0442\u0435\u043c\u043e\u043c \u0438\u043b\u0438 \u043d\u0435\u0442  for c in inv.get_children(): #\u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c \u043f\u043e \u0447\u0438\u043b\u0434\u0430\u043c \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044f   if (need_data and not c.empty()) or (not need_data):    if Rect2(c.rect_position, c.rect_size).has_point(pos):     #\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0438\u0437 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0441\u043b\u043e\u0442\u0430 \u0438 \u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432, \u0447\u0442\u043e\u0431\u044b&nbsp;     #\u043b\u0435\u0433\u043a\u043e \u043e\u0434\u043d\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0435     return c  return null  func _process(delta):  var mouse_pos = get_viewport().get_mouse_position() #\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043c\u044b\u0448\u043a\u0438   if Input.get_mouse_button_mask() == BUTTON_LEFT: #\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u0436\u0430\u0442\u0430 \u043b\u0438 \u043b\u0435\u0432\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u043c\u044b\u0448\u0438   if not item_dragging: #\u0435\u0441\u043b\u0438 \u043c\u044b \u0443\u0436\u0435 \u043d\u0435 \u0442\u0430\u0449\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442    var slot = find_slot(mouse_pos, true)#\u0438\u0449\u0435\u043c \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c \u0441\u043b\u043e\u0442 \u0441 \u0438\u0442\u0435\u043c\u043e\u043c       if slot: #\u0435\u0441\u043b\u0438 \u0441\u043b\u043e\u0442 \u043d\u0430\u0439\u0434\u0435\u043d     item_dragging = slot.item_data #\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0442\u0435\u043c\u0430     titem.set_data(item_dragging) #\u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c \u043f\u0438\u0445\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435     titem.visible = true #\u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c     titem.rect_position = slot.rect_position #\u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441\u043b\u043e\u0442\u0430     prev_slot = slot #\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0441\u043b\u043e\u0442 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u043c \u0442\u0430\u0449\u0438\u0442\u044c \u0438\u0442\u0435\u043c     slot.update_data() #\u043e\u0447\u0438\u0449\u0430\u0435\u043c \u0441\u043b\u043e\u0442 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0442\u0430\u0449\u0438\u043c   else: #\u0435\u0441\u043b\u0438 \u043c\u044b \u0443\u0436\u0435 \u0442\u0430\u0449\u0438\u043c \u0438\u0442\u0435\u043c, \u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440, \u0441\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u043c \u043e\u0442 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0438\u0442\u0435\u043c\u0430(\u0447\u0442\u043e\u0431\u044b \u0446\u0435\u043d\u0442\u0440 \u0438\u0442\u0435\u043c\u0430 \u0431\u044b\u043b \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c)    titem.rect_position = lerp(titem.rect_position, mouse_pos - titem.rect_size\/2, 0.3)     else: #\u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u043f\u0443\u0449\u0435\u043d\u0430   if item_dragging: #\u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0435\u0441\u0442\u044c \u0438\u0442\u0435\u043c    var slot = find_slot(mouse_pos, false) #\u0418\u0449\u0435\u0442 \u0441\u043b\u043e\u0442 \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c    if slot: #\u0435\u0441\u043b\u0438 \u043e\u043d \u0435\u0441\u0442\u044c, \u0442\u043e \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0437\u0430\u043a\u0438\u043d\u0443\u0442\u044c \u0432 \u0441\u043b\u043e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435     if not slot.update_data(item_dragging): #\u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0438\u0442\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e      prev_slot.update_data(item_dragging)      prev_slot = null #\u043e\u0447\u0438\u0449\u0430\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u0442\u0430\u0440\u044b\u0439 \u0441\u043b\u043e\u0442 item_dragging = null #\u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0438\u0442\u0435\u043c\u0430 titem.visible = false #\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c  <\/code><\/pre>\n<p>\u042f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0438 \u043f\u0440\u043e\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0442\u0440\u043e\u0447\u043a\u0443, \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0430\u043c \u0435\u0449\u0451 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c ? \u042f \u0431\u044b \u0441\u0434\u0435\u043b\u0430\u043b \u043e\u0431\u043c\u0435\u043d \u043c\u0435\u0436\u0434\u0443 \u0441\u043b\u043e\u0442\u0430\u043c\u0438, \u043c\u0443\u0441\u043e\u0440\u043a\u0443 \u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0431\u0443\u0434\u0435\u0442 \u0435\u0449\u0451 \u0431\u043e\u043d\u0443\u0441)<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u043c \u0438 \u0447\u0443\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u043b\u043e\u0442\u0430<\/p>\n<pre><code class=\"python\">func check_data(data):  return \"all\" in available_types or data.type in available_types  func update_data(data = null):  item.visible = data != null  item_data = data  if item_data:   if check_data(data):    item.set_data(item_data)    return true   return false  return true <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442, \u0432 \u043d\u0451\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043b\u0438\u0448\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e _process:<\/p>\n<pre><code class=\"python\">func _process(delta):  var mouse_pos = get_viewport().get_mouse_position() #\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043c\u044b\u0448\u043a\u0438  if Input.get_mouse_button_mask() == BUTTON_LEFT: #\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u0436\u0430\u0442\u0430 \u043b\u0438 \u043b\u0435\u0432\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u043c\u044b\u0448\u0438   if not item_dragging: #\u0435\u0441\u043b\u0438 \u043c\u044b \u0443\u0436\u0435 \u043d\u0435 \u0442\u0430\u0449\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442    var slot = find_slot(mouse_pos, true)#\u0438\u0449\u0435\u043c \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c \u0441\u043b\u043e\u0442 \u0441 \u0438\u0442\u0435\u043c\u043e\u043c    if slot: #\u0435\u0441\u043b\u0438 \u0441\u043b\u043e\u0442 \u043d\u0430\u0439\u0434\u0435\u043d     item_dragging = slot.item_data #\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0442\u0435\u043c\u0430     titem.set_data(item_dragging) #\u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c \u043f\u0438\u0445\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435     titem.visible = true #\u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c     titem.rect_position = slot.rect_position #\u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441\u043b\u043e\u0442\u0430     prev_slot = slot #\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0441\u043b\u043e\u0442 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u043c \u0442\u0430\u0449\u0438\u0442\u044c \u0438\u0442\u0435\u043c     slot.update_data() #\u043e\u0447\u0438\u0449\u0430\u0435\u043c \u0441\u043b\u043e\u0442 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0442\u0430\u0449\u0438\u043c   else: #\u0435\u0441\u043b\u0438 \u043c\u044b \u0443\u0436\u0435 \u0442\u0430\u0449\u0438\u043c \u0438\u0442\u0435\u043c, \u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440, \u0441\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u043c \u043e\u0442 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0438\u0442\u0435\u043c\u0430(\u0447\u0442\u043e\u0431\u044b \u0446\u0435\u043d\u0442\u0440 \u0438\u0442\u0435\u043c\u0430 \u0431\u044b\u043b \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c)    titem.rect_position = lerp(titem.rect_position, mouse_pos - titem.rect_size\/2, 0.3)  else: #\u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u043f\u0443\u0449\u0435\u043d\u0430   if item_dragging: #\u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0435\u0441\u0442\u044c \u0438\u0442\u0435\u043c    var slot = find_slot(mouse_pos) #\u0418\u0449\u0435\u0442 \u0441\u043b\u043e\u0442 \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c    #\u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u21161 #if slot: #\u0435\u0441\u043b\u0438 \u043e\u043d \u0435\u0441\u0442\u044c, \u0442\u043e \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0437\u0430\u043a\u0438\u043d\u0443\u0442\u044c \u0432 \u0441\u043b\u043e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 #if slot.empty(): #\u0435\u0441\u043b\u0438 \u0432 \u0441\u043b\u043e\u0442 \u043f\u0443\u0441\u0442\u043e\u0439 #if slot.check_data(item_dragging): #\u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043a \u0441\u043b\u043e\u0442\u0443, \u0442\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 #slot.update_data(item_dragging) #else: #\u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0438\u0442\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e #prev_slot.update_data(item_dragging) #else: #\u0435\u0441\u043b\u0438 \u0441\u043b\u043e\u0442 \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0439, \u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430, \u0435\u0441\u043b\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u043c\u0435\u043d\u044f\u0435\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 #if slot.check_data(item_dragging) and prev_slot.check_data(slot.item_data): #prev_slot.update_data(slot.item_data) #slot.update_data(item_dragging) #else: #\u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e #prev_slot.update_data(item_dragging)  #\u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u21162    if slot: #\u0435\u0441\u043b\u0438 \u0441\u043b\u043e\u0442 \u043d\u0430\u0439\u0434\u0435\u043d     if slot.check_data(item_dragging): #\u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043b\u0438 \u043a \u043d\u043e\u0432\u043e\u043c\u0443 \u0441\u043b\u043e\u0442\u0443 \u0434\u0430\u043d\u043d\u044b\u0435, \u0442\u043e\u0431\u0438\u0448\u044c \u0438\u043c\u0435\u0435\u0442 \u043b\u0438 \u0441\u043c\u044b\u0441\u043b \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0434\u0430\u043b\u044c\u0448\u0435      if slot.empty(): #\u0435\u0441\u043b\u0438 \u0432 \u0441\u043b\u043e\u0442 \u043f\u0443\u0441\u0442\u043e\u0439       slot.update_data(item_dragging)      else: #\u0435\u0441\u043b\u0438 \u0441\u043b\u043e\u0442 \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0439, \u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e       if prev_slot.check_data(slot.item_data): #\u0435\u0441\u043b\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442, \u0442\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c        prev_slot.update_data(slot.item_data)        slot.update_data(item_dragging)     else:      prev_slot.update_data(item_dragging) prev_slot = null #\u043e\u0447\u0438\u0449\u0430\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u0442\u0430\u0440\u044b\u0439 \u0441\u043b\u043e\u0442 item_dragging = null #\u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0438\u0442\u0435\u043c\u0430 titem.visible = false #\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c  <\/code><\/pre>\n<p>\u0414\u0443\u043c\u0430\u044e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u0438\u0437\u043b\u0438\u0448\u043d\u0435, \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u043e\u044f\u0441\u043d\u0438\u0442\u044c \u0437\u0430\u0447\u0435\u043c \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0431\u043b\u043e\u043a\u0430 \u0443\u0441\u043b\u043e\u0432\u0438\u0439, \u043e\u0431\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0443, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0432\u0435\u0440\u043d\u043e, \u043d\u043e \u043e\u0446\u0435\u043d\u0438\u0442\u0435 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438 \u0432\u0442\u043e\u0440\u043e\u0433\u043e, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u043e\u0439 \u043d\u0430 \u0441\u043a\u043e\u0440\u0443\u044e \u0440\u0443\u043a\u0443 \u0431\u044b\u043b \u043d\u0430\u0431\u0440\u043e\u0441\u0430\u043d \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u0437\u0430\u0434\u0430\u0447\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b, \u043d\u043e \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u0431\u044b\u043b\u0438 \u043d\u0438\u043a\u0430\u043a\u0430\u044f, \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u044f \u0435\u0433\u043e \u0432\u0447\u0435\u0440\u0430, \u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u044e \u043d\u0435 \u0441\u043c\u043e\u0433 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0451 \u0442\u0430\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u0442\u0430\u043a \u0436\u0435 \u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d \u043a\u043e\u0434\u0435, \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u0438\u0435 \u043a\u0443\u0441\u043a\u0438 \u043a\u043e\u0434\u0430, \u0433\u0434\u0435 \u0431\u0435\u0437 100 \u0433\u0440\u0430\u043c\u043c \u043d\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u0448\u044c\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u0441\u043e\u0432\u0435\u0442, \u043f\u0438\u0448\u0438\u0442\u0435 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u0430\u0448 \u043a\u043e\u0434 \u043f\u043e\u043d\u044f\u043b \u0434\u0430\u0436\u0435 \u043c\u0435\u0434\u0432\u0435\u0434\u044c, \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u044f \u0443\u0436\u0435 \u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u043c \u043f\u0441\u0438\u0445\u043e\u043f\u0430\u0442\u0435 \u043f\u043e\u0441\u043b\u0435 \u0432\u0430\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u043d\u0430\u0435\u0442 \u0432\u0430\u0448 \u0430\u0434\u0440\u0435\u0441)<\/p>\n<p>\u042d\u0442\u043e \u0431\u044b\u043b \u043e\u0431\u043c\u0435\u043d, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u0443\u0441\u043e\u0440\u043a\u0430, \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0443 \u0441\u043b\u043e\u0442\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u0430-\u0442\u0438\u043f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043b\u043e\u0442\u0430, \u0435\u0441\u043b\u0438 \u0431\u044b \u0432 \u0433\u043e\u0434\u043e \u0431\u044b\u043b\u043e \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u043e\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e- \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0442\u043e\u0433\u0434\u0430 \u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u043b\u043e\u0442\u0430 \u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043b\u0435\u043f\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u044f.<\/p>\n<p>\u041f\u043e\u0434\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u043b\u043e\u0442\u0430:<\/p>\n<pre><code class=\"python\">extends PanelContainer  signal dropped(data)  export (Array) var available_types = [\"all\"]&nbsp; #\u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0442\u0438\u043f\u043e\u0432 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438  enum Actions {NONE, TRASH} #\u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0441 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0438\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c\u0438 \u0441\u043b\u043e\u0442\u0430  var cur_act = Actions.NONE #\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441\u043b\u043e\u0442\u0430 \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435  onready var item = $Item  var item_data = null #\u0417\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430  func _ready():  update_data()  func set_action(new_value):  cur_act = new_value  $Item.visible = false  $Trash.visible = false  match cur_act:   Actions.NONE:    $Item.visible = true   Actions.TRASH:    $Trash.visible = true    func empty():  return item_data == null  func check_data(data):  if cur_act:   return true  return \"all\" in available_types or data.type in available_types  func update_data(data = null):  if data and cur_act:   emit_signal(\"dropped\", data)   return true  item.visible = data != null  item_data = data  if item_data:   if check_data(data):    item.set_data(item_data)    return true   return false  return true <\/code><\/pre>\n<p>\u0418 \u043f\u043e\u0434\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442:<\/p>\n<pre><code class=\"python\">func ready():  titem.visible = false #\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c  rng.randomize() #\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0440\u0430\u043d\u0434\u043e\u043c\u0430\u0439\u0437\u0435\u0440  $InvContainer\/HBoxContainer\/Clear.connect(\"pressed\", self, \"clear_inventory\")  $InvContainer\/HBoxContainer\/Add.connect(\"pressed\", self, \"add_item\")  inv.columns = columns #\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u043a\u043e\u043b-\u0432\u043e \u0441\u043b\u043e\u043b\u0431\u0446\u043e\u0432 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f  for i in range(columns*rows): #\u0426\u0438\u043a\u043b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043b\u043e\u0442\u043e\u0432   var slot = slot_scene.instance() #\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043b\u043e\u0442\u0430   slot.name = \"Slot%d\" % i #\u0417\u0430\u0434\u0430\u0451\u043c \u0435\u043c\u0443 \u0438\u043c\u044f, \u0432 \u0446\u0435\u043b\u043e\u043c \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u043d\u043e \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0443\u0434\u043e\u0431\u043d\u043e   slot.get_node(\"Num\").text = str(i) #\u041a\u0430\u043a \u0440\u0430\u0437 \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430, \u0435\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0435 \u0438\u0437 \u0441\u0446\u0435\u043d\u044b \u0441\u043b\u043e\u0442\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435, \u0442\u043e \u044d\u0442\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u0442\u043e\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c   slot.set_action(slot.Actions.NONE)   if i == columns*rows-1:    slot.set_action(slot.Actions.TRASH)    slot.connect(\"dropped\", self, \"trash_dropped\")   inv.add_child(slot) #\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043b\u043e\u0442\u0430 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435    func trash_dropped(data):  print(\"dropped \", data) <\/code><\/pre>\n<p>\u041c\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438 \u0446\u0438\u043a\u043b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043b\u043e\u0442\u043e\u0432 \u0432 _ready, \u043f\u043b\u044e\u0441 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043d\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u0440\u043e\u043f\u0430 \u0438\u0442\u0435\u043c\u0430, \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439 \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u0438\u0433\u0440\u0435 \u0432\u044b\u0431\u0440\u043e\u0441 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \u0432 \u043c\u0438\u0440.<\/p>\n<p>\u041d\u0443 \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u043e\u043d\u0443\u0441, \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044c \u0438\u0433\u0440\u043e\u043a\u0430.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u043e\u043f \u043f\u0430\u043d\u0435\u043b\u044c \u0434\u043b\u044f \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044f \u0438 \u043d\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u0435\u0449\u0451 \u0441\u043b\u043e\u0442\u043e\u0432:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/289\/7d6\/c58\/2897d6c5833250e5b2aeb25f69055f57.png\" width=\"948\" height=\"609\"><figcaption><\/figcaption><\/figure>\n<p>Helmet \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0441\u043b\u043e\u0442\u044b, \u043a\u0430\u043a \u0438 \u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c.<br \/>\u0412 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0441\u043b\u043e\u0442\u0430 \u043d\u0443\u0436\u043d\u043e \u0447\u0443\u0442\u043a\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c:<\/p>\n<pre><code class=\"python\">extends PanelContainer  signal dropped(path, data) #\u0421\u0438\u0433\u043d\u0430\u043b \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438\u0442\u0435\u043c\u0430 \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 signal accepted(path, data) #\u0421\u0438\u0433\u043d\u0430\u043b \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438\u0442\u0435\u043c\u0430 \u0432 \u0441\u043b\u043e\u0442  export (Array) var available_types = [\"all\"]&nbsp; #\u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0442\u0438\u043f\u043e\u0432 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438  enum Actions {NONE, TRASH} #\u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0441 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0438\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c\u0438 \u0441\u043b\u043e\u0442\u0430  var cur_act = Actions.NONE #\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441\u043b\u043e\u0442\u0430 \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435  onready var item = $Item  var item_data = null #\u0417\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430  func _ready():  set_action()  update_data()    func set_action(new_value = Actions.NONE):  cur_act = new_value  $Item.visible = false  $Trash.visible = false  $Num.visible = false  match cur_act:   Actions.NONE:    $Item.visible = true \t $Num.visible = true   Actions.TRASH:    $Trash.visible = true    func empty():  return item_data == null  func check_data(data):  if cur_act:   return true  return \"all\" in available_types or data.type in available_types  func update_data(data = null):  if data and cur_act:   emit_signal(\"dropped\", get_path(), data)   return true  item.visible = data != null  item_data = data  if item_data:   if check_data(data):    item.set_data(item_data)    emit_signal(\"accepted\", get_path(), data)    return true   return false  return true <\/code><\/pre>\n<p>\u041d\u0443 \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u0441\u043a\u0440\u0438\u043f\u0442 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0446\u0435\u043d\u044b:<\/p>\n<pre><code class=\"python\">extends Control  export (int, 1, 20) var columns = 8 #\u043a\u043e\u043b-\u0432\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044f export (int, 1, 20) var rows = 4 #\u043a\u043e\u043b-\u0432\u043e \u0441\u0442\u0440\u043e\u0447\u0435\u043a \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044f  export (Array, NodePath) var slots_containers # \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 \u0441\u043b\u043e\u0442\u043e\u0432  onready var slots = [] #\u041c\u0430\u0441\u0441\u0438\u0432 \u0441\u043b\u043e\u0442\u043e\u0432  const slot_scene = preload(\"res:\/\/scenes\/Slot.tscn\") #\u041f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043f\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0441\u0446\u0435\u043d\u0443 \u0441\u043b\u043e\u0442\u0430  onready var inv = $PlayerInv\/Inv\/InvContent #\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0441\u043b\u043e\u0442\u043e\u0432 onready var titem = $TempItem #\u042d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u043d\u0430\u0448 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c, \u043e\u043d \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u044f onready var clearButton = $PlayerInv\/Inv\/Button\/Clear onready var addButton = $PlayerInv\/Inv\/Button\/Add onready var rng = RandomNumberGenerator.new() #\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0440\u0430\u043d\u0434\u043e\u043c\u0430\u0439\u0437\u0435\u0440\u0430 onready var item_dragging = null #\u0417\u0434\u0435\u0441\u044c \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0438\u0442\u0435\u043c \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0438 onready var prev_slot = null #\u0421\u043b\u043e\u0442 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0435\u043c \u0438\u0442\u0435\u043c  func ready():  titem.visible = false #\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c  rng.randomize() #\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0440\u0430\u043d\u0434\u043e\u043c\u0430\u0439\u0437\u0435\u0440  clearButton.connect(\"pressed\", self, \"clear_inventory\")  addButton.connect(\"pressed\", self, \"add_item\")  inv.columns = columns #\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u043a\u043e\u043b-\u0432\u043e \u0441\u043b\u043e\u043b\u0431\u0446\u043e\u0432 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f  for i in range(columns*rows): #\u0426\u0438\u043a\u043b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043b\u043e\u0442\u043e\u0432   var slot = slot_scene.instance() #\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043b\u043e\u0442\u0430   slot.name = \"Slot%d\" % i #\u0417\u0430\u0434\u0430\u0451\u043c \u0435\u043c\u0443 \u0438\u043c\u044f, \u0432 \u0446\u0435\u043b\u043e\u043c \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u043d\u043e \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0443\u0434\u043e\u0431\u043d\u043e   slot.get_node(\"Num\").text = str(i) #\u041a\u0430\u043a \u0440\u0430\u0437 \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430, \u0435\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0435 \u0438\u0437 \u0441\u0446\u0435\u043d\u044b \u0441\u043b\u043e\u0442\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435, \u0442\u043e \u044d\u0442\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u0442\u043e\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c   inv.add_child(slot) #\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043b\u043e\u0442\u0430 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435   if i == columns*rows-1:    slot.set_action(slot.Actions.TRASH)   slots.push_back(slot)  for slots_node in slots_containers: #\u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430 \u0432\u0441\u0435\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 \u0441\u043b\u043e\u0442\u043e\u0432 \u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u0438 \u0438\u0445 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f   for slot in get_node(slots_node).get_children():    slots.push_back(slot)  for slot in slots:   slot.connect(\"accepted\", self, \"slot_accepted\")   slot.connect(\"dropped\", self, \"trash_dropped\")    func slot_accepted(path, data):  print(\"accepted \", path, \" \", data)  func trash_dropped(path, data):  print(\"dropped \", path, \" \", data)  func clear_inventory(): #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430  for child in slots: #\u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c \u043f\u043e \u0432\u0441\u0435\u043c \u0441\u043b\u043e\u0442\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c   child.update_data() #\u0434\u0435\u043b\u0430\u0435\u043c \u0430\u043f\u0434\u0435\u0439\u0442 \u0431\u0435\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432    func has_empty_slot(): #\u041c\u0435\u0442\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u043e\u0439 \u043f\u0443\u0441\u0442\u043e\u0439 \u044f\u0447\u0435\u043a\u0438  for child in slots: #\u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c \u043f\u043e \u0432\u0441\u0435\u043c \u0441\u043b\u043e\u0442\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c   if child.empty() and child.cur_act != child.Actions.TRASH:    return true  return false  func get_empty_slot(): #\u041c\u0435\u0442\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u043f\u0443\u0441\u0442\u043e\u0439 \u044f\u0447\u0435\u043a\u0438  var rand_slot = null  if has_empty_slot():&nbsp;   var empty_slots = [] #\u041c\u0430\u0441\u0441\u0438\u0432 \u043f\u0443\u0441\u0442\u044b\u0445 \u0441\u043b\u043e\u0442\u043e\u0432   for slot in slots: #\u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u043b\u043e\u0442\u044b \u0438 \u0438\u0449\u0435\u043c \u043f\u0443\u0441\u0442\u044b\u0435 \u0438 \u0441\u043b\u043e\u0442\u044b \u0441 \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u043c\u0438 \u044d\u043a\u0448\u0435\u043d\u0430\u043c\u0438    if slot.empty() and slot.cur_act != slot.Actions.TRASH:     empty_slots.push_back(slot)   rand_slot = empty_slots[(rng.randi_range(0, empty_slots.size()-1))] #\u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0441\u043b\u043e\u0442 \u0438\u0437 \u043f\u0443\u0441\u0442\u044b\u0445  return rand_slot  func add_item(): #\u0421\u043b\u043e\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043a \u043a\u043d\u043e\u043f\u043a\u0435  var slot = get_empty_slot()  if slot:   var data = {\"type\":\"\", \"count\": 0}   data.type = \"item_type_\" + str(rng.randi_range(1, 8))   data.count = rng.randi_range(1, 999)   slot.update_data(data)    func find_slot(pos:Vector2, need_data = false): #\u041c\u0435\u0442\u043e\u0434 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u043b\u043e\u0442\u0430 \u043f\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c  #\u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 - \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439, \u043e\u043d \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0441\u043b\u043e\u0442 \u0441 \u0438\u0442\u0435\u043c\u043e\u043c \u0438\u043b\u0438 \u043d\u0435\u0442  for c in slots: #\u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c \u043f\u043e \u0447\u0438\u043b\u0434\u0430\u043c \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044f   if (need_data and not c.empty()) or (not need_data):    if c.get_global_rect().has_point(pos):     #\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0438\u0437 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0441\u043b\u043e\u0442\u0430 \u0438 \u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432, \u0447\u0442\u043e\u0431\u044b&nbsp;     #\u043b\u0435\u0433\u043a\u043e \u043e\u0434\u043d\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0435     return c  return null  func _process(delta):  var mouse_pos = get_viewport().get_mouse_position() #\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043c\u044b\u0448\u043a\u0438  if Input.get_mouse_button_mask() == BUTTON_LEFT: #\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u0436\u0430\u0442\u0430 \u043b\u0438 \u043b\u0435\u0432\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u043c\u044b\u0448\u0438   if not item_dragging: #\u0435\u0441\u043b\u0438 \u043c\u044b \u0443\u0436\u0435 \u043d\u0435 \u0442\u0430\u0449\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442    var slot = find_slot(mouse_pos, true)#\u0438\u0449\u0435\u043c \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c \u0441\u043b\u043e\u0442 \u0441 \u0438\u0442\u0435\u043c\u043e\u043c    if slot: #\u0435\u0441\u043b\u0438 \u0441\u043b\u043e\u0442 \u043d\u0430\u0439\u0434\u0435\u043d     item_dragging = slot.item_data #\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0442\u0435\u043c\u0430     titem.set_data(item_dragging) #\u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c \u043f\u0438\u0445\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435     titem.visible = true #\u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c     titem.rect_position = slot.get_global_rect().position #\u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441\u043b\u043e\u0442\u0430     prev_slot = slot #\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0441\u043b\u043e\u0442 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u043c \u0442\u0430\u0449\u0438\u0442\u044c \u0438\u0442\u0435\u043c     slot.update_data() #\u043e\u0447\u0438\u0449\u0430\u0435\u043c \u0441\u043b\u043e\u0442 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0442\u0430\u0449\u0438\u043c   else: #\u0435\u0441\u043b\u0438 \u043c\u044b \u0443\u0436\u0435 \u0442\u0430\u0449\u0438\u043c \u0438\u0442\u0435\u043c, \u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440, \u0441\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u043c \u043e\u0442 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0438\u0442\u0435\u043c\u0430(\u0447\u0442\u043e\u0431\u044b \u0446\u0435\u043d\u0442\u0440 \u0438\u0442\u0435\u043c\u0430 \u0431\u044b\u043b \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c)    titem.rect_position = lerp(titem.rect_position, mouse_pos - titem.rect_size\/2, 0.3)  else: #\u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u043f\u0443\u0449\u0435\u043d\u0430   if item_dragging: #\u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0435\u0441\u0442\u044c \u0438\u0442\u0435\u043c    var slot = find_slot(mouse_pos) #\u0418\u0449\u0435\u0442 \u0441\u043b\u043e\u0442 \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c    if slot: #\u0435\u0441\u043b\u0438 \u0441\u043b\u043e\u0442 \u043d\u0430\u0439\u0434\u0435\u043d     if slot.check_data(item_dragging): #\u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043b\u0438 \u043a \u043d\u043e\u0432\u043e\u043c\u0443 \u0441\u043b\u043e\u0442\u0443 \u0434\u0430\u043d\u043d\u044b\u0435, \u0442\u043e\u0431\u0438\u0448\u044c \u0438\u043c\u0435\u0435\u0442 \u043b\u0438 \u0441\u043c\u044b\u0441\u043b \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0434\u0430\u043b\u044c\u0448\u0435      if slot.empty(): #\u0435\u0441\u043b\u0438 \u0432 \u0441\u043b\u043e\u0442 \u043f\u0443\u0441\u0442\u043e\u0439       slot.update_data(item_dragging)      else: #\u0435\u0441\u043b\u0438 \u0441\u043b\u043e\u0442 \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0439, \u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e       if prev_slot.check_data(slot.item_data): #\u0435\u0441\u043b\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442, \u0442\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c        prev_slot.update_data(slot.item_data)        slot.update_data(item_dragging)     else:      prev_slot.update_data(item_dragging) prev_slot = null #\u043e\u0447\u0438\u0449\u0430\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u0442\u0430\u0440\u044b\u0439 \u0441\u043b\u043e\u0442 item_dragging = null #\u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0438\u0442\u0435\u043c\u0430  <\/code><\/pre>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0437\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u0447\u0442\u043e \u0434\u043e\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u043b\u043e\u0442\u043e\u0432 \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0451 \u0447\u0435\u0440\u0435\u0437 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0435 \u0432 \u0413\u043e\u0434\u043e \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e, \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439.<\/p>\n<p><iframe id=\"60917345c018c86d6c84a0b6\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/60917345c018c86d6c84a0b6\" class=\"embed_video embed__content\" allowfullscreen=\"true\"><\/iframe><\/p>\n<p><a href=\"https:\/\/github.com\/holyslav\/InventoryGodot\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u043b\u043d\u044b\u0439 \u043b\u0438\u0441\u0442\u0438\u043d\u0433 \u0432 \u043c\u043e\u0451\u043c \u0433\u0438\u0442\u0445\u0430\u0431 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a><\/p>\n<p>UPD: \u041f\u043e\u0434\u043f\u0440\u0430\u0432\u0438\u043b \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>get_empty_slot<\/code> \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0435, \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0440\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u044f \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b. \u0432 \u0433\u0438\u0442\u0435 \u0442\u0430\u043a \u0436\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043e.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432 \u043c\u043e\u0451\u043c \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u043c \u043a\u0430\u043d\u0430\u043b\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u0441\u044f \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c\u0438 \u0441\u0442\u0430\u0442\u044c\u044f\u043c\u0438, \u0438 \u043f\u0435\u0440\u0432\u044b\u043c\u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 &#8212; <a href=\"https:\/\/t.me\/holydevlog\" rel=\"noopener noreferrer nofollow\">https:\/\/t.me\/holydevlog<\/a><\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/555858\/\"> https:\/\/habr.com\/ru\/post\/555858\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u043c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u044f\u0447\u0435\u0441\u043b\u0430\u0432 \u0438 \u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442, \u043d\u0443 \u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0433\u0435\u0439\u043c\u0434\u0435\u0432\u043e\u043c \u043d\u0430 GodotEngine, \u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0432\u0435\u0434\u0443 \u0441\u0432\u043e\u0439 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u043c \u043a\u0430\u043d\u0430\u043b, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0438\u0448\u0443 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0441\u0432\u043e\u0435\u0439 \u0438\u0433\u0440\u044b \u043d\u0430 \u044d\u0442\u043e\u043c \u0434\u0432\u0438\u0436\u043a\u0435 \u0438 \u043f\u043e\u0434\u043a\u0438\u0434\u044b\u0432\u0430\u044e \u043d\u043e\u0432\u0438\u0447\u043a\u0430\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0434\u043b\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u0413\u043e\u0434\u043e.<\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u0434\u0435\u043b\u0443, \u0430 \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0430\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044c \u0441 Drag&amp;Drop`\u043e\u043c \u0438 \u0431\u043e\u043d\u0443\u0441\u043e\u043c \u043e\u0442 \u043c\u0435\u043d\u044f?<\/p>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c. \u042f \u043d\u0435 \u0434\u0438\u0437\u0430\u0439\u043d\u0435\u0440, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u0437\u0430\u0434\u0438\u0437\u0430\u0439\u043d\u0438\u0442\u0435 \u043f\u043e\u0442\u043e\u043c \u0441\u0430\u043c\u0438.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043d\u0430\u043a\u0438\u0434\u0430\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u043e\u0434\u044b \u0432 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435:&nbsp;<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u043a\u043e\u043d\u0442\u0440\u043e\u043b \u043a\u0438\u0434\u0430\u0435\u043c PanelContainer, \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 Layout(\u0412\u0438\u0434) \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u043c \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0443 \u0438 \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u0444\u043b\u0430\u0433\u0438 \u043d\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043f\u043e \u0432\u044b\u0441\u043e\u0442\u0435 \u0438 \u0448\u0438\u0440\u0438\u043d\u0435:<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u0427\u0438\u043b\u0434\u043e\u043c \u043a\u0438\u0434\u0430\u0435\u043c \u0413\u0440\u0438\u0434\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440(\u0441\u0435\u0442\u043a\u0430), \u0432 \u043d\u0435\u0451 \u043c\u044b \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u043c \u043a\u0438\u0434\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0442\u0430\u043a \u0436\u0435 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u201c\u043f\u043e\u0434\u043d\u044f\u0442\u0438\u044f\u201d \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430, \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u043c \u043a\u043e\u043b-\u0432\u043e\u043c.<\/p>\n<p>\u0423 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 8 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0432 \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u0435 \u0438 4 \u0441\u0442\u0440\u043e\u0447\u043a\u0438, \u0434\u043b\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b \u0438\u043a\u043e\u043d\u043a\u0438 \u0438\u0442\u0435\u043c\u043e\u0432.<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u043a\u0430\u0447\u0430\u0435\u043c \u0441 \u0433\u0443\u0433\u043b\u0430 \u0448\u0440\u0438\u0444\u0442 \u0438 \u0437\u0430\u043a\u0438\u043d\u0435\u043c \u0435\u0433\u043e \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b, \u0447\u0442\u043e\u0431\u044b \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u043c\u0435\u043d\u044f\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0447\u0443\u0442\u044c \u0441\u0442\u0438\u043b\u0438\u0437\u0443\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0431\u044b\u043b\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044c, \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0434\u0438\u043d \u0441\u043b\u043e\u0442, \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u0442.\u043a. \u043c\u044b \u0435\u0433\u043e \u0431\u0443\u0434\u0435\u043c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0442\u044b:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0437\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u0432 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0441\u0446\u0435\u043d\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u043a\u0440\u0438\u043f\u0442:<\/p>\n<pre><code class=\"python\">extends Control  export (int, 1, 20) var columns = 8 export (int, 1, 20) var rows = 4 onready var inv = $InvContainer\/InvContent const slot_scene = preload(\"res:\/\/Slot.tscn\") func _ready():  inv.columns = columns  for i in range(columns*rows):   var slot = slot_scene.instance()   inv.add_child(slot) <\/code><\/pre>\n<p>\u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0441\u0446\u0435\u043d\u0443 \u0441\u043b\u043e\u0442\u0430, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0443\u0434\u0430 \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u043f\u0430\u043d\u0435\u043b\u044c, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0439 \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u0438\u043b\u044c, \u0432 \u043d\u0435\u0451 TextureRect \u0434\u043b\u044f \u0438\u043a\u043e\u043d\u043a\u0438 \u0438 Label \u0434\u043b\u044f \u043a\u043e\u043b-\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u0442\u0430\u0432\u0438\u043c \u0434\u043b\u044f \u0418\u043a\u043e\u043d\u043a\u0438 \u0442\u0430\u043a\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445, \u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u0440\u043e \u0432\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0432 \u0441\u0442\u0430\u0442\u044c\u0435:<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 Slot \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0441\u043a\u0440\u0438\u043f\u0442, \u0438 \u043a\u0438\u0434\u0430\u0435\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"python\">extends PanelContainer  onready var item = $Item onready var icon = $Item\/Icon onready var count = $Item\/Count  var item_type = null var item_count = 0  func _ready():  update_data({\"type\": \"item_type_1\", \"count\": 0})  func update_data(data = null):  item.visible = data != null  if data:   icon.texture = load(\"res:\/\/graphics\/%s.png\" % data.type) #\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438\u043a\u043e\u043d\u043a\u0438   count.text = str(data.count) <\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u0439\u043c\u0451\u043c\u0441\u044f \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u043e\u0447\u0438\u0441\u0442\u043a\u0438:<\/p>\n<p>\u0418\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442:<\/p>\n<pre><code class=\"python\">extends Control  export (int, 1, 20) var columns = 8 export (int, 1, 20) var rows = 4  onready var inv = $InvContainer\/InvContent  const slot_scene = preload(\"res:\/\/Slot.tscn\")  func _ready():  $InvContainer\/HBoxContainer\/Clear.connect(\"pressed\", self, \"clear_inventory\")  inv.columns = columns  for i in range(columns*rows):   var slot = slot_scene.instance()   inv.add_child(slot)    func clear_inventory():  for child in inv.get_children(): #\u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c \u043f\u043e \u0447\u0438\u043b\u0434\u0430\u043c \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044f   child.update_data() #\u0434\u0435\u043b\u0430\u0435\u043c \u0430\u043f\u0434\u0435\u0439\u0442 \u0431\u0435\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 <\/code><\/pre>\n<p>\u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u0438\u043c\u0441\u044f \u043a \u0441\u0438\u0433\u043d\u0430\u043b\u0443 \u043a\u043d\u043e\u043f\u043a\u0438 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u043e\u0439 \u043e\u0447\u0438\u0449\u0430\u0435\u043c \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044c.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043a\u043d\u043e\u043f\u043a\u0430 \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0432 \u0441\u043a\u0440\u0438\u043f\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">extends PanelContainer  onready var item = $Item onready var icon = $Item\/Icon onready var count = $Item\/Count  var item_data = null  func _ready():  update_data()  func empty():  return item_data == null  func update_data(data = null):  item.visible = data != null  item_data = data  if item:   icon.texture = load(\"res:\/\/graphics\/%s.png\" % item_data.type) #\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438\u043a\u043e\u043d\u043a\u0438   count.text = str(item_data.count)  return true <\/code><\/pre>\n<p>\u0417\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u0432 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u043e\u0432\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"python\">&nbsp;func has_empty_slot(): #\u041c\u0435\u0442\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u043e\u0439 \u043f\u0443\u0441\u0442\u043e\u0439 \u044f\u0447\u0435\u043a\u0438  for child in inv.get_children(): #\u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c \u043f\u043e \u0447\u0438\u043b\u0434\u0430\u043c \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044f   if child.empty():    return true  return false  func get_empty_slot(): #\u041c\u0435\u0442\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u043f\u0443\u0441\u0442\u043e\u0439 \u044f\u0447\u0435\u043a\u0438  var slot = null  if has_empty_slot():&nbsp;   #\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0435 \u044f\u0447\u0435\u0439\u043a\u0438   #\u0418\u043d\u0430\u0447\u0435 \u043f\u0440\u0438 \u043f\u043e\u043b\u043d\u043e\u043c \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u0435 \u0431\u0443\u0434\u0435\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043f\u0440\u0438 \u043f\u043e\u043b\u043d\u043e\u043c \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u0435 \u0438 \u0438\u0433\u0440\u0430 \u0437\u0430\u0432\u0438\u0441\u043d\u0435\u0442   while slot == null: #\u0418\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u0443\u044e \u043f\u0443\u0441\u0442\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0451\u043c    var temp_slot = inv.get_child(rng.randi_range(0, columns*rows-1))    if temp_slot.empty():     slot = temp_slot     break  return slot  func add_item(): #\u0421\u043b\u043e\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043a \u043a\u043d\u043e\u043f\u043a\u0435  var slot = get_empty_slot()  if slot:   var data = {\"type\":\"\", \"count\": 0}   data.type = \"item_type_\" + str(rng.randi_range(1, 8))   data.count = rng.randi_range(1, 999)   slot.update_data(data) <\/code><\/pre>\n<p>\u0418 \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043c\u0435\u0442\u043e\u0434\u0443 \u201cadd_item\u201d, \u0438 \u0432\u0441\u0451 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f D&amp;D(Drag&amp;Drop).<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0446\u0435\u043d\u0443 \u0438\u0442\u0435\u043c\u0430, \u0442.\u043a. \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0432 \u0434\u0432\u0443\u0445 \u043c\u0435\u0441\u0442\u0430\u0445.<\/p>\n<p>\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0438\u0442\u0435\u043c\u0430, \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u0447\u0438\u0441\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"python\">extends PanelContainer  onready var icon = $Icon onready var count = $Count  const path_to_items_icons = \"res:\/\/graphics\/%s.png\"  func set_data(item_data):  icon.texture = load(path_to_items_icons % item_data.type) #\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438\u043a\u043e\u043d\u043a\u0438  count.text = str(item_data.count) <\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0435\u043c \u043a \u0441\u043b\u043e\u0442\u0443:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u044e\u0434\u0430 \u043c\u044b \u0437\u0430\u043a\u0438\u043d\u0443\u043b\u0438 \u043d\u0430\u0448\u0443 \u0441\u0446\u0435\u043d\u0443 \u0441 \u0438\u0442\u0435\u043c\u043e\u043c, \u043f\u043b\u044e\u0441 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0441\u044f \u043b\u0435\u0439\u0431\u043b \u201cNum\u201d, \u0432 \u043d\u0451\u043c \u043b\u0435\u0436\u0438\u0442 \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430, \u044f \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u0440\u044b\u0442\u044c \u0435\u0433\u043e \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0441\u0446\u0435\u043d\u044b \u0438 \u0438\u0437 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0446\u0435\u043d\u044b. \u041a\u0441\u0442\u0430\u0442\u0438 \u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0446\u0435\u043d\u0435, \u0432 \u043d\u0435\u0439 \u0442\u043e\u0436\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043b\u0441\u044f \u043a\u0430\u043a \u0440\u0430\u0437 \u043d\u0430\u0448 \u0438\u0442\u0435\u043c, \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043d\u043e \u043d\u0438 \u043a \u0447\u0435\u043c\u0443 \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 (\u0431\u0435\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432), \u0430 \u0437\u0430\u0447\u0435\u043c \u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0434\u0430\u043b\u044c\u0448\u0435)<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c\u043e\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435, \u044d\u0442\u043e \u0441\u043a\u0440\u0438\u043f\u0442 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0446\u0435\u043d\u044b, \u0442\u0430\u043c \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u043a\u0443\u0447\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435:<\/p>\n<pre><code class=\"python\">extends Control  export (int, 1, 20) var columns = 8 #\u043a\u043e\u043b-\u0432\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044f export (int, 1, 20) var rows = 4 #\u043a\u043e\u043b-\u0432\u043e \u0441\u0442\u0440\u043e\u0447\u0435\u043a \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044f  const slot_scene = preload(\"res:\/\/Slot.tscn\") #\u041f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043f\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0441\u0446\u0435\u043d\u0443 \u0441\u043b\u043e\u0442\u0430  onready var inv = $InvContainer\/InvContent #\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0441\u043b\u043e\u0442\u043e\u0432 onready var titem = $TempItem #\u042d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u043d\u0430\u0448 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c, \u043e\u043d \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u044f onready var rng = RandomNumberGenerator.new() #\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0440\u0430\u043d\u0434\u043e\u043c\u0430\u0439\u0437\u0435\u0440\u0430 onready var item_dragging = null #\u0417\u0434\u0435\u0441\u044c \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0438\u0442\u0435\u043c \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0438 onready var prev_slot = null #\u0421\u043b\u043e\u0442 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0435\u043c \u0438\u0442\u0435\u043c  func ready():  titem.visible = false #\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c  rng.randomize() #\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0440\u0430\u043d\u0434\u043e\u043c\u0430\u0439\u0437\u0435\u0440  $InvContainer\/HBoxContainer\/Clear.connect(\"pressed\", self, \"clear_inventory\")  $InvContainer\/HBoxContainer\/Add.connect(\"pressed\", self, \"add_item\")  inv.columns = columns #\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u043a\u043e\u043b-\u0432\u043e \u0441\u043b\u043e\u043b\u0431\u0446\u043e\u0432 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f  for i in range(columns*rows): #\u0426\u0438\u043a\u043b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043b\u043e\u0442\u043e\u0432   var slot = slot_scene.instance() #\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043b\u043e\u0442\u0430   slot.name = \"Slot%d\" % i #\u0417\u0430\u0434\u0430\u0451\u043c \u0435\u043c\u0443 \u0438\u043c\u044f, \u0432 \u0446\u0435\u043b\u043e\u043c \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u043d\u043e \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0443\u0434\u043e\u0431\u043d\u043e   slot.get_node(\"Num\").text = str(i) #\u041a\u0430\u043a \u0440\u0430\u0437 \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430, \u0435\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0435 \u0438\u0437 \u0441\u0446\u0435\u043d\u044b \u0441\u043b\u043e\u0442\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435, \u0442\u043e \u044d\u0442\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u0442\u043e\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c   inv.add_child(slot) #\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043b\u043e\u0442\u0430 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435  func clear_inventory(): #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430  for child in inv.get_children(): #\u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c \u043f\u043e \u0447\u0438\u043b\u0434\u0430\u043c \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044f   child.update_data() #\u0434\u0435\u043b\u0430\u0435\u043c \u0430\u043f\u0434\u0435\u0439\u0442 \u0431\u0435\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432  func has_empty_slot(): #\u041c\u0435\u0442\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u043e\u0439 \u043f\u0443\u0441\u0442\u043e\u0439 \u044f\u0447\u0435\u043a\u0438  for child in inv.get_children(): #\u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c \u043f\u043e \u0447\u0438\u043b\u0434\u0430\u043c \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044f   if child.empty():    return true  return false  func get_empty_slot(): #\u041c\u0435\u0442\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u043f\u0443\u0441\u0442\u043e\u0439 \u044f\u0447\u0435\u043a\u0438  var slot = null  if has_empty_slot():&nbsp;   #\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0435 \u044f\u0447\u0435\u0439\u043a\u0438   #\u0418\u043d\u0430\u0447\u0435 \u043f\u0440\u0438 \u043f\u043e\u043b\u043d\u043e\u043c \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u0435 \u0431\u0443\u0434\u0435\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043f\u0440\u0438 \u043f\u043e\u043b\u043d\u043e\u043c \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u0435 \u0438 \u0438\u0433\u0440\u0430 \u0437\u0430\u0432\u0438\u0441\u043d\u0435\u0442   while slot == null: #\u0418\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u0443\u044e \u043f\u0443\u0441\u0442\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0451\u043c    var temp_slot = inv.get_child(rng.randi_range(0, columns*rows-1))    if temp_slot.empty():     slot = temp_slot     break  return slot  func add_item(): #\u0421\u043b\u043e\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043a \u043a\u043d\u043e\u043f\u043a\u0435  var slot = get_empty_slot()  if slot:   var data = {\"type\":\"\", \"count\": 0}   data.type = \"item_type_\" + str(rng.randi_range(1, 8))   data.count = rng.randi_range(1, 999)   slot.update_data(data)    func find_slot(pos:Vector2, need_data = false): #\u041c\u0435\u0442\u043e\u0434 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u043b\u043e\u0442\u0430 \u043f\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c  #\u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 - \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439, \u043e\u043d \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0441\u043b\u043e\u0442 \u0441 \u0438\u0442\u0435\u043c\u043e\u043c \u0438\u043b\u0438 \u043d\u0435\u0442  for c in inv.get_children(): #\u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c \u043f\u043e \u0447\u0438\u043b\u0434\u0430\u043c \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044f   if (need_data and not c.empty()) or (not need_data):    if Rect2(c.rect_position, c.rect_size).has_point(pos):     #\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0438\u0437 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0441\u043b\u043e\u0442\u0430 \u0438 \u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432, \u0447\u0442\u043e\u0431\u044b&nbsp;     #\u043b\u0435\u0433\u043a\u043e \u043e\u0434\u043d\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0435     return c  return null  func _process(delta):  var mouse_pos = get_viewport().get_mouse_position() #\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043c\u044b\u0448\u043a\u0438   if Input.get_mouse_button_mask() == BUTTON_LEFT: #\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u0436\u0430\u0442\u0430 \u043b\u0438 \u043b\u0435\u0432\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u043c\u044b\u0448\u0438   if not item_dragging: #\u0435\u0441\u043b\u0438 \u043c\u044b \u0443\u0436\u0435 \u043d\u0435 \u0442\u0430\u0449\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442    var slot = find_slot(mouse_pos, true)#\u0438\u0449\u0435\u043c \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c \u0441\u043b\u043e\u0442 \u0441 \u0438\u0442\u0435\u043c\u043e\u043c       if slot: #\u0435\u0441\u043b\u0438 \u0441\u043b\u043e\u0442 \u043d\u0430\u0439\u0434\u0435\u043d     item_dragging = slot.item_data #\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0442\u0435\u043c\u0430     titem.set_data(item_dragging) #\u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c \u043f\u0438\u0445\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435     titem.visible = true #\u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c     titem.rect_position = slot.rect_position #\u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441\u043b\u043e\u0442\u0430     prev_slot = slot #\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0441\u043b\u043e\u0442 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u043c \u0442\u0430\u0449\u0438\u0442\u044c \u0438\u0442\u0435\u043c     slot.update_data() #\u043e\u0447\u0438\u0449\u0430\u0435\u043c \u0441\u043b\u043e\u0442 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0442\u0430\u0449\u0438\u043c   else: #\u0435\u0441\u043b\u0438 \u043c\u044b \u0443\u0436\u0435 \u0442\u0430\u0449\u0438\u043c \u0438\u0442\u0435\u043c, \u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u043c \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440, \u0441\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u043c \u043e\u0442 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0438\u0442\u0435\u043c\u0430(\u0447\u0442\u043e\u0431\u044b \u0446\u0435\u043d\u0442\u0440 \u0438\u0442\u0435\u043c\u0430 \u0431\u044b\u043b \u043f\u043e\u0434<\/code><\/pre>\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-322643","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/322643","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=322643"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/322643\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=322643"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=322643"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=322643"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}