Collision ja - Akiaaaa20/Bit8_CLI GitHub Wiki

Collision システム

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

BIT8_CLI は、Tile ベースの 2D ゲーム向けに軽量な Collision システムを提供します。

BIT8_CLI 0.1.0 では、Node は Solid Tile と対応する Collider データを使用して障害物を検出し、Collision を考慮した移動を実行できます。

このシステムは、完全な物理シミュレーションではなく、シンプルで予測可能な移動処理を目的としています。

1. Collision の概要

Collision システムは、主に次の 3 つの要素で構成されます。

  • Solid Tile: 移動を妨げる Map Tile
  • Node Collider: Node に関連付けられた任意の Collision Geometry
  • Movement API: 移動の確認と実行に使用するメソッド

主な Node メソッド:

self:collide(dx, dy)
self:move(dx, dy)

これらのメソッドを使用して、Node Script から Collision World を操作できます。

2. Solid Tile

Tile は Asset Registry を通じて Solid に設定できます。

Asset Registry は次のファイルに保存されます。

bit8.assets.toml

例:

solid = [6]

これは、対応する Tilesheet の 6 番目の Tile を Solid として指定します。

このコードは設定の一部分であり、完全な Registry ファイルではありません。

Solid Tile は Collision 判定において、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 の移動には World Pixel 座標が使用されるため、Tile Grid より細かい単位で移動できます。

4. Node Collider

Node には任意の Collider 情報を設定できます。

Collider は Node に関連付けられた Collision Geometry を定義します。

Runtime は、対応する Collision Geometry に基づいて移動を判定できます。

Collider の設定は Node の Map データとともに保存されます。

対応する Collider プロパティとファイル形式の詳細については、0.1.0 の実装を確認してください。

5. Collision の確認

移動時の Collision を確認するには、次のメソッドを使用します。

self:collide(dx, dy)

例:

func update()
    if self:collide(1, 0) then
        -- 右方向への移動が妨げられています。
    end
end

引数は、確認したい移動量を表します。

このメソッドは Collision を確認するだけで、Node の位置を変更しません。

6. Collision を考慮した移動

Collision を考慮して Node を移動させるには、次のメソッドを使用します。

self:move(dx, dy)

例:

func update()
    self:move(1, 0)
end

このコードは Node を右に 1 ピクセル移動させようとします。

Collision によって移動が妨げられた場合、実際の移動量は要求した値より小さくなることがあります。

7. 移動の処理順序

BIT8_CLI 0.1.0 は、1 ピクセルずつ段階的に Collision を判定します。

移動は次の順序で処理されます。

  1. X 軸
  2. Y 軸

例:

self:move(3, 2)

Runtime は最初に水平方向の移動を試み、その後垂直方向の移動を処理します。

各軸の移動は、ピクセル単位で判定されます。

この方式は軽量な Tile ベースの移動処理に適しています。

8. Collision Query と Movement

2 つのメソッドには異なる役割があります。

メソッド 用途 位置の変更
self:collide(dx, dy) 移動時の Collision を確認 しない
self:move(dx, dy) Collision を考慮して移動を試みる 移動可能な場合に変更

単純な移動では、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

このコードは、4 方向への基本的な Collision 対応移動を実装します。

この例では、Script が適切な Collision 設定を持つ Node に関連付けられていることを前提とします。

10. 座標の直接変更

Node は座標を直接変更することもできます。

self.x = self.x + 1

ただし、座標の直接変更と次のメソッドは異なります。

self:move(1, 0)

障害物によって移動を制限したい場合は、Collision を考慮した移動を使用してください。

意図的に Node の位置を変更する場合は、座標を直接設定できます。

11. Collision と Map

Collision データは Map と密接に関係しています。

Map は Tile データを保持し、Asset Registry は登録済み Tile のうち、どれが Solid であるかを定義します。

Node は Collision Query や移動処理でこれらの情報を使用します。

詳しくは Maps と Assets and Tilesheets を参照してください。

12. 現在の制限

BIT8_CLI 0.1.0 は軽量な Collision システムを提供します。

完全な Physics Engine ではありません。

現在の Collision モデルには、次の機能は含まれていません。

  • 完全な Rigid Body Dynamics
  • 物理エンジンによる自動重力シミュレーション
  • 現実的な力や運動量の計算
  • 汎用物理フレームワークとしての高度な Collision Shape

開発者は Node Script を使用して、ゲームに必要な移動処理を実装できます。

次へ

次のページ:

Camera

関連ドキュメント:

Collision は、Node がどこへ移動できるかを決定します。