第５章

## 第５章　スプライト

### タイルパターン

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

スプライトを作成するツールはいろいろあるのですが、トップページからリンクされているわいわいの巣の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も同じなので、覚えておいてください。

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

第３章でPPU初期化において、$2000でBGパターンテーブルは$0000から、スプライトパターンテーブルアドレスは$1000からと指定しました。 16進数で$1000ならば4キロバイト(4096バイト)のデータが格納できるので、計算が合いますね。 そして宣言したとおりに、バンク２に以下のように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を使用します。 スプライトを描画するためには、以下の順番の通りに４つの情報を指定します。

    	１バイト目 Ｙ座標

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

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

    	４バイト目　Ｘ座標

パレットの上位2bitというのは、０〜１５までのBGのパレットのうち、 パレット０〜３を使うならば０(%0000)の00、パレット４〜７なら４(%0100)の01、パレット８〜１１なら８(%1000)の10、 パレット１２〜１５なら１２の(%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までに全ての処理を必ず終わらせる必要があります）。 言い方を変えると、ファミコンは１秒間に６０ループの処理を行えるということになります。

    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に出てるのが原因です。

トップページ 前のページ 次のページ

FC2 |  | キャッシング 花 | 無料 掲示板 無料ホームページ