EXCEEDの同人ソフト開発日記という名の備忘録

趣味のゲームソフト開発人。プロなのかアマなのかは不明(不定)らしい。

任天堂のソフトはいつも予定通りに出てこないって言われるけど、
ソフト作りっていうのは、そういうもの。
ゲームソフトは、期限までにやれと言われて、徹夜したり死に物狂いでやったからといって、
期待通りのものにはならない。そういうふうにすると、
結局、チームは妥協しなければならなくなる。
妥協させられて、できたものは、粗くなってしまう。
ユーザーは目が肥えていますから、受け付けてもらえない

山内 薄

忘れそうなので、とりあえず、普通のスプライトを出すメモだけ残しておこう


RAM 上にディスプレイリストテーブルを予め用意して、
Suzy(グラフィックコントローラーチップ)を発破する。
各テーブルは、リンクアレイチェーン形式となり、
フォーマットは SCB: ラベル以下の通り


SCB:
.dc.b $c4,$10,$20 ;SPRCTL0,SPRCTL1,SPRCOLL
.dc.w SCB2,Bitmap ;次のテーブルへのアドレス,画像データアドレス
.dc.w 0,0 ;X座標値,Y座標値
.dc.w $100,$100 ;横拡大率,縦拡大率
.dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef ;パレット変換テーブル

SCB2:
.dc.b $c4,$10,$20
.dc.w NULL,Bitmap2
.dc.w 12,55
.dc.w $100,$100
.dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef

Bitmap:
.dc.b ・・・・・・・ ;画像データ
Bitmap2:
.dc.b ・・・・・・・ ;画像データ

                                                                                                    • -

SPRCTL0 : スプライトコントロール

B7,B6 = bits/pixel-1 (1,2,3,4)

B5 = H flip, 0 = not flipped

B4 = V flip, 0 = not flipped

B3 reserved

B2,B1,B0 = Sprite Type
7 -> shadow
6 -> exclusive-or, shadow
5 -> non-collidable
4 -> normal
3 -> boundary
2 -> boundary-shadow
1 -> background-no collision
0 -> background, shadow

 つまり、ごく一般的なスプライトを使用するなら、0xc4 で良い

                                                                                                    • -

SPRCTL1 : スプライトコントロール

B7 = literal attribute, 0=normal, 1=totally literal

B6 = Sizing algorithm choice, 0=adder (algo 4), 1=shifter (algo 3)
SET IT T0 ZERO!!!!, algo 3 is broke
 ※ハードのバグがあるらしく、Bit6 を 1 にしてはいけないらしい

B5,B4 = Reloadable depth.
0=none.
1=Hsize,Vsize.
2=Hsize,Vsize,Stretch.
3=Hsize, Vsize,Stretch, Tilt.

B3 = Palette re-load. 0=reload the palette, 1 use existing palette.
B2 = Skipsprite. 1 skip this sprite, 0=use this sprite.
B1 = Start drawing up (1=up, 0=down)
B0 = Start drawing left (1 left, 0=right)

 拡大縮小だけサポートするなら、0x10 となる

                                                                                                    • -

SPRCOLL

 ハードウェアでのスプライト自動衝突検出を行うためのフラグ。
 とりあえず、今回は考えないことにするので、
 $20 に固定にしておけばよいみたい

                                                                                                    • -

次のテーブルへのアドレス

 次の SCB(スプライトコントロールブロック=ディスプレイリスト)
 へのリンクアドレスを設定する
NULL(ゼロ)を指定すると、終端 SCB となる。

                                                                                                    • -

画像データアドレス

sprpack.exe にて作成された圧縮グラフィックデータを
 格納した場所を指定する。画像データは、RAM上になくてはならない。

                                                                                                    • -

X座標値,Y座標値

 その名の通り。ただし、スプライトの左上ではなく、
 中心点が基準となる。

                                                                                                    • -

横拡大率,縦拡大率

 その名の通り。小数部8ビットの固定少数値となり、
0x100 で 100%となり、最大で 0x200(200%)まで指定可能。

                                                                                                    • -

パレット変換テーブル

 通常は例のままにしておけばよい。
 ここで、リアルタイムに、カラーインデックスに対する
 パレット番号を変換するためのテーブルを指定できる。
 たとえば、スト2みたいに、色違いだけのキャラを
 表示させたい時には、ここをいじるだけで、
 同じ画像データを使いまわすことも可能。

                                                                                                    • -

その他

発破(一括描画開始)のかけ方

■Lyxass(アセンブラ)

 SHOW というマクロが用意されているので、それを使う。 

foo:
SHOW sprite_scb
rts

sprite_scb
dc.b $C4,$10,$20
dc.w 0
dc.w spritebuf
dc.w 0,0
dc.w $100,$100
dc.b $01,$23,$45,$67,$89,$AB,$CD,$EF

spritebuf:
.dc.b ・・・・・・ ;画像データ


■CC65(Cコンパイラ)

 やはり、マクロが用意されているので、以下のような感じで、
 SCB テーブル内のデータを書き換えたりできる。
 そして、DrawSprite マクロで発破をかける

extern char Bitmap2; // 画像データをオブジェクトファイル化して外部参照しているの意味
extern char SCB1[];
#asm
_SCB1 dc.b $c4,$10,$20
dc.w 0,_Bitmap2
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$Ab,$cd,$ef
#endasm

:
:

void foo(){

SCBX(SCB1) = 40;
SCBY(SCB1) = 51;
DrawSprite(SCB1);

}


■補足
 SHOW や DrawSprite は 1Int 内で何回でも発行してもよい
 故に、SCB 内のリンクアドレス部分は、0 を指定すると、
 とりあえず、そこで一括表示を一時停止という意味合いとなる。