2010年 06月 20日 ( 1 )

スプライトの圧縮

リクエストがあったので武器・盾のグラフィックデータのフォーマットを調べてみました。
それから、報告だけしておいてまだ解説できていなかったキャラのグラフィックデータのフォーマットも序でに解説します(武器・盾と殆ど同じです)。
古印体のフォーマットの応用なので、先そちらを理解した方が良いです。
1つのデータのフォーマットは以下の通りです。

・ブロック1~4のタイプ(1バイト)
・ブロック1(0~32バイト)
・ブロック2(0~32バイト)
・ブロック3(0~32バイト)
・ブロック4(0~32バイト)
・ブロック5~8のタイプ(1バイト)
・ブロック5(0~32バイト)
・ブロック6(0~32バイト)
・ブロック7(0~32バイト)
・ブロック8(0~32バイト)
……

1つのブロックは8*8ピクセルで、左から右へ16ブロック並べると次の行へ下ります。1つのデータにつき16*4ブロック、128*32ピクセルです(盾は16*2ブロック、128*16ピクセルです)。
古印体と同様に、ブロックn~n+3のタイプは、bit0,1がブロックnの、bit2,3がブロックn+1の、bit4,5がブロックn+2の、bit6,7がブロックn+3のタイプを示します。
そして、やはりタイプ0は非圧縮、タイプ1は全て透明なブロック、タイプ2は省略行は透明なブロック、タイプ3は省略行は上の行と同じブロックです。

タイプ0はそのまんま、
1行目のbit0、1行目のbit1、2行目のbit0、2行目のbit1、……、8行目のbit0、8行目のbit1、
1行目のbit2、1行目のbit3、2行目のbit2、2行目のbit3、……、8行目のbit2、8行目のbit3、
で32バイトです。それぞれのバイトは、最上位ビットが一番左のドット、最下位ビットが一番右のドットに対応します。bit0~bit3を組み合わせて1ピクセルにつき4ビットになります。

タイプ1は0バイトなので解説不要として、タイプ2,3はまず省略されたバイトを示す2バイトを入れます。bit0が1~2バイト目、bit15が31~32バイト目に対応し、0で省略、1で省略していないことを示します。
そして、タイプ2は0のビットに対応する2バイトを00 00で、タイプ3は0のビットに対応する2バイトを直前と同じ2バイト(先頭の行が省略されている場合は00 00)で埋めて、32バイトのデータを作ります。
但し、タイプ2で展開したデータはタイプ0,3とは違って、
1行目のbit0、1行目のbit1、1行目のbit2、1行目のbit3、……、8行目のbit0、8行目のbit1、8行目のbit2、8行目のbit3、
で32バイトとなります。

これを組み合わせて1つのグラフィックデータの完成です。
パレットは、0は透明、1~4は3BC5D7~3BC5DE、5~9は武器によって変わる5色、A~Fは盾によって変わる6色です。
これで展開していくと、次のようなグラフィックが出て来ます。
http://oyasen20.tripod.com/image/sprite1.png

キャラのグラフィックデータも圧縮の仕組みは同じですが、最初に横幅等を示すバイトがあり、左から右へではなく上から下へブロックを並べていく所が違います。
でも、古印体なら手作業でも展開できないことはないですが、グラフィックデータは自分で圧縮・展開ツールを作ってやらないと大変だと思います。
因みに私はまともなプログラムの開発環境がなく、グラフィックの表示はいつもJavaScriptにやらせている(非常に遅い)ので、私に展開ツールは求めないで下さい。

上の解説が分かりにくいという人は次の例を見てみると分かるかも知れません。
http://oyasen20.tripod.com/image/sprite2.png
http://oyasen20.tripod.com/image/sprite3.png
[PR]
by oyasen | 2010-06-20 14:19 | 改造・解析