第5章 スプライト


タイルパターン

 VRAMのスプライトの領域は、4キロバイトあり、8x8で256個を登録できます。また、スプライトは同時に64個表示できます。 一つのスプライトには、パレットから4色分を指定できます。 このスプライトは横に8つ、2つ並べて16ドットなら4つまでしか表示できません。 かの有名な、ファミコンのスプライトが5つ以上並ぶとちらつく現象はこの制約が原因です。

 スプライトを作成するツールはいろいろあるのですが、ここでは、トップページからリンクされているわいわいの巣のYY-CHRを使うことにします。 さらに、これをダウンロードしてください。中にgiko.pal(パレットデータ),giko.spr(スプライトデータ),giko.bkg(空の背景データ)が入っています。 pal.exeでgiko.palを開き、yy-chr.exeでgiko.sprを開いてください。(左下のリストから「2BPP NES」を選んでください)

 以下のような場合で、スプライトのパレットを0番にしたとしたら、スプライトのパレットは下段ですから、背景色は灰色、目の部分は黒、口の部分は赤、顔は白になります。 1番だったら、パレットは4・5・6・7が使用されますから、顔の部分が緑色になるわけです。4の背景はピンクですが、背景色は無視されます。この色指定の規則は後で出てくるBGも同じなので、覚えておいてください。

バンク2にグラフィックデータを配置する

 第3章でPPU初期化において、$2000でBGパターンテーブルは$0000から、スプライトパターンテーブルアドレスは$1000からと指定しました。 16進数で$1000ならば4キロバイト(4096バイト)のデータが格納できるので、計算が合いますね。 そして宣言したとおりに、バンク2に以下のようにBG→スプライトの順で並べなくてはなりません。

	.bank 2
	.org $0000
	.incbin "giko.bkg"
	.incbin "giko.spr"

スプライトRAM書き込み

 スプライトRAMにスプライトを書き込むには、まず書き込むスプライトのパターンテーブルのアドレス(8ビット長)を スプライトRAMレジスタ$2003に指定します。

	lda #$00   ; $00(スプライトRAMのアドレスは8ビット長)をAにロード
	sta $2003  ; AのスプライトRAMのアドレスをストア

 スプライト情報の指定は、スプライトRAMレジスタ$2004を使用します。 スプライトを描画するためには、以下の順番の通りに4つの情報を指定します。
	1バイト目 Y座標 

	2バイト目 タイルインデクス番号 (sprファイルの何番目のスプライトを表示するか)

	3バイト目 8ビットのビットフラグです。スプライトの属性を指定します。
	bit7:垂直反転(1で反転)
	bit6:水平反転(1で反転)
	bit5:BGとの優先順位(0:手前、1:奥)
	bit0-1:パレットの上位2bit
	(他のビットは0に)

	4バイト目 X座標 
 パレットの上位2bitというのは、0〜15までのBGのパレットのうち、 パレット0〜3を使うならば0(%0000)の00、パレット4〜7なら4(%0100)の01、パレット8〜11なら8(%1000)の10、 パレット12〜15なら12の(%1100)の11を指定するということです。ここではパレット0番にします。  もし、X=30,Y=40に0番のスプライトを表示するならば、以下の通りになります。

	lda #40     ; 40(10進数)をAにロード
	sta $2004   ; Y座標をレジスタにストアする
	lda #00     ; 0(10進数)をAにロード
	sta $2004   ; 0をストアして0番のスプライトを指定する
	sta $2004   ; 反転や優先順位は操作しないので、再度$00をストアする
	lda #30     ; 30(10進数)をAにロード
	sta $2004   ; X座標をレジスタにストアする

 ちなみにファミコンの画面の解像度は256x240です。

VBlank

 日本のテレビは、NTSCという規格に準拠しています。 テレビの画面を走査線は、1/60秒の間に左上から右下まで横に右移動して画面を描画します。 右下に達するとまた左上に戻るのですが、この戻る間の期間をVBlankといいます。

 VBlankが終わった後の描画中にVRAMを更新すると画像が壊れてしまうので、最初にVBlank発生を待ってから VBlank中に描画処理を行います。 そして次のVBlankまでに全ての処理を必ず終わらせる必要があります。 言い方を変えると、ファミコンは1秒間に60ループの処理を行えるということになります。


Start:
	lda $2002  ; VBlankが発生すると、$2002の7ビット目が1になります。
	bpl Start  ; bit7が0の間は、Startラベルの位置に飛んでループして待ち続けます。

 bplとは、ステータスレジスタのN(ネガティブ)フラグが0の場合指定されたアドレスに分岐する命令です。 NフラグにはAレジスタの7ビット目がセットされるので、ldaとbplだけで待つことができます。

スプライト表示プログラムの完成

 ここまででスプライトを表示するための最低限の説明が終わりました。このソースをダウンロードして、 さっきダウンロードしたgiko.pal、giko.spr、giko.bkgと一緒の場所に入れて、コマンドプロンプトから
	nesasm giko005.asm
を実行してください。

 アセンブルが成功したら以下のような画面になり、GIKO005.NESというファイルが出力されます。 自分でいじってエラーが出てしまった場合は、ラベル以外の行の先頭にタブが抜けていないかどうか調べてみてください。

 このGIKO005.NESを何かのファミコンエミュレータで実行してみてください。小さなスプライトが一つ表示されます。

 左上のゴミは、指定して無い1番以降のスプライトの下部が、座標X0,Y0に出てるのが原因です。


トップページ 前のページ 次のページ
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送