一天、三個半小時、六個包、中途換一次玩法。現在只有一關,沒上架、沒後台,也沒有讓第二個人試玩過。
大秦地宮 · 驪山試煉(目錄 great-qin-dungeon-src,包名 qin-tile-dungeon,當前 v0.4.0)是一個純瀏覽器原型:React 19 + TypeScript 5.7 + Vite 6,戰鬥畫面走 Canvas,HUD、說明和結算走 React,物理用固定時間步更新、不依賴幀率。32 個源文件、1770 行、33 項測試。
這頁面上的四張圖全是本機實拍 —— npm run build 的生產構建跑在無頭 Chromium 裡截的,不是設計稿。

現在能玩到什麼
四個入口都在同一個包裡,靠查詢參數分流。下面的路徑都掛在 /qin-dungeon/ 底下,試玩按鈕進的是第 1 條:
/—— 故事主頁。首屏是秦陵全景,下面序章三段:流血黑石、封印破裂、尋找師兄/?play=1—— 橫版第一關,這個項目真正的內容/?prototype=motion—— 主角動作小樣,八幀跑步 + 六幀揮劍,可原速 / 四分之一慢放 / 逐幀 / 翻向/?prototype=tiles—— 被停掉的那一版(翻牌)
橫版一關分三個連續地段:殉葬甬道 → 斷橋回廊 → 守印之門。操作是 A/D 或方向鍵移動、空格跳(按住跳更高)、J 近戰連按成三段連擊、K 或 Shift 短衝刺(消耗 24 體力、期間短暫無敵)、Esc 暫停;手機是按得住的多點觸控按鈕。
規則上要緊的幾條:
- 敵人攻擊前有橙色預警,近戰蓄力時鎖定揮擊方向;弩箭可以跳過去,也可以直接用劍打掉
- 普通俑能被攻擊打斷,守關者不能靠連續攻擊一直壓制
- 長明燈回最多 30 氣血並激活重試點,死了從燈處重來或整關重開
- 打敗守關者才會開門,而且要走進青銅門內才算通關;路上其他敵人可以繞過去
- 中英文、靜音、減少鏡頭震動都有。音效是 Web Audio 現場合成的,不加載任何音頻文件;設置存本機,存儲失效不阻斷遊戲 —— 但刷新不保存本局

一天之內換了玩法
09:39 建的第一個文件是 src/main.tsx,09:55 六個包裡的第一個就打完了 —— 那是一個翻開石牌打回合制地牢。10:07,side-scroller-design.md 落盤,第一句是「停止擴建翻牌流程」八個字。原因寫得很直白:要驗證「人物移動、跳躍、攻擊、衝刺、躲避與命中是否形成可感知的操作反饋」,而翻牌這層介面永遠驗證不了這件事。
翻牌版沒有刪。它整個留在 src/TileApp.tsx,用 ?prototype=tiles 進,規則和本地成績都不跟橫版混用。

那一版的設計其實做得比橫版細。一塊 3×3 九宮、每室九張牌(三敵、兩補給、一機關、一遺物、一空地、一出口),出口在解決六張非出口牌後開放,第三室還得先打敗守印俑。回合戰鬥四種行動寫成數值表:秦劍 8 傷不耗真氣、五雷正法 18 傷耗 8 真氣、敕令機關俑召 30 氣血護法耗 12 真氣每場限一次、守勢讓本次敵人傷害減半向上取整。三種遺物同時只能裝一件,護心鏡先作用於原始傷害、再結算守勢、最後由機關俑和玩家分攤。起手 100 氣血 40 真氣。
這些數字到今天依然沒被任何一個真人碰過。設計文檔自己標了「只是第一輪調參起點,不是已驗證平衡」。
幾個真正值得記下的坑
- 測試全綠,動作是錯的(v0.3.2)。反饋是「感覺只有一隻腳在跑」。逐幀對照後確認:跑步圖第 1 幀和第 5 幀都將近側腿向前,第二半循環複用了第一半的腿部關係,袍擺遮擋進一步削弱了區別。而代碼是按 0…7 順序播放、沒丟幀的 —— 所以幀數和播放速度的測試全過,它們根本證不了動作正確。修法是重畫素材:用明確標了近/遠腿的骨架引導重新生成,近側腿淺青、遠側腿較暗、袍擺打開露出支撐與擺動,另在動作預覽裡加一個「兩次落腳對照」當視覺回歸。沒有用人物左右鏡像去偽裝換腿。
- 合成事件騙過了多點觸控測試(v0.2.0)。最初用合成
PointerEvent驗證「同時移動與跳躍」,但瀏覽器根本沒拿到真實指針捕獲。改成 CDP 真多觸點重驗,沒有為了讓測試好過而削弱實際輸入邏輯。 - 同一幀裡死亡被檢查點治療蓋掉(v0.2.0)。致命傷和檢查點激活排在同一個更新步,玩家可以帶著 0 氣血從燈上站起來。加了終止階段檢查和一項回歸測試。
- 跳躍高度湊不出關卡(v0.2.0)。最長跳躍上不去最高平台,於是補了跳躍高度與平台可達性測試 —— 那個被反覆引用的「122px 平台可達」就是這麼來的,先有測不出來的關卡,才有測試。
美術是逐張生成出來的

