2015年3月31日火曜日

0313_制限に負けない絵作り。

DSのメイドイン俺で絵を描いていると、昔のMSX2などで絵を描いているような感じの画になります。そうすると、なんかMSX2のカオスエンジェルズみたいだなぁ…と思ったり。

そういや、カオスエンジェルズでは100枚を超える絵をディスクに詰め込んでいますよね。あれって、どうやってデータを格納・表示しているのだろう? なんて、ふと考えたりします。

プログラムを解析しているわけではないので、あくまで想像で、「自分がプログラマーならこう作る」という考えですが、MSX2の「カオスエンジェルズ」の場合、漢字の表示から見て高解像度画面ですからスクリーン6か7。で、スクリーン6は4色、7は16色です。どう考えても4色ではないですよね、というわけでスクリーン7でしょう。そうすると、2ページの画面を持っています。なので、もう1枚の画面に背景画像を退避したりという使い方が可能です。MSXでは複数ページの重ね同時表示はできません(X68000ならできます)が、データの退避場所などとしてとっても便利な使い方ができます。

描かれている絵の主線はラインではなくしっかりと描かれている&上から順に表示しているので、白黒の2値を効率よく圧縮しているのでしょう。圧縮方法はランレングスかランプルジズかハフマン符号かは分かりませんが。でないと、大量の画像データを2枚のフロッピーに入れることができません。たった2枚のフロッピーでゲームが動いております。使えるメモリが限られる昔のソフトは、データの圧縮が命でありました。

で、色データは単純に「ペイントルーチンを作って塗っている」でしょうね、これが一番データを小さくできるでしょうから。ただし普通のペイントルーチンではなく、タイルペイント(市松模様などで塗ることにより、少ない色をたくさんに見せる)ができるようなものを作っていると。で、ついでに「ここを背景に塗る」というルーチンを仕込んで、絵のいらない部分を背景で消しているのでしょう。

問題は「絵の上に絵を上書きしている」こと。いったん画面を全部消して書き直せばいいのに、あえてこんなことをしております(Winのシュタインズゲート8bitなんかでも、こういう処理をさせています)。なので、これに対応したペイントルーチンを作らなければいけません。具体的には、「新しい絵の色と古い絵の色を区別する」。そうすると、新しい絵の主線はカラーパレット1番の黒、古い絵の主線はカラーパレット2番の黒…という感じで、ペイントルーチンでは1番の黒のみを色の境界と判断する…という感じかな?(’’? で、絵を描くごとにこの1番の黒と2番の黒を交互に使用すると。これなら、多分処理できそう。

あるいは、非表示ページをいったん消して、そこにも同じように新しい絵を描いて、そちら側で塗る範囲をチェックしていると。どっちにしても、面倒くさいことをしていますよね。もしかすると、これ以外の方法で実現させているかもしれませんが。

MSXのカオス~をGBAなどに変換するソフトを作っている人がいますので、その人はMSX版を完璧に解析して移植しているでしょうね。HPの開発日記を読むと、Z80をCの命令で実現するという方法を取って移植していると(、、; でも、よっぽどの愛がないと、なかなか解析なんて暇なことはできません。というわけで、どういう処理をしているかは作者と解析者だけが知っていると。

今は、こんなことを考えなくてもいいぐらいに潤沢にメモリを使え、画面制御の制限もほぼ解消されていますが、キツい制限内でいかに自分の理想を実現するかを考えていた時代は、それはそれで面白かったのかも知れません。で、ふとこういう技術的なことに興味が湧いたりするのですよね。

0 件のコメント:

コメントを投稿