マリオのように、命を失ってやり直す
命が三つある、歩き手たちのレベル。遊んで歩き手に歩いてぶつかってみてほしい: 一回が止まり、四角が跳ねて落ち、残りの命を知らせる画面が出て、レベルがまた始まる。三つとも失うと終わりが見える。プログラムは 1,456 バイトの命令 566 個で、作り方も確かめ方も同じだ。
ここで遊ぶ 机の上で変えてみる カートリッジ。NES のカートリッジを遊べるところならどこでも遊べる: lives.nes
画面の上では
命を失うのは、それだけで短い一場面だ
スーパーマリオブラザーズでマリオがクリボーに触れても、ゲームはすぐに次の挑戦へは行かない。すべてが止まり、マリオは触れられた場所でしばらく固まったままになる。それから跳ね上がり、地面など無いかのように、まっすぐ画面の下へ落ちていく。命が取られるのは、落ち切ってからだ。そのあと絵が消され、残りの命を見せる素朴な画面になり、しばらくしてレベルが初めから始まる。このカートリッジも、自前の間合いと、もっと低い跳ねと、自前の言葉で同じ場面を演じる。
| このカートリッジ | スーパーマリオブラザーズ | |
|---|---|---|
| 触れたとき、すべてが止まっているフレーム数 | 21 | 16 |
| 跳ねが上るピクセル数 | 24 | 53 |
| 触れてから命が取られるまでのフレーム数 | 55 | 208 |
| そこから絵が消されるまでのフレーム数 | 0 | 2 |
| また遊べるようになるまでのフレーム数 | 121 | 168 |
| レベルは初めからやり直す | はい | はい |
書いたとおりに
このレッスンが扱うプログラムの部分。プログラム全体は、ただのテキストファイルだ: lives.s
;; The square and each walker: closer than 14 pixels across and 14 up
;; and down (the walkers stand on the ground, their top at 192) is a touch,
;; and the round stops there: the square hangs for 20 frames with the hop
;; already in it, 4 pixels a frame upward.
touch:
LDX #$01
near:
LDA $11
SEC
SBC $40,X
BCS across1
EOR #$FF
ADC #$01
across1:
CMP #$0E
BCS apart
LDA $15
SEC
SBC #$C0
BCS down1
EOR #$FF
ADC #$01
down1:
CMP #$0E
BCS apart
LDA #$01
STA $50
LDA #$14
STA $51
LDA #$00
STA $16
LDA #$FC
STA $17
RTS
apart:
DEX
BPL near
RTS
;; The fall: the speed moves the square and pulls 96/256 a frame, up to 4
;; pixels a frame, through anything. Past the bottom of the screen a life
;; is taken and the screen for what is left comes up.
drop:
CLC
LDA $14
ADC $16
STA $14
LDA $15
ADC $17
STA $15
CLC
LDA $16
ADC #$60
STA $16
LDA $17
ADC #$00
STA $17
BMI dropping
CMP #$04
BCC low
LDA #$00
STA $16
LDA #$04
STA $17
low:
LDA $15
CMP #$F0
BCC dropping
DEC $52
JSR lives
dropping:
RTS
;; The screen between rounds, drawn with the picture off: both tables
;; empty, every sprite out of sight, and a line of words in the middle,
;; LIVES and the count, or GAME OVER with none left; it stays 120 frames.
lives:
LDA #$00
STA $2001
LDA #$20
STA $2006
LDA #$00
STA $2006
TAX
LDY #$04
wipe2:
STA $2007
INX
BNE wipe2
DEY
BNE wipe2
LDA #$FF
hide2:
STA $0200,X
INX
BNE hide2
LDA #$21
STA $2006
LDA #$CC
STA $2006
LDA $52
BEQ gameover
LDX #$00
word1:
LDA livesword,X
STA $2007
INX
CPX #$06
BNE word1
LDA $52
CLC
ADC #$2A
STA $2007
LDA #$03
STA $50
JMP shown
gameover:
LDX #$00
word2:
LDA overword,X
STA $2007
INX
CPX #$09
BNE word2
LDA #$04
STA $50
shown:
LDA #$78
STA $51
LDA #$00
STA $2005
STA $2005
LDA #$1E
STA $2001
RTSこの前は: マリオのように、世界を止めておくポーズ