2026-04-14開發日誌
- 日期:2026-04-14
- 專案:Cá xấu Duckduck
今天做了遊戲裡第一個完整的「撿道具」流程——從點擊道具、播放動畫、存進背包、再開背包查看,整條路打通了。
糖罐互動
在 chapter1_sugar_prop 場景(廚房特寫圖)加上了一個隱形按鈕,覆蓋在白色糖罐上。使用者點到罐子的時候,會觸發收集動畫:
- 糖塊圖片(
suger.png)從糖罐位置彈出放大(TRANS_BACK,有點彈性感) - 停留約 0.35 秒
- 飛進右下角的包包,同時縮小、淡出
- 動畫結束後通知
InventoryManager把糖塊存起來
按鈕是隱形的(flat = true),座標用 anchor 對齊圖片裡糖罐的位置。這個做法之前在 SugerBtn 和 DecoBtn 用過,算是確立下來的隱形互動按鈕模式。
背包系統
背包不只是一個圖示,它現在有完整的開關邏輯。
InventoryManager(全域狀態)
建了一個 autoload InventoryManager,統一管理收集到的道具清單。設計很簡單:
add_item(id, texture_path)— 加入道具(同一個 id 只存一次)get_items()— 回傳清單item_addedsignal — 讓 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(),框架已經在了。
