<   2010年 06月 ( 2 )   > この月の画像一覧

スプライトの圧縮

リクエストがあったので武器・盾のグラフィックデータのフォーマットを調べてみました。
それから、報告だけしておいてまだ解説できていなかったキャラのグラフィックデータのフォーマットも序でに解説します(武器・盾と殆ど同じです)。
古印体のフォーマットの応用なので、先そちらを理解した方が良いです。
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 | 改造・解析

コドモ戦車の行動の分かりやすい解説

コドモ戦車の行動が分かりにくいというトラックバックが来たので、もう少し分かりやすく解説してみます。
次の処理を2回繰り返します(1回目に攻撃した場合を除く)。これでコドモ戦車の行動は全て説明できる筈です。

1.隣接している→逃げる
2.2~3マスで軸が合っていない→軸を合わせる(シレンが見えていなくても)
3.それ以外→乱数発生
├3-1.乱数が00~7Fでシレンが見えていて、軸が合っていない→近づく
├3-2.乱数が00~7Fでシレンが見えていて、軸が合っている→攻撃、行動終了
├3-3.乱数が00~7Fでシレンが見えていない→目的地に向かって進む
└3-4.乱数が80~FF→何もしない



・部屋で壁に追い詰めると真横に逃げる……1.→1.
・部屋で軸が合っていて矢を撃つ……3-2.で行動終了または3-4.→3-2.
・部屋で軸が合っていて矢を撃ってこない……3-4.→3-4.
・部屋でシレンの移動と平行に移動して矢を撃つ……2.→3-2.
・部屋で1マスしか近付いて来ない……3-1.→3-4.または3-4.→3-1.
・通路の曲がり角を挟んでこちらに来ない……2.→2.(でも壁が邪魔)
・通路で後退した後戻って来る……1.→3-3.
・通路で後退した後戻って来ない……1.→3-4.
・通路の行き止まりに追い詰めた……1.→1.(でも逃げられない)
[PR]
by oyasen | 2010-06-06 12:10 | 改造・解析