当たり判定
2つの矩形が重なっているかどうかを調べます。
矩形同士の重なり
キャラクターの当たり判定は、多くの場合、画面に平行な矩形(左上の座標と幅・高さ)で表します。2つの矩形AとBは、次の4つの条件をすべて満たすときに重なっています。
- Aの左端 < Bの右端
- Bの左端 < Aの右端
- Aの上端 < Bの下端
- Bの上端 < Aの下端
どれか1つでも満たさなければ、重なっていません。満たさない条件が見つかった時点で判定を打ち切れるので、多くの場合は最初の1つか2つで判定が終わります。
判定のサブルーチン
; 矩形Aと矩形Bの当たり判定(座標・大きさはすべて符号なし16ビット)
; A: $20 = X、$22 = Y、$24 = 幅、$26 = 高さ
; B: $28 = X、$2A = Y、$2C = 幅、$2E = 高さ
; 重なっていればキャリーをセット、重なっていなければクリアして返る
CheckHit:
REP #$20
LDA $20
CLC
ADC $24 ; Aの右端
CMP $28
BEQ .miss
BCC .miss ; Aの右端 <= Bの左端 なら重ならない
LDA $28
CLC
ADC $2C ; Bの右端
CMP $20
BEQ .miss
BCC .miss ; Bの右端 <= Aの左端
LDA $22
CLC
ADC $26 ; Aの下端
CMP $2A
BEQ .miss
BCC .miss ; Aの下端 <= Bの上端
LDA $2A
CLC
ADC $2E ; Bの下端
CMP $22
BEQ .miss
BCC .miss ; Bの下端 <= Aの上端
SEC ; すべての条件を満たした: 重なっている
RTS
.miss
CLC
RTS
呼び出した側では、BCS命令で結果を判定します。
JSR CheckHit
BCS .hit
注意
- 座標が画面外などで大きな値になり、右端・下端の計算が$FFFFを越えると、正しく判定できません。座標の範囲に余裕を持たせるか、比較の前にあふれをチェックしてください。
- たくさんのキャラクター同士を総当たりで判定すると、処理時間が数の2乗で増えます。画面を区画に分けて、近くにいるものだけを判定するなどの工夫が必要になります。