NEStinymachines

マリオのように見分ける、踏みつけとぶつかり

ジャンプのレッスンの四角と、それに向かって歩いてくるもの。上から降りればそれは潰れ、歩いてぶつかれば四角は最初の場所へ戻される。プログラムは 767 バイトの命令 350 個で、作り方も確かめ方も同じだ。

ここで遊ぶ カートリッジ。NES のカートリッジを遊べるところならどこでも遊べる: stomp.nes

画面の上では

フレーム 128
フレーム 128
フレーム 138
フレーム 138
フレーム 141
フレーム 141
フレーム 150
フレーム 150

上から落ちてくれば踏みつけ、それ以外はぶつかり

スーパーマリオブラザーズで、敵を持つ枠とマリオの状態を持つバイトを見て、どちらかが変わる前のフレームでマリオと敵がどこにいたかを読んだ。クリボーに乗ったのは、マリオが落ちていて敵より上にいたとき。歩いてぶつかったのは、マリオが地面の上で敵の隣にいたとき。このカートリッジも同じように決める: 二つの四角が重なったら、四角が落ちていて、二つのうち高いほうかを問う。

このカートリッジスーパーマリオブラザーズ
歩くものの速さ、1 フレームあたりのピクセル0.50.5
踏みつけ: 前のフレームの横と縦のずれ6、196、18
踏みつけ: プレイヤーの下向きの速さ、前と後4、-44.38、-4
歩くものが潰れている間のフレーム数2525
ぶつかり: 前のフレームの横と縦のずれ14、08、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

すべてのレッスン