v0.3.0 換細繪秦陵美術,五張 WebP 合計約 1.72 MiB;v0.3.1 又換成八幀跑步 + 六幀揮劍兩張圖集(670,242 字節),原本單獨的出劍圖不再載入。到今天運行時實際載入 6 張、2.14 MiB。跑步固定 144 世界單位一循環,265 速度下約 543ms;揮劍複用原有 190ms 攻擊計時,冷卻剩餘時間顯示收招。
兩件事做得算老實:
- 每張圖的生成與編輯提示詞、引導圖位置都留在
art-source/*-manifest.json裡,scripts/package-art.mjs只做機械包裝 —— 也就是「這張圖當初讓模型畫什麼」是可回查的,不是生成完就扔 - 定幀是按實測透明區域和腳底位置算的,不是把圖集均分再拉伸。v0.3.2 換跑步圖時這條救了一次:腳底註冊、人體比例、骨盆錨點都得隨新圖實測重標,均分網格會直接讓人物在地面上漂浮
版本記錄
六個包全在 2026-10-27 這一天,時間取 release/*.zip 的實際構建時間,從 09:55 到 12:52。
翻牌地牢首版,94,495 字節。九宮石牌、三間墓室、敵人意圖與回合結算、出口與守印條件、完整勝敗與重開、中英文、歷史成績、存儲降級、局內事件導出。18 項規則與存儲測試,構建產物約 301 KB(JavaScript 272 KB + CSS 28 KB),沒有外部字體或圖片請求。
橫版「驪山試煉」原型,112,808 字節。固定時間步物理、可變高度跳躍、三段連擊、耗體力衝刺、蓄力預警、弩箭、地刺、檢查點、守印戰。33 項測試(橫版 15 項 + 舊翻牌與存儲 18 項)。同一天調了跳躍速度、補了平台可達測試、把觸控驗證從合成事件換成 CDP 真多觸點。
秦陵美術上線,1,916,255 字節 —— 比上一版大十七倍,漲的全是圖。新增資源載入進度、解碼完成後才開始、失敗可重試。物理、傷害、敵人行為和關卡碰撞數據一行沒動。
主角動作小樣,2,588,767 字節。八幀跑步 + 六幀揮劍接進關卡,連擊、傷害、敵人和碰撞規則保持原樣。新增 ?prototype=motion 獨立預覽:原速、四分之一慢放、暫停、逐幀、左右朝向,同時顯示實機尺寸和兩倍尺寸。
跑步雙腿交替修正,2,983,592 字節。骨架引導重畫 v2 跑步圖,未用鏡像偽造換腿。這一版只針對「同一條腿重複支撐」這一個具體問題,沒做真人手感或手機性能結論。
故事主頁,2,991,932 字節。根頁面換成主頁,橫版關卡挪到 ?play=1,動作與翻牌預覽各自保留查詢入口。正文來自 src/config/story.ts 的原設定,整理後存進 src/config/homeStory.ts;原對白沒確認師兄生死,主頁同樣留著懸念。首頁不播音頻,正文是可訪問 HTML,提供跳至正文、焦點樣式、響應式和減少動態效果樣式。
還沒解決的
- 只有一關。 第二關、召喚、NPC 對話、後續劇情全沒做,主頁上也明寫「目前可玩單關原型」
- 沒有真人試玩過。 設計文檔第 9 節寫著「先做灰盒版,再找 5—10 位非項目參與者試遊」,一個人沒找。所以手感、難度、理解成本、重玩意願這幾個詞在這個項目裡目前還沒有含義
- 沒提交任何平台。 CrazyGames 是設計階段定的首個目標渠道,SDK、廣告、賬號、在線統計一概沒接,也沒有收款資格層面的任何動作
- 沒在真機上驗過。 手機驗證全部是本機 Chromium 的窄屏佈局加 CDP 觸點,不是 iPhone Safari 或 Android 瀏覽器
- 這個項目沒有 git 倉庫。 六個 zip 是唯一的版本快照,改壞了沒有回退點。實施清單最後一行就寫著「本目錄不是 Git 倉庫,本輪不初始化倉庫或生成提交」
- 美術仍是 AI 逐幀小樣。 衣紋、劍形和姿態銜接的跳變在慢放下看得到,沒做專業逐幀精修;三段連擊目前共用同一套揮劍動作;原傷害窗口在蓄力繪製期間也可能命中,這輪沒改規則
- 自動通關路線跑通過,但那是腳本不是玩家。 驗證記錄自己標了「通關記錄的速度不代表真人時長」
怎麼跑
需要 Node.js 20.19+ 或 22.12+(本次用的 24)。npm install 之後 npm run dev;npm test 跑 33 項,npm run build 做類型檢查和靜態構建。生產包必須通過 HTTP 訪問,雙擊 HTML 用 file:// 跑不起來。
現在有了在線地址:https://xuguopeng.com/qin-dungeon/,也就是上面那顆按鈕。它是純靜態託管 —— 沒有後台、沒有賬號、沒有排行榜,進度不落服務器,file:// 跑不起來這件事也沒有變。線上跑的還是 v0.4.0 那個包,和本機同一份代碼,為了掛上線只改了構建基准(--base=/qin-dungeon/),遊戲邏輯一行沒動。實測載入量:主頁首屏 518 KiB(HTML + CSS + 主 JS 271 KiB,外加秦陵全景那張 248 KiB),從主頁點進第一關再拉另外五張圖 1.9 MiB,六張圖合計 2.14 MiB。