マリオのように、一行に多すぎるスプライトは消えずにちらつく
一行に立つ十の姿。コンソールがそこに描けるより二つ多い。遊んでセレクトを押し、順番を回すのを入れたり切ったりしてみてほしい: 切ると毎フレーム同じ二つが欠け、入れるとみんながちらつく。プログラムは 341 バイトの命令 141 個で、作り方も確かめ方も同じだ。
ここで遊ぶ 机の上で変えてみる カートリッジ。NES のカートリッジを遊べるところならどこでも遊べる: flicker.nes
画面の上では
コンソールは一行にスプライトを八つ描く
画像チップは一行を描くたびにスプライトのメモリを調べ、見つけた最初の八つを取る。その行にそれより多くあれば、ただ描かれない。毎フレーム同じ順番でスプライトを書くゲームは、毎フレーム同じものを失い、それは一度も見えない。スーパーマリオブラザーズは、敵のスプライトをフレームごとにスプライトのメモリの別の場所へ、短い周期で回して移す。だから一行に多すぎることがあっても、欠けるのは毎回違うものになり、どれも消えずにちらつく。測った走行では一行に八つを超えたことはなく、描かれずに残ったものは無かったが、回すことはそれでもしている。このカートリッジは、問題とその手当てを並べて見せる。
| このカートリッジ | スーパーマリオブラザーズ | |
|---|---|---|
| 一行に並んだスプライトの最大数 | 10 | 6 |
| その行で毎フレーム描かれずに残ったスプライトの数 | 2 | 0 |
| 毎フレーム同じ順番で書いたとき、一度も描かれなかった姿の数 | 2 | 常に回している |
| 順番を回したとき、一度も描かれなかった姿の数 | 0 | 0 |
| 姿のスプライトがスプライトのメモリの同じ場所に戻るまでのフレーム数 | 10 | 3 |
書いたとおりに
このレッスンが扱うプログラムの部分。プログラム全体は、ただのテキストファイルだ: flicker.s
;; Select turns the turning on or off; while it is on, each frame starts
;; one figure further on, round all ten.
order:
LDA $02
EOR #$FF
AND $01
AND #$20
BEQ same
LDA $40
EOR #$01
STA $40
same:
LDA $40
BEQ kept
INC $41
LDA $41
CMP #$0A
BCC kept
LDA #$00
STA $41
kept:
RTS
;; Each figure, two sprites (head over body), written into sprite memory
;; at its place in this frame's order: the figure written first takes
;; the first two sprites, and so on round.
figures:
LDX #$00
figure:
TXA
SEC
SBC $41
BCS placed
ADC #$0A
placed:
ASL A
ASL A
ASL A
TAY
LDA #$77
STA $0200,Y
LDA #$7F
STA $0204,Y
LDA #$06
STA $0201,Y
LDA #$07
STA $0205,Y
LDA #$00
STA $0202,Y
STA $0206,Y
LDA across,X
STA $0203,Y
STA $0207,Y
INX
CPX #$0A
BNE figure
RTSこの前は: マリオのように、動かないステータスバー