Collision zh TW - Akiaaaa20/Bit8_CLI GitHub Wiki

Collision 碰撞系統

English | 繁體中文 | 日本語 | 한국어

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 像素的步進方式處理碰撞感知移動。

處理順序為:

  1. X 軸
  2. 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 自行實作遊戲需要的移動行為。

下一步

繼續閱讀:

Camera

相關文件:

Collision 決定 Node 可以走到哪裡。