Overlap
Playdateの衝突判定システムにおいて、overlap(オーバーラップ)は「衝突は検知するが、相手を通り抜ける」という挙動を指します。
物理的な壁のように移動を制限するのではなく、アイテムの回収、ゴール地点への到達、ダメージ判定(攻撃が当たったか)などに最適です。
概要
## 1. オーバーラップの設定方法
スプライトの衝突レスポンスとして "overlap"(または定数 kCollisionTypeOverlap)を返すように設定します。
```lua
function Player:collisionResponse(other)
if other:isa(Item) or other:isa(TriggerZone) then
return "overlap"
end
return "slide" -- 壁などは滑る設定
end
```
## 2. 移動中のオーバーラップ検知
moveWithCollisions を呼び出した際、戻り値の collisions リストにオーバーラップした情報も含まれます。
```lua
local actualX, actualY, collisions, len = player:moveWithCollisions(newX, newY)
for i=1, len do
local col = collisions[i]
if col.type == "overlap" then
-- 相手のスプライトが何かを判定して処理
if col.other:isa(Coin) then
col.other:collect() -- コインを拾う処理
end
end
end
```
ポイント:** overlap を選択した場合、actualX と actualY は衝突がなかったかのように、目的地の座標がそのまま返されます。
## 3. 瞬間的なオーバーラップ検知 (Query)
「移動」を伴わずに、今その場所に何が重なっているかを調べたい場合は、**Query(クエリ)関数**を使用します。これは弾の当たり判定や、爆発の範囲内にいる敵を探す際に便利です。
### 指定した矩形内のスプライトを取得
```lua
- 指定した範囲 (x, y, width, height) に重なっているスプライトを取得
local overlaps = playdate.graphics.sprite.allOverlappingSprites() -- 全体の重なり
local sprites = playdate.graphics.sprite.querySpritesInRect(x, y, w, h)
```
### 指定したスプライトと重なっているものを取得
```lua
local overlappingSprites = mySprite:overlappingSprites()
for _, other in ipairs(overlappingSprites) do
print("重なっています: " .. other:getTag())
end
```
## 4. オーバーラップを活用する主なケース
| ケース |
理由 |
| --- |
--- |
| **コイン・パワーアップ** |
プレイヤーが触れても移動を止めたくないため。 |
| **チェックポイント・ゴール** |
通過したことだけを知りたいため。 |
| **近接攻撃のヒットボックス** |
攻撃アニメーション中に特定の範囲に敵がいるか判定するため。 |
| **水や毒の沼** |
侵入はできるが、中にいる間だけデバフをかけるため。 |
## 5. パフォーマンスのヒント
1. **判定の絞り込み:** overlap 判定が必要なスプライトが多い場合、sprite:setGroups() と sprite:setCollidesWithGroups() を使って、不要なスプライト同士の判定をスキップしてください。
2. **静的なトリガー:** 動かないトリガー(スイッチなど)は、毎フレーム moveWithCollisions でチェックするよりも、プレイヤーが動いた時だけその座標で querySpritesInRect を行う方が効率的な場合があります。
3. **Spriteのタグ利用:** sprite:setTag(n) でタグを付けておくと、other:getTag() で高速に種類を判別できます(isa によるクラス判定よりも若干高速です)。
[!NOTE]
overlap は「センサー」のような役割を果たします。[[Playdate SDK]]の衝突系関数は、これらを物理的な壁(slide/freeze)と全く同じコード体系で扱えるため、非常にシンプルに実装できるのが特徴です。
関連ページ
最終更新:2026年04月30日 11:44