2021/5/13 | 投稿者: ghost

敵キャラクタの実装が予想通り難航していてしばらく目に見える成果を示せそうにないので、気分転換に目下開発中の新Shoulder Blade(そして五条大橋)の心臓部を惜しげもなく(?)公開しておこうかと思う。

具体的には、MULTICOLORモード(MSX BASICでいうところのSCREEN3)に任意のサイズのキャラクタを、背景に重ね合わせて描画するためのサブルーチンである。利用に際しては、こちらで紹介している手法でパターンジェネレータテーブルのリニア化をおこなっていることが前提となる。

ちなみに、何か黒魔術的な特別なことをやっているワケでは決してない。MULTICOLORモードの構造に合わせて、1バイトを前後4ビットに分けての0値透過重ね合わせ処理を極めてベタに実装しているだけ、なので、過度に期待しないように。

まず、表示されるキャラクタのデータ構造を示しておこう。

クリックすると元のサイズで表示します

こんな感じ。速度重視で圧縮も何もしていない、ほぼパターンジェネレータテーブルに書き込む生値そのもののデータ列となる。

変則的なのは、まずデータ先頭の2バイトはオフセット値になる。このデータを画面内の任意の位置に描画しようとするときに縦・横の座標値(上図だと青太枠で示した部分)を与えるのだが、その与えられた値に対して、実際に描画を開始する位置(同黒太枠)をずらす機能が盛り込まれている。これは、描画しようとするサイズが任意なので、常に与座標を左上端と前提すると、ゲームロジック側で判定に用いる際にいろいろ面倒だからだ。

加えて、カラーコード13番、十六進だと 0Dh は描画には利用せず、バイトスキップ用の標識値になっている。つまり本機構は(無印MSX限定で言えば)紫色を描画しない、というか、できない。もちろんコレは、ボクがキャラクタデザインにおいてそのような選択をしたからであって、他の任意のカラーコードにこの役割を負わせることができ、実際、五条大橋は開発中にやんごとなき事情によりコレが7番に変わったのだが、とまれ同じ手法を使う以上、常に一色が犠牲になる。

バイトスキップというのは、通常描画処理は連続しているデータをVRAM上でも連続するものとして、つまり縦に一続きのパターンとして描画していくのだが、これを任意のバイト飛ばすことができる。具体的には一列描き終わった後の改行、あるいは3バイト以上続く空白の圧縮、に使う。

さらに本作処理では、キャラクタの標準的なサイズとの兼ね合いから大半の改行折り返しが31〜44バイトの範囲に収まることが予想されたため、これを0D1h〜0DEh に対応させてデータ量を削減している。続く 0DFh はデータ終端標識とし、0D0h の場合は続く1バイトが任意のスキップ値になる。

で、以下に上記データ構造を描画するサブルーチン本体を示す。

続きを読む
タグ: MSX Z80




AutoPage最新お知らせ