TINY野郎のブログ -7ページ目

TINY野郎のブログ

PC-6001、MSX、ぴゅう太など、昔のPCが大好きな人のブログ。

前回は、ダレス登場シーンのメモリ管理について書きましたが、オープニング本編について書く前に、「グラフィックの省メモリ化」について書いておこうかと思います。

グラフィックを表示する際、私がP6で作るもの全てで必ず使っているのが、自作のPCGエンジンです。

画面上のすべてのグラフィックは、8x8(SCREEEN3は4x8)ドットのセルで管理され、すべてセル単位での描画・消去などを行っています。
00H~FFHまでの最大256パターンのキャラクターデータを定義して、あとはLOCATEとPRINTでその番号を指定して表示するイメージです(実際はもうちょっと複雑ですが)。

元々は「グラフィックを消したり、書き換えたり、位置を合わせたりする場合に、セル単位のほうが管理がしやすい」という理由で使っていたPCG方式なのですが(ドット単位での書き換えなんて考えたくない…)、メモリ的には「同一のセルがあればデータを減らせる」というメリットもあります。

今回の場合は、とにかく1バイトでもメモリを削減したかったので、このメリットを最大限に利用しました。

具体例として、リリアのグラフィックをどう作ったかについて書いてみます。

まず、今回のP6版ですが、基本的には、

MSX2版の移植

だということはお気づきの方も多いと思います。

リリアについても、MSX2版のリリアを元にしました。

これがMSX2版のリリアです。

イメージ 1
MSX2のSCREEN5の場合、512色から16色を選べるだけあって、とてもキレイな色使いになっています。

これを4色に減色します。
減色の際、私は手作業でパレットを変更することが多いです。
例えば、水色などは、シーンによって緑で表現したほうが良い場合もあれば、青で表現したほうが良い場合もあるので、ツールに任せて減色するよりも確実だからです。

減色すると、こんな感じになります。

イメージ 2

いいですねー。
ただ、大抵、ここまではうまくいく ことが多いです。

これを横の解像度を半分にします。
勝負の分かれ目です。

イメージ 3

思っていたより全然イケそうです。

このデータを自作ツールに突っ込み、セルに分割してみると、こうなります。

イメージ 4

ここで、ピンクの枠のセルに注目です。
セル化するメリットとして、同一データが多ければ多いほどメモリ効率が良くなるわけですが、ピンクの枠のセルについては、ほぼベタなパターンにも関わらず、たった数ドットのために独自のデータを持たなければならず、もったいない感じです。

また、黒塗りの部分が「瞬き」のアニメーションに関わる部分なのですが、白枠のセルは、たった1ドットの青のためにアニメーションデータを持たせなければなりません。これももったいないです。

もちろん、修正してしまえば良いのですが、目の1ドットは顔の印象にも関わりますし、アニメーションする部分を修正すると、すべてのパターンのデータを合わせて修正しなければならないので、できる限り触りたくありません。

そんなわけで、思い切って全体を1ドット上にずらしてしまいました。

イメージ 5

これで、ピンクの枠のセルはすべてベタ塗りのセルになり、他のセルと共通化することができました。
白枠のセルはアニメーションには関係なくなり、瞬きに必要なセルの数も減りました。

さらに、水色の枠のセルなども気になるので、引き続き修正します。

そんな感じで、細かいドットの修正を繰り返してセルを削減し、元絵を見ながら手を加えたのが、完成版です。

イメージ 6

気になるところは若干ありますが、ここまでできれば上出来ではないでしょうか。

横19バイト×縦128ラインなので、データをそのまま持つと2432バイトですが、セル化することにより、キャラクターグラフィック(CG)データが223パターン×8バイト=1784バイト、パターンネーム(PN)データが横19×縦16=304バイト、合計2088バイトになりました。

最終的に、雲や服にタイリングで陰を付けたりして、あまり効率が良くない絵になってしまいましたが、それでもベタで持つよりはかなり少なくなりました。

あとは、アニメーション部分だけを切り出し、減色・解像度変換します。

イメージ 7

口が4パターン、目が6パターン。
セル単位での管理は、アニメーションをさせる際にも便利です。

というわけで、すべてのグラフィックデータは、こんな感じで作りました。