第二版的透明視窗卡了我兩天(Day 7)。
第四版同樣要用透明視窗,而且影響層面更廣——一隻會在桌面上走的貓、一個跟著滑鼠游標的倒數、蓋住所有螢幕的休息遮罩,全部都靠它。
所以這次在寫任何功能之前,先做了一件事:證明這台電腦做得到。
規劃文件第九節叫「風險與注意事項(Windows + Godot 4 特定)」,第一條是:
透明三件套缺一不可:project setting
per_pixel_transparency/allowed+Window.transparent+viewport.transparent_bg,少一項 = 黑底。
第二條:
embed_subwindows必關;代價是 popup(OptionButton 下拉等)也變原生視窗,可接受。
這兩條都是 Sproutimer 換來的知識,這次它們在動工前就被列成已知風險。
但列出來不等於解決。Godot 的透明視窗在某些顯示卡和驅動下會變成黑底,這是硬體相關的問題,只能實測。
6 月 12 日下午 4 點 24 分,第一個 commit(1ff4a3a),497 行,訊息是:
M0: project skeleton with transparency smoke test
裡面沒有番茄鐘、沒有計時器、沒有 UI。只有專案骨架、空的 autoload 檔案,以及一個叫 transparency_smoke_test.gd 的測試。
這個測試的做法很有效:開一個透明小窗,中間畫一個洋紅色的圓,底下再放一個綠色的視窗。然後用 DisplayServer.screen_get_image() 截下真實螢幕,取樣兩個點——圓心應該是洋紅色,圓外的角落應該是底下那個視窗的綠色。

如果角落是黑的,就代表透明沒生效。
交接文件裡記錄了結果:
透明視窗冒煙測試 PASS:borderless + transparent + always_on_top +
transparent_bg小窗,洋紅圓外圍正確透出底下主視窗綠色,無黑底 bug。實測環境:Windows 11、AMD Radeon 780M、OpenGL Compatibility。→ 第九節風險 1 已在本機排除,M4 可放心做。
最後那句是重點:風險排除了,所以後面那個最花時間的貓咪覆蓋層可以放心做。
這個測試不是跑一次就丟。交接文件裡寫了怎麼再跑:
自動模式(測完自動退出,exit code 0 = PASS):
<console.exe> --path <專案目錄> ++ --smoke-test
手動模式:開 app 按「透明視窗冒煙測試」鈕,結果顯示在視窗內。
兩種模式都會在專案根目錄輸出smoke_result.txt(判定明細)與smoke_result.png(目視截圖)
exit code 0 = PASS 這件事對 vibe coding 特別重要。AI 可以自己跑這個指令、自己看結果,不需要我用眼睛確認。它變成 AI 可以驗證自己工作的工具。
| Sproutimer | Pomofocus | |
|---|---|---|
| 何時碰透明視窗 | 第 2 天,直接做功能 | 第 1 個 commit,先做驗證 |
| 怎麼確認做對了 | 執行、用眼睛看、截圖問 AI | 截螢幕取樣兩點,輸出 exit code |
| 花掉多久 | 4/8 19:04 到 4/9 15:10,跨兩天 | 包含在 M0 的 497 行裡,同一天完成 |
| 留下什麼 | 一個可以跑的視窗 | 一個可以重跑的測試 + 一段實測環境紀錄 |
「先測最危險的東西」並且讓它變成資產,變成資產需要滿足三個條件:
那個透明冒煙測試就是照這三條做的:++ --smoke-test 跑完自動退出、exit code 0 代表過、順便輸出判定明細和一張截圖。
選什麼來測?選「如果做不到,整個專案就要重來」的那一件。
我的是透明視窗,因為貓、滑鼠旁的倒數、全螢幕遮罩全都建在它上面。
其他專案可能是某個 API 的權限、某個裝置的相容性、或某個效能門檻。
順帶一提,實測環境要一起寫進文件。那行「Windows 11、AMD Radeon 780M、OpenGL Compatibility」看起來很囉唆,但透明視窗在不同顯卡驅動下的行為會不一樣——寫下來,下次換機器才知道要重測。
明天講 6 月 12 日剩下的六個半小時:下午 4 點 24 分建專案,晚上 10 點 51 分做完第三個里程碑,中間包含一套完整的番茄鐘狀態機、原子寫檔的資料層,以及三種強度的休息引導視窗。