Spaces:
Running
Running
Skills & Best Practices - Math City Project
此文件記錄本專案開發過程中的技術規範、設計模式、教學設計哲學與除錯經驗,供後續開發參考。
1. 技術架構與規範 (Tech Stack & Guidelines)
核心技術
- 核心: HTML5 Canvas + Vanilla JS (ES6+)。
- 樣式: Tailwind CSS (CDN read-only 模式) + Custom CSS (for animations/glassmorphism)。
- 字體: 'Orbitron' (數字符號/標題), 'Noto Sans TC' (中文內文)。
- 建置: 無須 Build Tool (No Webpack/Vite),保持單檔可執行 (
.html),方便老師分享與部署。
程式碼規範
- 語言: 註解與文件說明嚴格使用繁體中文,變數與函數名稱使用英文。
- 檔案結構: 保持扁平,html 檔包含 CSS/JS 為主 (方便單檔攜帶),通用素材放
Assets/。 - 狀態管理: 使用整數常數定義狀態機 (
const STATE = { INIT: 0, PLAYING: 1 ... }),避免字串混淆。
2. 視覺與互動設計 (UI/UX Patterns)
視覺風格:Glassmorphism (玻璃擬態)
- 背景使用
backdrop-filter: blur(12px)搭配半透明深色背景 (bg-slate-900/90)。 - 邊框使用亮色且低透明度 (
border-cyan-500/30) 營造科技質感。 - 善用
box-shadow與drop-shadow營造霓虹發光效果。
Canvas 渲染優化
- High-DPI 支援:
- 在 Retina 螢幕上,務必處理
devicePixelRatio。 - Canvas 屬性寬高 = CSS 寬高 * dpr。
- Context 縮放:
ctx.scale(dpr, dpr)。
const dpr = window.devicePixelRatio || 1; canvas.width = width * dpr; canvas.height = height * dpr; canvas.style.width = width + 'px'; canvas.style.height = height + 'px'; ctx.scale(dpr, dpr); - 在 Retina 螢幕上,務必處理
行動裝置適配 (Mobile Adaptation)
- 禁止捲動/縮放:
- CSS:
touch-action: none; user-select: none; -webkit-user-select: none; - JS: 監聽
touchstart/touchmove並執行e.preventDefault()(需加{ passive: false })。
- CSS:
- 虛擬鍵盤 (Virtual Keypad):
- iOS/Android 預設軟鍵盤會推擠版面,破壞全螢幕體驗。
- 解決方案: 自製 DOM 虛擬鍵盤,支援拖曳 (Draggable) 與自動定位。
- 點擊穿透處理: 鍵盤點擊事件需
e.stopPropagation()。
3. 遊戲邏輯與物理 (Game Mechanics)
物理引擎 (Physics)
- Coyote Time (土狼時間):
- 在玩家離開平台的一小段時間內 (例如 0.13秒) 仍允許跳躍,增加操作手感容錯率。
- 實作: 設置
coyoteTimer,只要在地上就重置,離地後遞減,大於 0 時仍視為可跳躍。
- 時間步長 (Time Step):
- 目前使用簡易的
requestAnimationFrame迴圈。若需更精準物理,考慮導入 Delta Time (dt)。
- 目前使用簡易的
遊戲反饋 (Juice & Feedback)
- 動畫選擇:
- 錯誤提示避免使用滑稽的
bounce,改用嚴肅且有質感的pulse(呼吸燈) + 紅色邊框。
- 錯誤提示避免使用滑稽的
- 音效合成 (Web Audio API):
- 不依賴外部 mp3 檔案,使用
OscillatorNode即時合成音效 (Sine, Square, Sawtooth)。 - 優點:無載入時間、檔案極小、可動態改變頻率 (Pitch Bend)。
- 注意: 必須使用者互動 (Click/Touch) 後才能
resume()AudioContext。
- 不依賴外部 mp3 檔案,使用
4. 數學教學設計 (Pedagogy Design)
鷹架理論 (Scaffolding)
- 不僅僅是給答案: 錯誤訊息應轉化為引導問題。
- Bad: "答錯了!"
- Good: "如果 x=2, y=11, 但公式是 y=2x+b, 所以 b 是多少?"
- 變數分離:
- 在解 $y=ax+b$ 時,先令 $x=0$ 解 $b$,再令 $x=1$ 解 $a$,避免同時處理雙變數的認知負荷。
視覺化連結 (Visual-Algebra Connection)
- 多重表徵連結: 當計算出代數答案 (例如 y=35) 時,程式應同步強調圖表上的對應幾何點 (10, 35),強化「數形合一」的概念。
正向回饋 (Positive Feedback)
- 避免挫折感,將艱澀的計算任務後的獎勵極大化 (例如:華麗的煙火、Phase 6 的節奏遊戲),讓大腦獲得多巴胺釋放。
5. Agent 開發工作流 (Agent Workflow)
任務邊界 (Task Boundary)
- 使用
task_boundary明確區分 PLANNING (規劃)、EXECUTION (執行) 與 VERIFICATION (驗證) 階段。 - Context Management: 保持對話專注,一個 Task 解決一個具體問題。
Artifacts 使用
- Implementation Plan: 修改複雜邏輯前,先撰寫
implementation_plan.md讓使用者確認設計思路。 - Walkthrough: 完成功能後,建立
walkthrough.md展示成果與測試截圖。
6. 已知問題與解決 (Troubleshooting Log)
- 問題: 平台消失後的透明牆導致玩家卡住。
- 解法: 物理碰撞檢測時,需過濾掉
active: false的平台物件。
- 解法: 物理碰撞檢測時,需過濾掉
- 問題: Home 鍵在全螢幕模式下難以點擊。
- 解法: 確保 UI 層級 (
z-index) 正確,並添加pointer-events-auto到按鈕本身,而容器保持pointer-events-none。
- 解法: 確保 UI 層級 (
- 問題: 數列峽谷中,只有前兩項有提示,後續太難。
- 解法: 設計意圖就是強制計算。但為了公平,統一了所有平台的視覺 (碎石紋理),避免玩家嘗試「辨色」而非「計算」。
Created by Antigravity Team for Project 11402