ArcadePin — 霓虹街機彈珠台
純前端、免後端資料庫的霓虹街機風彈珠台。自製 HTML5 Canvas 物理引擎,結合 IndexedDB 個人紀錄與 GitHub 託管的全球排行榜,部署於 GitHub Pages。




專案簡介
ArcadePin 是一款復古街機風格的網頁彈珠台,主打「純前端、免伺服器後端、零營運成本」。
物理、視覺、音效、儲存與排行榜全在瀏覽器端完成,並部署於 GitHub Pages,永久免費運作。
我做了什麼
- 自製物理引擎:以固定時間步長(1/300s)的遊戲迴圈處理重力、剛體反彈與連續碰撞,
避免高速穿牆;彈片以旋轉角速度把動量傳遞給球,手感接近真實彈珠台。 - 關卡與機關:600×1000 檯面配置 12 個霓虹彈撞器、彈弓,以及 2 個「黑洞」——
球被吸入後短暫停留再朝隨機上方強力彈射;發射軌入口加上「單向閘門」防止球彈回出生點。 - 視覺與音效:以 Canvas shadowBlur 打造霓虹發光,搭配 Web Audio API 即時合成
打擊/發射/落球音效,全程不使用任何外部素材。 - 雙軌排行榜架構:
- 本機:IndexedDB 永久保存該裝置的完整遊玩歷史,不限筆數、離線可用。
- 全球:GitHub 託管的
top_100_leaderboard.json(秒載渲染)與 append-only 歷史檔
(超過 5MB 由 GitHub Actions 自動分檔歸檔)。
- 免後端的雲端寫入:純前端無法安全保存 Token,因此以 Cloudflare Worker 作為
Serverless 代理保管金鑰:前端送分數給代理 → 觸發repository_dispatch→
GitHub Actions 驗證簽章後寫回 JSON 並自動 commit,Pages 隨即更新。 - 工程細節:FNV-1a 分數簽章防止簡易竄改、PWA manifest 可加到主畫面、
支援鍵盤與觸控、響應式縮放維持檯面比例。
技術挑戰
- 物理穩定性:固定步長+速度上限確保高速球不穿牆;以 Node 無頭模擬跑數十局,
驗證「不會 NaN、不逸出檯面、必定落袋、黑洞不會無限迴圈」。 - 無伺服器的全球排行:在不架後端資料庫的前提下,用「GitHub 當資料庫 +
Actions 當寫入器 + Worker 當金鑰保管」湊出一條安全可行的寫入鏈路。
技術棧
HTML5 Canvas、原生 JavaScript(ES6 Modules,無框架)、IndexedDB、Web Audio API、
GitHub Actions、GitHub Pages、Cloudflare Workers、PWA。
功能亮點
- 自製 2D 剛體物理引擎:固定步長迴圈、彈片角速度動量傳遞、防穿牆連續碰撞
- 600×1000 大檯面:12 個霓虹彈撞器、雙黑洞(吸入後強力彈射)、單向發射閘門
- 霓虹視覺(Canvas 發光)+ Web Audio 即時合成音效,連擊 Combo 倍率計分
- 雙軌排行榜:本機 IndexedDB 永久個人紀錄 + GitHub 託管全球前 100 名
- 免後端雲端上傳:Cloudflare Worker 代理 → GitHub Actions 驗證並寫回 JSON(超過 5MB 自動分檔)
- 防作弊簽章、PWA 可安裝、支援鍵盤與觸控、響應式縮放