マリオのものと同じ、カメラの遊び
二画面分の幅のレベルと、そこを歩く四角。遊んで右へ歩き、柱を見ていてほしい: 絵はしばらく動かず、それから滑り出し、やがて歩みに追いつく。向きを変えると、絵が追ってくる前に四角が画面を歩いて戻る。プログラムは 551 バイトの命令 246 個で、作り方も確かめ方も同じだ。
ここで遊ぶ 机の上で変えてみる カートリッジ。NES のカートリッジを遊べるところならどこでも遊べる: camera.nes
画面の上では
カメラは待ち、ゆっくり動き出し、それから留める
スーパーマリオブラザーズは、マリオを画面の真ん中に置き続けはしない。右へ歩くと、マリオは絵が止まったまま画面の左側を横切る。80 ピクセルを少し過ぎるとカメラが動き出すが、マリオより遅いので、マリオは 112 に来るまでカメラに追いつき続ける。そこからはマリオが動いたぶんをカメラがすべて受け持つ。マリオが動いてもカメラが動かないその範囲が遊びで、ゆっくりした動き出しのおかげでスクロールは決してがくんとしない。左へ歩くと、ゲームのカメラはまったく動かない。マリオがレベルを戻れないのはそのためだ。このカートリッジは右側をゲームのとおりに持ち、左側には 48 という自前の縁を持つので、カメラは戻って追う。
| このカートリッジ | スーパーマリオブラザーズ | |
|---|---|---|
| カメラが最初に動くときのプレイヤーの画面上の位置 | 80 | 81 |
| 歩みに追いついてからプレイヤーを留める位置 | 112 | 112 |
| プレイヤーより遅く動いた、動き出しのフレーム数 | 65 | 45 |
| 左へ戻るプレイヤーをカメラが追う | はい | いいえ、決して |
| 左へ歩くときにプレイヤーを留める位置 | 48 | 無い |
| プレイヤーが右へ向き直ってからカメラがまた動き出す位置 | 79 | 80 |
書いたとおりに
このレッスンが扱うプログラムの部分。プログラム全体は、ただのテキストファイルだ: camera.s
;; The camera, after the square has moved. Its place on the screen is x
;; less the camera. Walking right past 80, the camera moves a pixel; and
;; if the square is still past 112, the camera is set to keep it at 112.
;; Walking left with the square nearer the edge than 48, the camera is
;; set to keep it at 48. Then the camera is held between 0 and 256, the
;; two ends of the level.
camera:
LDA $11
SEC
SBC $20
STA $22
LDA $13
BEQ settled
BMI leftward
LDA $22
CMP #$51
BCC settled
INC $20
BNE eased
INC $21
eased:
LDA $11
SEC
SBC $20
CMP #$71
BCC hold
LDA $11
SEC
SBC #$70
STA $20
LDA $12
SBC #$00
STA $21
JMP hold
leftward:
LDA $22
CMP #$30
BCS settled
LDA $11
SEC
SBC #$30
STA $20
LDA $12
SBC #$00
STA $21
hold:
LDA $21
BPL notbelow
LDA #$00
STA $20
STA $21
JMP settled
notbelow:
CMP #$01
BCC settled
BNE above
LDA $20
BEQ settled
above:
LDA #$00
STA $20
LDA #$01
STA $21
settled:
LDA $11
SEC
SBC $20
STA $22
RTSこの前は: マリオのようにスクロールする絵
次は: ゼルダのように滑り込む部屋