這款方塊遊戲現在能飛了——我實測全程 0 次網路請求,然後在原始碼裡讀到一句話

體素世界 VoxelWorld 飛行畫面:方塊主角懸停在河谷上空,下方是清澈河道、石岸與整片樹林
體素世界 VoxelWorld,飛行中。畫面左上角的座標顯示高度 36,下方是程式即時生成的河谷。本文所有遊戲畫面皆為實機截圖。

《體素世界》更新了。現在主角看得見、而且能飛。我把新版從頭玩過一遍,也把那個 837 KB 的網頁檔整份讀完——結果最值得寫的,不是新加的飛行,而是開發者刻意「不」改掉的那幾件事。

先解決最多人卡住的一件事:V 不是飛行鍵

如果你聽說「可以按 V」就進去亂按,會發現自己沒有飛起來。因為 V 是切換視角,飛行是另一個動作。這兩件事剛好同時更新,很容易被講成同一件。

V 會在三段視角之間循環:第一人稱 → 第三人稱・背後 → 第三人稱・正面。換句話說,V 解決的是「我想看到自己」,不是「我想飛起來」。

體素世界第一人稱畫面:畫面下方是手持的草地方塊,快捷欄列出草地、泥土、石頭等十種方塊
按 V 之前:第一人稱,畫面下緣是手裡拿著的草地方塊。
體素世界第三人稱畫面:按 V 之後可以看到藍衣方塊主角的背影站在鵝卵石地面上
按 V 一次之後:第三人稱・背後,主角現身。再按一次會轉到正面。

飛行的開法是連按兩下空白鍵,而且只在創造模式有效。這是體素沙盒類遊戲的共同慣例,原始碼註解裡也直接寫了「沿用體素沙盒的慣例」——不自創一套,玩過類似遊戲的人就不用重學。

完整操作表(鍵盤)
移動
W A S D | Shift 衝刺 | 空白鍵 跳/游泳
飛行
雙擊空白鍵(限創造模式)|飛行中:空白鍵上升、Shift 下降
視角
V 三段視角循環|C 自由環繞鏡頭|⌥+滾輪 或 [ ] 拉遠拉近
建造
左鍵/R 放方塊 | 右鍵/F 挖方塊 | 1–0 或滾輪 換方塊 | Tab 快捷欄分頁
其他
B 換男/女主角 | E 背包 | G 創造/生存切換 | T 時段 | M 靜音 | Esc 設定
手機版把鍵盤才有的功能做成左上角一排觸控按鈕(背包、飛行、視角、環繞、主角、模式、方塊頁、拉遠拉近),右下角則是挖/跳/放,飛行時「跳」會變成「升」並多出一顆「降」。

飛行:它故意讓你撞得到牆

實際飛起來之後,第一個感覺是「怎麼會卡到樹」。我一開始以為是 bug,去翻原始碼才發現這是刻意的:

原始碼註解(voxel-world.html)

/* 飛行(只在創造模式)。雙擊空白鍵開關,沿用體素沙盒的慣例。
   飛行時仍然會撞到方塊——能穿牆的話等於把整個世界的碰撞都關掉了。 */

這句話講的是一個很實際的取捨:飛行如果順便開穿牆,整個世界的物理就等於被關掉了,蓋出來的房子、挖出來的洞穴全部失去意義。所以它讓你飛,但你還是得繞過樹。

飛行的幾個實際數字(取自程式碼)
水平速度
飛行 10.5 / 地面走路 4.55(衝刺再 +2.75)/ 水中 3.3
垂直速度
按住空白鍵或 Shift 時,垂直速度趨近 8.5
高度上限
Y = 150(世界高度是 48,所以實際上飛不出上限)
重力
飛行時為 0 / 水中 7.0 / 陸地約 26
切回生存
按 G 切到生存模式會自動落地,不會讓你帶著飛行能力進戰鬥
體素世界高空俯瞰:河谷地形、遠處懸在水面上的現代玻璃屋與紅磚廢墟
飛到高處往下看:程式生成的河谷、遠方懸在水面上的現代玻璃屋,右邊是紅磚廢墟。整張地圖有三個地標可以找。

真正值得看的,是它「拒絕」改掉的東西

新增功能最容易犯的錯,是順手把舊的操作也一起改掉。這份程式碼裡有兩處註解,明白寫著為什麼不這麼做。

關於 C 為什麼不併進 V

/* C:自由環繞鏡頭。刻意不塞進 V 的循環——V 的三段是既有操作,
   多一段就會改變玩家已經習慣的按鍵節奏。 */

關於滾輪為什麼不改

拉遠拉近:Alt/⌥ + 滾輪,或 [ ]。
滾輪本身維持 v1 的「換方塊」不動——那是既有操作,不能因為加功能就改掉。

「不能因為加功能就改掉既有操作」——這句話寫在一個免費小遊戲的註解裡,比很多正式軟體的規格書還清楚。

還有第三個例子。這一版加了生存模式,但預設仍然是創造模式,註解解釋了原因:曾經把預設改成生存,結果「一進去快捷欄是空的、什麼都放不了,看起來就像壞了」。加東西不該把原本的玩法換掉——所以生存模式被放在 G 鍵後面,想玩的人自己切。

生存模式:怪物只在暗的地方生成,所以蓋房子第一次有了意義

按 G 切到生存模式,規則就變了:方塊要自己挖、自己合成,血量會扣,天黑之後暗處會冒出東西。

關鍵在「暗處」兩個字。敵人的生成條件不是隨機亂灑,而是直接讀取光照場:亮度 = max(天光 × 當下日照,方塊光),夠暗才生成。這帶來一個很漂亮的連鎖效果:

