ETH官方钱包

前往
大廳
主題

【Godot】食材背包 - Drag and Drop物件拖放

小短腿 | 2024-08-06 16:42:59 | 巴幣 110 | 人氣 85

本次教學筆記所使用的Godot版本為v4.2.1,程式語言為GDScript
============================================

【背包物件ItemSlot
        這次絕大多數的功能都由Control節點提供,因此選用了一個繼承Control又可以同時表示某個區域大小的ColorRect(透明)做為根節點。再在底下加入需要顯示的UI原件:
  • Plate(TextureRect)是粉紅色的底盤;
  • Food(TextureRect)是橘色的點心;
  • Count(Label)是顯示數量的標籤。其中數字有個外框線效果(outline),是在Theme Overrides底下設定顏色(Colors > Font Outline Color)和粗細(Constants > Outline Size),就會顯示囉

【代碼編寫 - ItemSlot
腳本先繼承Control
讓此背包物件能儲存顯示食物相關的資料itemType(Dictionary)
另外也紀錄該食物有幾個itemCount(int)
之後依序準備幾個會用到的方法:
  • itemSetting:指定食物資料與數量,指定完畢後通知change_UI更新畫面
  • change_UI:根據情況顯示盤子、切換食物的貼圖、以及數量文字
  • _get_drag_data:重寫Control提供的方法,指定在何種情況下可以將物件抓起
  • _can_drop_data:重寫Control提供的方法,判斷物件能存放的位置
  • _drop_data:重寫Control提供的方法,放下物件後要處理的程序
先保存匯入的資料,再確認資料是否為空
因為無法直接將null指定給Dictionary,所以已先加工成{ "_id" : "empty"}來表示空物件
plateVis為false時隱藏底盤、也不會顯示數量,用來當之後拖曳中途的顯示物件
預覽物件使用的是相同的場景複製品,只是將除了食物圖以外的東西都隱藏了
除此之外,為了直觀的感受到有一樣食材被抓起(?
所以將抓取物件的數量-1
存放食材的地方需和自己一樣是ItemSlot
之後就是根據是否原地撿起放下?還是有打算和其他背包欄位交換位子而指定方法

【代碼編寫 - bagOutside
若是沒多做這一層,會發現滑鼠拖曳起的物件亂丟在背包外面,食材就會永遠的消失了
因此指定一個同樣有繼承Control、且擁有範圍的任意節點作為承接器(暫時負責撿漏)
*需注意GUI之間的上下層級,會擋住訊號的向下傳遞。
*之後也會用到這個概念,讓食材可以餵給小生物!

【成果展示

-------參考資料-------
Control --- Godot Engine
Godot 4.x 中的拖放 --- 開發者(2023/11/29)
============================================

        又是一個參考資料不難找,但想做出自己要的東西還是會燒燒腦袋的功能。Godot內建的Control已經大大幫忙節省了需要編寫的程式量,但想看懂教學還是很不容易啊(艸)

創作回應

相關創作

更多創作