当たり判定

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乗で増えます。画面を区画に分けて、近くにいるものだけを判定するなどの工夫が必要になります。

参照

CMP命令
BCC命令
多倍長の加減算と比較