光照規則造成的實際差別
入夜的戶外
天光降到最低,整片變暗 → 會冒出東西
點了螢光石的地下屋
方塊光是滿的 → 永遠不生成
燈被打掉
安全區消失 → 原本安全的房間開始生成
天花板被挖穿
白天天光灌進來更亮;但入夜之後,那個洞就成了破口
也就是說,房子不再只是裝飾——它是一個用光照計算出來的安全區。日夜一輪是 600 秒(10 分鐘),場上敵人數上限 14。
體素世界生存模式夜晚畫面:紫色傳送門發光、遠處紅磚廢墟被燈照亮,HUD 顯示敵人數與亮度值
生存模式的夜晚。紫色的是用黑曜岩圍出來的傳送門,遠處紅磚廢墟被燈照亮。左上角 HUD 直接顯示「敵人 2」與「亮度 0.06」——亮度就是決定會不會生成的那個數字。

連敵人的眼睛都是有理由的。牠的身體吃光照,在全黑的夜裡會整個隱形;但眼睛被刻意設成不吃光的材質,註解寫著:「在全黑的夜裡,兩點紅光是唯一看得到牠的方式」。而且為了讓紅色在色調映射之後還留得住,程式刻意壓低綠藍、把紅推到過曝——這是一個為了「玩家看得見」而做的顏色工程,不是美術隨手挑的色票。

我實際測到的數字

我用自動化瀏覽器把這一版完整跑了一遍,順便記錄了幾個可以驗證的數字:

實測結果(2026 年 9 月 18 日)
網路請求
整場只有 1 次——就是那個 HTML 檔本身。開始遊戲之後到結束,追加請求 0 次。
檔案大小
837 KB,單一 HTML。three.js r128 引擎、全部貼圖與音效產生器都在裡面。
世界規模
128 × 48 × 128 個方塊,切成 64 個分塊。
貼圖來源
程式即時生成 1024² 的 PBR 貼圖圖集 ×3(顏色/法線/ORM),沒有任何一張是外部圖檔。
載入方式
把烤貼圖、生地形、建網格切成一百多個小任務,每幀做滿 14 毫秒就把控制權交還瀏覽器——所以進度條會動,分頁不會凍住。
本機儲存
localStorage 只寫一個值:你選的是男主角還是女主角。

「0 次網路請求」這件事的意思是:你在裡面走到哪、挖了什麼、蓋了什麼,沒有任何一個位元組離開你的瀏覽器。不是因為它承諾不傳,而是它根本沒有可以傳的對象。

一件必須講清楚的事:這不等於「可以離線玩」

我檢查過,這個檔案沒有註冊 Service Worker,也沒有 PWA manifest。所以第一次開啟仍然需要網路把那 837 KB 抓下來,關掉分頁再開也需要(除非剛好命中瀏覽器快取)。真正成立的說法是「載入完成之後,遊玩過程不再連線」,而不是「可以離線使用」。這兩句話差很多,不該混著講。

為什麼我覺得這比遊戲本身更值得給孩子看

這個站是我們用 AI 協作做出來的實驗品,三款遊戲都是(我在 七月那篇實測裡把三款都玩過一輪,也在裡面死了三次)。但真正的教材不是遊戲畫面,是原始碼裡那些用中文寫的「為什麼」。

在瀏覽器按右鍵「檢視網頁原始碼」,你會看到的不是一堆看不懂的符號,而是一段一段解釋「這裡為什麼這樣做」的說明:為什麼世界要用 Uint8Array 而不是字典(128³ 用字串鍵會吃掉上百 MB)、為什麼貼圖每格要留 8 像素的邊(不留的話 mipmap 會讓鄰格顏色互相滲色)、為什麼改一個方塊只重建那一塊(v1 是整個世界重建,所以會卡)。

對正在學程式或正在學英文的孩子來說,這是兩件事同時發生:一邊是看得懂的中文因果推理,一邊是 albedo、normal、ORM、mipmap、ambient occlusion 這些真的會出現在職場上的技術英文。背單字表學不到它們,把一個自己玩過的遊戲拆開來看就會記得。

而那句「不能因為加功能就改掉既有操作」,其實不只適用於遊戲。它適用於任何一個要被別人使用的東西。

怎麼玩

體素世界 VoxelWorld
需要安裝嗎
不用。開網頁就是遊戲本體,不需要註冊、不需要帳號。
裝置
電腦鍵盤滑鼠操作最完整;手機有對應的觸控按鈕。
第一次進去建議
先按 V 看到自己 → 雙擊空白鍵飛起來 → 按 C 從旁邊看自己飛 → 找完三個地標之後,再按 G 切生存模式試試看晚上。
配備需求
需要支援 WebGL 的瀏覽器。載入要跑幾秒鐘(它在現場生成所有貼圖),畫質可在開始畫面選高/中/低。
關於本文的查核

本文所有操作、數值與程式碼引文,均直接取自 2026 年 9 月 18 日當天線上版本的 voxel-world.html,並以自動化瀏覽器實際執行驗證。網路請求次數、世界尺寸、載入行為皆為實測,非引述宣傳文案。

文中所有遊戲畫面均為實機截圖,未經修圖,也未使用任何 AI 生成影像。畫面中的 HUD 數值(座標、fps、敵人數、亮度)為當下真實數值。

遊戲引擎為 three.js r128(MIT License),完整授權條文內嵌於該檔案中。遊戲內容仍在持續更新,實際操作請以當下版本開始畫面所列的說明為準。

關於這個站

這些遊戲是我們在宿霧做的教學實驗:先讓孩子玩,再讓他打開原始碼看看裡面在寫什麼。從玩家變成創造者,中間隔的通常不是天份,是有沒有人把蓋子掀開給他看過一次。

發佈留言

返回頂端