NEStinymachines

マリオのクリボーのように、壁でも互いにでも向きを変える歩き手

二つの壁の間にいる、私たちの二つの歩き手。そばには固さのレッスンの四角もいる。遊んで、出会っては向きを変え、壁まで歩いて戻るのを見てほしい。プログラムは 1,129 バイトの命令 415 個で、作り方も確かめ方も同じだ。

ここで遊ぶ 机の上で変えてみる カートリッジ。NES のカートリッジを遊べるところならどこでも遊べる: walkers.nes

画面の上では

フレーム 30
フレーム 30
フレーム 60
フレーム 60
フレーム 200
フレーム 200
フレーム 420
フレーム 420

歩き手に要るのは二つの決まりだけ

スーパーマリオブラザーズのクリボーは、二つの簡単な決まりで動く。一フレームに半ピクセル、つまり二フレームに一ピクセルずつ進み、壁に歩き当たると向きを変える: 一フレームだけ壁の中に一ピクセル入り、押し戻されて反対へ歩き出す。二つが出会うと、同じフレームで両方が向きを変える。ゲームが調べる箱は絵より小さいので、そのときにはもう少し重なっている。私たちの歩き手は同じ速さで進み、四角と同じように前の縁でレベルを調べ、触れたとたんに向きを変えるので、壁の中にいるところも重なるところも見えない。

このカートリッジスーパーマリオブラザーズ
一歩のピクセル数と、歩く間隔のフレーム数1、2 フレームおき1、2 フレームおき
見えた壁での方向転換の数43
一フレーム、壁の中に一ピクセル入るいいえはい
見えた出会いの数(どれも同じフレームで両方が向きを変える)31
向きを変えるときに重なるピクセル数07

書いたとおりに

このレッスンが扱うプログラムの部分。プログラム全体は、ただのテキストファイルだ: walkers.s

;; The walkers, on every second frame: each takes its step, and if its
;; leading edge is then in a wall it goes back and turns. Then, if the one
;; on the left walks right and the one on the right walks left and they
;; touch (16 apart), both turn.
walkers:
    LDA $44
    EOR #$01
    STA $44
    BEQ resting
    LDX #$00
    JSR stride
    LDX #$01
    JSR stride
    LDA $42
    CMP #$01
    BNE resting
    LDA $43
    CMP #$FF
    BNE resting
    SEC
    LDA $41
    SBC $40
    CMP #$11
    BCS resting
    LDA #$FF
    STA $42
    LDA #$01
    STA $43
resting:
    RTS
;; Walker X: a step, and the block at its leading edge (its right edge
;; walking right, its left walking left), at its feet's height less one.
stride:
    CLC
    LDA $40,X
    ADC $42,X
    STA $40,X
    LDY $42,X
    CPY #$01
    BNE leftward
    CLC
    ADC #$0F
leftward:
    STA $20
    LDA #$CF
    STA $21
    STX $26
    JSR solid
    LDX $26
    CMP #$00
    BEQ strode
    SEC
    LDA $40,X
    SBC $42,X
    STA $40,X
    LDA #$00
    SEC
    SBC $42,X
    STA $42,X

この前は: マリオのように固い、地面とブロックと壁

すべてのレッスン