マリオのように見分ける、踏みつけとぶつかり
ジャンプのレッスンの四角と、それに向かって歩いてくるもの。上から降りればそれは潰れ、歩いてぶつかれば四角は最初の場所へ戻される。プログラムは 767 バイトの命令 350 個で、作り方も確かめ方も同じだ。
ここで遊ぶ カートリッジ。NES のカートリッジを遊べるところならどこでも遊べる: stomp.nes
画面の上では
上から落ちてくれば踏みつけ、それ以外はぶつかり
スーパーマリオブラザーズで、敵を持つ枠とマリオの状態を持つバイトを見て、どちらかが変わる前のフレームでマリオと敵がどこにいたかを読んだ。クリボーに乗ったのは、マリオが落ちていて敵より上にいたとき。歩いてぶつかったのは、マリオが地面の上で敵の隣にいたとき。このカートリッジも同じように決める: 二つの四角が重なったら、四角が落ちていて、二つのうち高いほうかを問う。
| このカートリッジ | スーパーマリオブラザーズ | |
|---|---|---|
| 歩くものの速さ、1 フレームあたりのピクセル | 0.5 | 0.5 |
| 踏みつけ: 前のフレームの横と縦のずれ | 6、19 | 6、18 |
| 踏みつけ: プレイヤーの下向きの速さ、前と後 | 4、-4 | 4.38、-4 |
| 歩くものが潰れている間のフレーム数 | 25 | 25 |
| ぶつかり: 前のフレームの横と縦のずれ | 14、0 | 8、8 |
| ぶつかり: 何が変わったか | 四角が最初の場所に戻る | プレイヤーの状態が 8 から 11 に |
解剖がそれについて言ったこと
このカートリッジを解剖すると、二つの位置を比べるルーチンとして compare_C1B8 が一つ印された。横は $0011,$0060、縦は $0015,$0064: 四角と歩くものの位置だ。下に touch と書いたルーチンがそれだ。
書いたとおりに
このレッスンが扱うプログラムの部分。プログラム全体は、ただのテキストファイルだ: stomp.s
;; Touching: the two 16-pixel squares overlap when they are less than
;; 14 pixels apart across and 16 down. Then, if the square is falling
;; and is the higher of the two, it is a stomp; otherwise a hit.
touch:
LDA $62
BNE apart
SEC
LDA $11
SBC $60
BPL across
EOR #$FF
CLC
ADC #$01
across:
CMP #$0E
BCS apart
SEC
LDA $15
SBC $64
STA $04
BPL down
EOR #$FF
CLC
ADC #$01
down:
CMP #$10
BCS apart
LDA $17
BMI hit
ORA $16
BEQ hit
LDA $04
BPL hit
LDA #$04
STA $62
LDA #$19
STA $63
LDA #$00
STA $16
LDA #$FC
STA $17
LDA #$01
STA $03
INC $66
apart:
RTS