アットウィキロゴ

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