Re: 寡人新創作的弈棋「維諾廣場」竟然十分好玩!
发表于 : 2026年 9月 1日 09:00
增加功能:當雷腦鼠標或手機觸控按到棋子上不放時,拖動到的象限將使棋子旋轉到那個方向。
claude sonnet 5 (medium)
claude sonnet 5 (medium)
代码: 全选
Good — I'll add `orientationDrag: null` here, matching the existing transient-UI-state pattern.Now implementing the drag-to-rotate mechanism:Now let's refactor the orientation calculation and add the drag handlers:Now let's wire up the pointer event listeners near the existing click listener for piece frames:Good, `#gameScreen` starts at line 1455 and the piece frames (1460-1634) are inside it. Now let's verify syntax and check for other issues:已加入「按住棋子拖曳到象限即可即時旋轉」的功能,適用於法諾與維諾(可旋轉的棋子;米諾是單格,本來就沒有方向可言)。
實作重點:
1. **共用象限判斷邏輯** `computeQuadrantOrientation`:以按下當下記錄的棋子圖示中心點為基準,判斷指標目前落在左上/右上/右下/左下哪個象限。因為是相對中心點計算,就算拖曳到圖示範圍外,也能正確判斷方向,不會因為拖出邊框就失效。
2. **按下開始拖曳** `handlePieceFramePointerDown`:滑鼠或觸控按到「目前這方正要放置的」法諾或維諾圖示上時,記錄下該圖示當下的位置與指標 ID,並嘗試呼叫 `setPointerCapture`,確保之後拖到圖示外面(甚至到棋盤上)仍能持續追蹤這個指標。
3. **拖曳中即時旋轉** `handleOrientationDragMove`:指標移動時即時重新計算象限,一旦方向改變就更新 `orientationMemory` 並重新渲染棋子圖示與棋盤預覽,讓玩家可以看到棋子隨拖曳即時轉動。
4. **放開手指/滑鼠時定案** `handleOrientationDragEnd`:以放開當下的象限作為最終方向,並清除拖曳狀態、釋放指標捕獲。
5. 這個手勢只會在該棋子正是「目前這方可以放置的棋子」時啟動,不會影響「提前切換階段」或「切回上一階段」等既有的點擊功能;輕點一下(沒有明顯拖曳)也仍然像原本一樣,落在哪個象限就旋轉到哪個方向,行為保持一致。
6. 也加了對應的 CSS:拖曳中的棋子圖示會有明顯的邊框高亮效果,並將可旋轉棋子的 `touch-action` 設為 `none`,避免在手機上拖曳旋轉時被系統誤判成頁面捲動手勢。