NEStinymachines

マリオのように、一行に多すぎるスプライトは消えずにちらつく

一行に立つ十の姿。コンソールがそこに描けるより二つ多い。遊んでセレクトを押し、順番を回すのを入れたり切ったりしてみてほしい: 切ると毎フレーム同じ二つが欠け、入れるとみんながちらつく。プログラムは 341 バイトの命令 141 個で、作り方も確かめ方も同じだ。

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

画面の上では

フレーム 60
フレーム 60
フレーム 61
フレーム 61
フレーム 180
フレーム 180
フレーム 181
フレーム 181

コンソールは一行にスプライトを八つ描く

画像チップは一行を描くたびにスプライトのメモリを調べ、見つけた最初の八つを取る。その行にそれより多くあれば、ただ描かれない。毎フレーム同じ順番でスプライトを書くゲームは、毎フレーム同じものを失い、それは一度も見えない。スーパーマリオブラザーズは、敵のスプライトをフレームごとにスプライトのメモリの別の場所へ、短い周期で回して移す。だから一行に多すぎることがあっても、欠けるのは毎回違うものになり、どれも消えずにちらつく。測った走行では一行に八つを超えたことはなく、描かれずに残ったものは無かったが、回すことはそれでもしている。このカートリッジは、問題とその手当てを並べて見せる。

このカートリッジスーパーマリオブラザーズ
一行に並んだスプライトの最大数106
その行で毎フレーム描かれずに残ったスプライトの数20
毎フレーム同じ順番で書いたとき、一度も描かれなかった姿の数2常に回している
順番を回したとき、一度も描かれなかった姿の数00
姿のスプライトがスプライトのメモリの同じ場所に戻るまでのフレーム数103

書いたとおりに

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

この前は: マリオのように、動かないステータスバー

すべてのレッスン