アットウィキロゴ

衝突検知

ゲーム開発における「衝突検知(Collision Detection)」とは、ゲーム内のキャラクター、オブジェクト、地形などが、物理的に接触、あるいは交差した(当たった)かどうかを計算・検出する技術です。


概要

Playdate のゲーム開発における衝突検知は、主に playdate.graphics.sprite システムに組み込まれた機能を使用して行われます。
Playdate のエンジンは、矩形同士の判定(AABB: Axis-Aligned Bounding Box)をベースにした非常に軽量で強力な衝突検知アルゴリズム(有名なライブラリ「bump.lua」に近い仕組み)を採用しています。
1. 基本的な仕組み
衝突検知を有効にするには、スプライトに対して 「衝突判定用の矩形(Collide Rect)」を設定する必要があります。
sprite:setCollideRect(x, y, width, height)
スプライトの画像サイズとは別に、衝突判定を行う範囲を指定します。
sprite:removeCollideRect()
衝突判定を無効にします。

2. 移動と衝突の実行
Playdate では、単に座標を書き換えるのではなく、専用の移動メソッドを使うことで「壁にぶつかったら止まる」「滑る」といった挙動を自動で行います。
moveWithCollisions(goalX, goalY)
スプライトを目的の座標 (goalX, goalY) に向かって移動させ、途中で他のスプライトに衝突した場合は、後述する「衝突応答」に従って最終的な座標を計算します。
戻り値の説明は以下の通りです。
  • 1. actualX, actualY: 衝突を考慮した後の、実際に到達した座標
  • 2. collisions: 発生したすべての衝突情報のリスト
  • 3. length: 衝突した個数

3. 4つの衝突応答 (Collision Responses)
衝突した際にどのように振る舞うかは、sprite:collisionResponse(other) というコールバック関数を定義して、以下の4つの定数のいずれかを返すことで決定します。
定数 挙動 主な用途
kCollisionTypeFreeze 衝突した瞬間にその場で停止します (Block) 弾が壁に当たった時など
kCollisionTypeSlide 壁に沿って滑るように移動を続けます 最も一般的。プレイヤーの移動など
kCollisionTypeBounce 壁で跳ね返ります ボールや反射するギミック
kCollisionTypeOverlap 物理的な影響を与えず、重なりを許容します (→Overlap) アイテムの取得判定、トリガーエリア
4. 衝突のフィルタリング(Groups & Masks)
すべてのスプライト同士が衝突すると処理が重くなるため、グループとマスクを使って「何と何が当たるか」を制御できます。
sprite:setGroups(groups)
自身が所属するグループ(整数またはリスト)を設定。
  • sprite:setCollidesWithGroups(groups): 自身がどのグループと衝突するかを設定
  • タグ (sprite:setTag(n)): 衝突時に other:getTag() を呼び出すことで、相手が「敵」か「壁」かを判別するのに便利です

5. 高度な判定方法
移動を伴わない判定や、より詳細な情報が必要な場合に以下のメソッドが使われます。
sprite:checkCollisions(x, y)
実際に移動させずに、その場所に移動した場合の結果をシミュレーションします。
sprite:overlappingSprites()
現在そのスプライトと重なっているスプライトのリストを返します。
playdate.graphics.sprite.querySpritesAtPoint(x, y)
特定の点に存在するスプライトを検索します。
playdate.graphics.sprite.addWallSprites(tilemap, ...)
タイルマップから壁となるスプライトを一括生成します。

実装のヒント
パフォーマンス
Playdate は CPU リソースが限られているため、動かない背景などは addWallSprites を使い、動くものだけをスプライトとして管理するのが効率的です。
中心点 (Center)
setCenter(x, y) を変更している場合、moveWithCollisions が返す座標もその中心点に基づいたものになる点に注意してください。

関連ページ

最終更新:2026年05月01日 22:44