Collision zh TW - Akiaaaa20/Bit8_CLI GitHub Wiki
Collision 碰撞系統
BIT8_CLI 提供適合 Tile-based 2D 遊戲的輕量化碰撞系統。
在 BIT8_CLI 0.1.0 中,Node 可以透過 Solid Tile 和支援的 Collider 資料,檢查障礙物並執行碰撞感知移動。
這套系統著重於簡單、可預測的移動行為,而不是完整的物理模擬。
1. Collision 概述
Collision 系統主要連接三個組件:
- Solid Tile: 會阻擋移動的 Map Tile。
- Node Collider: 與 Node 關聯的選用碰撞區域。
- Movement API: 用於檢查與執行移動的方法。
主要的 Node 方法:
self:collide(dx, dy)
self:move(dx, dy)
這些方法讓 Node Script 可以與碰撞世界互動。
2. Solid Tile
可以透過 Asset Registry 將 Tile 設定為 Solid。
Asset Registry 儲存在:
bit8.assets.toml
例如:
solid = [6]
這會將對應 Tilesheet 的第六個 Tile 標記為 Solid。
這只是設定片段,不是完整的 Registry 檔案。
Solid Tile 在碰撞判定時會占據完整的 8×8 像素區域。
3. Tile 座標與 Collision
BIT8_CLI 使用 8×8 像素 Tile。
例如:
Tile (0, 0) → Pixels (0–7, 0–7)
Tile (1, 0) → Pixels (8–15, 0–7)
Tile (0, 1) → Pixels (0–7, 8–15)
Solid Tile 會阻擋物件進入它所占據的區域。
Node 移動使用世界像素座標,因此可以比 Tile Grid 更精細地移動。
4. Node Collider
Node 可以包含選用的 Collider 資訊。
Collider 定義與 Node 關聯的碰撞幾何區域。
Runtime 可以利用支援的碰撞資料進行移動判定。
Collider 設定與 Node 的 Map 資料一起儲存。
實際支援的 Collider 屬性與檔案格式,應以 0.1.0 的實作為準。
5. 檢查 Collision
使用:
self:collide(dx, dy)
檢查預定的移動是否會發生碰撞。
例如:
func update()
if self:collide(1, 0) then
-- 右方的移動受到阻擋。
end
end
參數代表預定的移動偏移量。
碰撞查詢不會改變 Node 的位置。
6. Collision-Aware Movement
使用:
self:move(dx, dy)
在遵守支援的碰撞規則下嘗試移動。
例如:
func update()
self:move(1, 0)
end
這會嘗試讓 Node 向右移動 1 像素。
如果遇到障礙物,實際移動距離可能小於要求的距離。
7. 移動判定
BIT8_CLI 0.1.0 使用每次 1 像素的步進方式處理碰撞感知移動。
處理順序為:
- X 軸
- Y 軸
例如:
self:move(3, 2)
Runtime 會先嘗試水平移動,再處理垂直移動。
每個方向都會透過像素級步進進行判定。
這種方式適合輕量化 Tile-based Movement。
8. Collision Query 與 Movement
兩個方法有不同用途。
| 方法 | 用途 | 是否改變位置 |
|---|---|---|
self:collide(dx, dy) |
檢查預定移動 | 否 |
self:move(dx, dy) |
嘗試碰撞感知移動 | 可以移動時會改變 |
單純的移動通常可以直接使用 self:move()。
如果遊戲邏輯需要先檢查障礙物,再決定後續行為,就可以使用 self:collide()。
9. 範例:玩家移動
以下範例使用方向輸入常數:
func update()
if btn(LEFT) then
self:move(-1, 0)
end
if btn(RIGHT) then
self:move(1, 0)
end
if btn(UP) then
self:move(0, -1)
end
if btn(DOWN) then
self:move(0, 1)
end
end
這提供基本的四方向碰撞感知移動。
範例假設 Script 已經關聯至適當設定的 Node。
10. 直接修改位置
Node 也可以直接修改座標:
self.x = self.x + 1
但直接修改位置與呼叫:
self:move(1, 0)
並不相同。
當障礙物應該影響 Node 的移動時,應使用碰撞感知移動。
如果需要刻意重新定位物件,可以直接修改座標。
11. Collision 與 Map
Collision 資料與 Map 密切相關。
Map 儲存 Tile 資料,Asset Registry 則識別哪些已註冊 Tile 是 Solid。
Node 會在碰撞查詢和移動過程中使用這些資訊。
詳細資訊請閱讀 Map 與 Asset 與 Tilesheet。
12. 目前限制
BIT8_CLI 0.1.0 提供輕量化碰撞系統。
它不是完整的 Physics Engine。
目前已確立的碰撞模型不包含:
- 完整的 Rigid Body Dynamics
- 自動物理重力模擬
- 真實物理力量與動量
- 通用物理框架中的進階碰撞形狀
開發者可以透過 Node Script 自行實作遊戲需要的移動行為。
下一步
繼續閱讀:
相關文件:
Collision 決定 Node 可以走到哪裡。