マリオのものと同じ、絵の内側の箱
踏みつけのレッスンの四角と歩き手に、触れたかを決めるものを見えるようにした。Select を押すとそれぞれの箱が見える。そのまま歩き手に歩いてぶつかってみてほしい: 先に絵が重なり、箱が重なるまでは何も起きない。プログラムは 853 バイトの命令 397 個で、作り方も確かめ方も同じだ。
ここで遊ぶ 机の上で変えてみる カートリッジ。NES のカートリッジを遊べるところならどこでも遊べる: hitbox.nes
画面の上では
触れるものは、見えるものより小さい
スーパーマリオブラザーズは、マリオにひとつ、敵のそれぞれにひとつ、四つの辺からなる箱を持ち、毎フレーム、そのものの位置からメモリに書き込む。動いているゲームからそれを読み取った。マリオの箱は絵の両脇から 3 ピクセル内側、上から 4 ピクセル下、下端は絵の下端まで。クリボーの箱は絵の真ん中を横切る帯で、上から 6 ピクセル下、下から 4 ピクセル上。マリオがクリボーに歩いてぶつかったとき、二つの絵は箱が重なる一フレーム前にすでに重なっていて、ぶつかりは箱が重なってはじめて起きた。このカートリッジも同じやり方で、その数で箱を持つ。
| このカートリッジ | スーパーマリオブラザーズ | |
|---|---|---|
| プレイヤーの箱、絵からの内側: 左、上、右、下 | 3、4、3、0 | 3、4、3、0 |
| 歩き手の箱、絵からの内側 | 3、6、3、4 | 4、6、2、4 |
| 最初の触れ: 分かる一フレーム前に、絵が重なっていた幅、横と縦 | 4、16 | 8、16 |
| そして箱が重なっていた幅 | まだで、2 離れている | 2、6 |
| 箱は重ならずに絵だけが重なっていたフレーム数 | 2 | 3 |
| 触れたと分かるのは | 箱が重なったそのフレーム | 箱が重なった次のフレーム |
書いたとおりに
このレッスンが扱うプログラムの部分。プログラム全体は、ただのテキストファイルだ: hitbox.s
;; The boxes, from the positions, every frame: the square's is 3 in from
;; each side and 4 down from the top of its picture, to its bottom; the
;; walker's is 3 in from each side, 6 down from the top and 4 up from
;; the bottom. The right and bottom edges are one past the last pixel,
;; so two boxes touch when each left edge is before the other's right.
boxes:
LDA $11
CLC
ADC #$03
STA $70
ADC #$0A
STA $72
LDA $15
CLC
ADC #$04
STA $71
ADC #$0C
STA $73
LDA $60
CLC
ADC #$03
STA $74
ADC #$0A
STA $76
LDA $64
CLC
ADC #$06
STA $75
ADC #$06
STA $77
RTS
;; Touching: the two boxes overlap when each one's left edge is before
;; the other's right, and each one's top is above the other's bottom.
;; Then the square goes back to where it started, the walker to the
;; right edge, and a touch is counted. When only the pictures overlap
;; (closer than 16 apart both ways) the frame is counted too, and
;; nothing else happens.
touch:
LDA $70
CMP $76
BCS apart
LDA $74
CMP $72
BCS apart
LDA $71
CMP $77
BCS apart
LDA $75
CMP $73
BCS apart
JMP hit
apart:
SEC
LDA $11
SBC $60
BPL across
EOR #$FF
CLC
ADC #$01
across:
CMP #$10
BCS clear2
SEC
LDA $15
SBC $64
BPL down
EOR #$FF
CLC
ADC #$01
down:
CMP #$10
BCS clear2
INC $67
clear2:
RTS
hit:
LDA #$28
STA $11
LDA #$B0
STA $15
LDA #$F0
STA $60
LDA #$00
STA $61
STA $10
STA $12
STA $13
STA $14
STA $16
STA $17
STA $03
INC $65
RTSこの前は: マリオのように見分ける、踏みつけとぶつかり