ギコ猫さんのところのサンプルを実行すると、左上になにかゴミが表示されてしまいます。
このように左上に表示されているのは使っていないスプライトです。使っていないスプライトは、ギコ猫さんのところのプログラムでは
①Y座標0 ②スプライト番号0 ③スプライトの設定は%00000000 ④X座標0
となってしまっています。だから、スプライト番号0のスプライトが座標(0,0)に表示されてしまった結果、このようなごみが移ってしまっています。
giko009などをエミュレータのメモリビューワなどで確認しましょう。ギコ猫さんのところではスプライトDAMは$0300~$3FFを使っているので、このメモリを見ます。使っていない部分はすべて「00 00 00 00」となっていることが確認できるはずです。
では、このゴミスプライトをどうやって消せばよいのでしょうか。簡単に言うと、座標を画面の外に移すだけでよいです。
2つの具体的な例を挙げたいと思います
①ゴミスプライトの座標を画面外にする方法
ファミコンの画面の解像度は256×240ピクセルですから、左上にちょっとだけ表示されているスプライトを消すために、使っていないスプライトのY座標を例えばF8にすればよいです。
lda #$F8
ldy #0
Spr_Y_Init_Loop:
sta $300, y ;Aレジスタの値を($0200+y)のアドレスに代入
iny
iny
iny
iny ;この4つのインクリメントによってyレジスタを4増やす
bne Spr_Y_Init_Loop ;yレジスタが0じゃないならSpr_Y_Init_Loopにジャンプ(ループ)
~~~プログラム~~~
lda #$3
sta $4014 ;スプライトDMAのレジスタ($4014)に、2を指定する。つまり、$200~$2FFにスプライト情報が入っていると指定し、転送する。
このやり方はスーパーマリオブラザーズで採用されている方法です。
②ゴミスプライトをBG画面の裏に表示する方法
ギコ猫さんのサンプルプログラムで、 giko0016以降に採用されている方法です。
ギコ猫さんの第五章の内容ですが、スプライトの情報4byteのうち、3byte目はスプライトの設定を書きます。そして、その設定の5bit目はスプライトをBG画面の奥に書くか手前に書くか、ということに関する設定です。BG画面の奥にスプライトを描写したい場合、この5bit目を1にすればよいです。
と、いうことで$300~$3FFまですべてに#%00100000を代入しています。(byte1,2,4にもめんどくさいので全部この値を代入しているようです。もちろん、①と同じようにinyを4つ並べてそれぞれのスプライトの設定である3byte目だけに#%00100000を代入する方法でもいいです。というかそっちの方が処理速度的にいい気がする。。)
スプライトの表示を奥にするというのが①よりもスマートで個人的にはこっちの方が好きです。
ギコ猫さんのやり方を下に書きます。
lda #%00100000 ;5bit目を1にすることでスプライトをBG画面の奥に表示する
ldy #0; ここは#2でいい
Spr_Y_Init_Loop:
sta $300, y ;Aレジスタの値を($0200+y)のアドレスに代入
iny; yの初期値を#0ではなく#2にした場合、このinyは①と同じように4回並べる方が処理が少ない。
bne Spr_Y_Init_Loop
~~~プログラム~~~
lda #$3
sta $4014
という感じです。
ところで、ギコ猫さんのプログラムではスプライトDMA用のアドレスは$300~$3FFですがこれは$200~$2FFのほうが一般的な気がします($0000~$00FFはゼロページ、$0000~$01FFはスタック用のアドレス)。マリオとかメトロイドとかでは$200~$2FFを使っているようです。
コメント