NEStinymachines

マリオのものと同じ、絵の内側の箱

踏みつけのレッスンの四角と歩き手に、触れたかを決めるものを見えるようにした。Select を押すとそれぞれの箱が見える。そのまま歩き手に歩いてぶつかってみてほしい: 先に絵が重なり、箱が重なるまでは何も起きない。プログラムは 853 バイトの命令 397 個で、作り方も確かめ方も同じだ。

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

画面の上では

フレーム 100
フレーム 100
フレーム 136
フレーム 136
フレーム 138
フレーム 138
フレーム 140
フレーム 140

触れるものは、見えるものより小さい

スーパーマリオブラザーズは、マリオにひとつ、敵のそれぞれにひとつ、四つの辺からなる箱を持ち、毎フレーム、そのものの位置からメモリに書き込む。動いているゲームからそれを読み取った。マリオの箱は絵の両脇から 3 ピクセル内側、上から 4 ピクセル下、下端は絵の下端まで。クリボーの箱は絵の真ん中を横切る帯で、上から 6 ピクセル下、下から 4 ピクセル上。マリオがクリボーに歩いてぶつかったとき、二つの絵は箱が重なる一フレーム前にすでに重なっていて、ぶつかりは箱が重なってはじめて起きた。このカートリッジも同じやり方で、その数で箱を持つ。

このカートリッジスーパーマリオブラザーズ
プレイヤーの箱、絵からの内側: 左、上、右、下3、4、3、03、4、3、0
歩き手の箱、絵からの内側3、6、3、44、6、2、4
最初の触れ: 分かる一フレーム前に、絵が重なっていた幅、横と縦4、168、16
そして箱が重なっていた幅まだで、2 離れている2、6
箱は重ならずに絵だけが重なっていたフレーム数23
触れたと分かるのは箱が重なったそのフレーム箱が重なった次のフレーム

書いたとおりに

このレッスンが扱うプログラムの部分。プログラム全体は、ただのテキストファイルだ: 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

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

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

すべてのレッスン