マリオのように固い、地面とブロックと壁
ジャンプのレッスンの四角を、自前の小さなレベルに置いた: 地面、頭上のブロック、そして壁。遊んで、ブロックの下で跳び、それから壁へ歩いて押し続けてみてほしい。プログラムは 1,078 バイトの命令 396 個で、作り方も確かめ方も同じだ。
ここで遊ぶ 机の上で変えてみる カートリッジ。NES のカートリッジを遊べるところならどこでも遊べる: solid.nes
画面の上では
ブロックのあるところでジャンプは終わる
スーパーマリオブラザーズで、マリオが跳んでブロックにぶつかると、ジャンプはそこで止まる: 頭がブロックに触れたフレームで上向きの速さが消え、その場から落ちていく。突き上げられたブロックのタイルは消え(跳ね上がる姿はスプライトで描く)、数フレーム後に使用済みのブロックとして戻る。壁では、右を押し続けても位置は動かない: ゲームが速さを取り上げ続け、速さはまた溜まっては数フレーム後にまた取り上げられる。このカートリッジは、16 ピクセル角のブロックの格子としてレベルをメモリに持ち、四角自身の縁で調べる。歩くときは前を、上るときは上を、落ちるときは下を見て、同じことをする。
| このカートリッジ | スーパーマリオブラザーズ | |
|---|---|---|
| ブロックに触れたとき、まだ上っていた速さ(ピクセル毎フレーム) | 3 | 3 |
| 触れてから地面に立つまでのフレーム数 | 14 | 14 |
| 触れてからブロックのタイルが消えるまでのフレーム数 | 1 | 0 |
| 使用済みとして描き直すまでのフレーム数 | 13 | 16 |
| 壁で横の速さが取り上げられた回数と、その間のフレーム数 | 24 回、7 フレームおき | 21 回、7, 8, 9 フレームおき |
| 壁から一ピクセル押し戻される | いいえ | はい |
書いたとおりに
このレッスンが扱うプログラムの部分。プログラム全体は、ただのテキストファイルだ: solid.s
rising:
LDA $15
STA $21
LDA $11
STA $20
JSR solid
BNE head
LDA $11
CLC
ADC #$0F
STA $20
JSR solid
BEQ flying
head:
PHA
LDA $21
AND #$F0
CLC
ADC #$10
STA $15
LDA #$00
STA $14
STA $16
STA $17
PLA
CMP #$02
BNE flying
JMP bump
;; The two bottom corners, one pixel under the square: the block under
;; either, in A.
feet:
LDA $15
CLC
ADC #$10
STA $21
LDA $11
STA $20
JSR solid
BNE footed
LDA $11
CLC
ADC #$0F
STA $20
JSR solid
footed:
RTS
;; A block bumped from below: bumped in the level at once, and its tiles
;; blank now and drawn bumped 12 frames later. Its tiles' place: the
;; name table, 64 for each row of blocks and 2 for each column.
bump:
LDX $22
LDA #$03
STA $0400,X
TXA
LSR A
LSR A
LSR A
LSR A
LSR A
LSR A
CLC
ADC #$20
STA $32
TXA
AND #$30
ASL A
ASL A
STA $33
TXA
AND #$0F
ASL A
ORA $33
STA $33
LDA #$01
STA $30
LDA #$0C
STA $31
RTSこの前は: マリオのように見分ける、踏みつけとぶつかり