Collision ja - Akiaaaa20/Bit8_CLI GitHub Wiki
Collision システム
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 を判定します。
移動は次の順序で処理されます。
- X 軸
- 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 を使用して、ゲームに必要な移動処理を実装できます。
次へ
次のページ:
関連ドキュメント:
Collision は、Node がどこへ移動できるかを決定します。