Skip to content

2026-04-14開發日誌

  • 日期:2026-04-14
  • 專案:Cá xấu Duckduck

今天做了遊戲裡第一個完整的「撿道具」流程——從點擊道具、播放動畫、存進背包、再開背包查看,整條路打通了。


糖罐互動

chapter1_sugar_prop 場景(廚房特寫圖)加上了一個隱形按鈕,覆蓋在白色糖罐上。使用者點到罐子的時候,會觸發收集動畫:

  1. 糖塊圖片(suger.png)從糖罐位置彈出放大(TRANS_BACK,有點彈性感)
  2. 停留約 0.35 秒
  3. 飛進右下角的包包,同時縮小、淡出
  4. 動畫結束後通知 InventoryManager 把糖塊存起來

按鈕是隱形的(flat = true),座標用 anchor 對齊圖片裡糖罐的位置。這個做法之前在 SugerBtnDecoBtn 用過,算是確立下來的隱形互動按鈕模式。


背包系統

背包不只是一個圖示,它現在有完整的開關邏輯。

InventoryManager(全域狀態)

建了一個 autoload InventoryManager,統一管理收集到的道具清單。設計很簡單:

  • add_item(id, texture_path) — 加入道具(同一個 id 只存一次)
  • get_items() — 回傳清單
  • item_added signal — 讓 bag UI 可以即時反應

用 autoload 的原因是道具狀態要跨場景保留。玩家在糖罐場景撿到東西,回到廚房背景後包包裡還是要有那個東西。

背包 UI(bag.tscn)

點包包圖示:開啟/收起物品列,有 0.2 秒的淡入淡出。

物品列用 ScrollContainer 包住 HBoxContainer,可以左右滑動。每個道具顯示為 160×160 的縮圖,保持比例置中。

另外,每次收到新道具,包包圖示會有一個彈跳動畫(TRANS_ELASTIC),給玩家一個明確的「收到了」的視覺回饋。


今天遇到的 bug:場景黑屏

修完功能跑起來,點過第一章標題畫面後一片黑。

排查過程:fade 邏輯正確、場景路徑正確、FadeRect 設定沒問題。最後鎖定在 bag.tscn 的節點格式。

根本原因:Godot 4 的 .tscn 格式規定,除了第一個 root 節點之外,所有節點都必須明確標註 parent= 屬性。InventoryPanel 節點少了 parent=".",導致整個場景檔解析失敗,instancing 進去的 chapter1_background 也跟著壞掉,才會看到黑屏。

改一個字就修好了,但找的過程確實要把整條載入鏈都看過一遍。


小結

今天最重要的事不是功能本身,而是第一條完整的道具收集流程跑通了:點 → 動畫 → 存入背包 → 背包可以打開查看。後續要加更多道具只需要:放隱形按鈕、連結 InventoryManager.add_item(),框架已經在了。