キャラクタフォントの設定


モノクロデータ(白黒2値)

白黒2値のモノクロ・キャラクタフォントは、複雑なパレットがあまり関係せず、 比較的考えやすいので、最初にこれを説明します。

下図のようなキャラクタをデザインし、これをスクリーンに表示させるまでの手順は


unsigned char bmp_m[] = {
    0x3C, 0x7E, 0x93, 0xDB, 0xFF, 0xFF, 0xFF, 0xDB 
};
@白黒2値データを16進2ケタに変換する。

Aデータを配列に設定する。

(実際にはこの部分はWonderWitchに付属している「Bmpcnv」で行う)

  font_set_monodata(2, 1, bmp_m);
Bキャラクタフォントの番号を指定して登録する。

この例では、「2番」から「1個分」のキャラクタフォントに、Aで宣言した配列「bmp_m」の内容を設定している。

  unsigned m[] = { 2 };  /* m[0]=2; */
Cスクリーンに表示させるデータにはキャラクタフォントの番号だけでなく、以下の情報を組み合わせて2バイト(unsigned型)とし、そのアドレスを与えます。

 ・キャラクタフォント番号
 ・パレット番号(後述)
 ・横反転情報
 ・縦反転情報

通常は8×8ドットより大きなキャラクタを使用するので、以上の情報は『配列』としてその先頭アドレスを与える方法をとります。今回は1キャラですが、これに順じてコーディングしました。

 screen_set_char(SCREEN2, 3, 1, 1, 1, m);
Dデータが用意できたところでスクリーンへセットします。
この例ではスクリーン2の「横3、縦1」のキャラクタ座標位置へ、データ配列mの内容を 「横1列、縦1行」へ展開しています。
#include <sys/bios.h>

unsigned char bmp_m[] = {
    0x3C, 0x7E, 0x93, 0xDB, 0xFF, 0xFF, 0xFF, 0xDB 
};

void main()
{
    unsigned m[] = { 2 };
    font_set_monodata(2, 1, bmp_m);
    screen_set_char(SCREEN2, 3 , 1,  1 , 1 , m);
    key_wait();
}
以上の説明をプログラムにするとこのようになります。
最後の「key_wait();」はプログラム終了後なにかキーが押されるまで 待機します。すぐに終了してしまうと実行結果が確認できないためです。


大きなキャラクタ(8×8ドット以上)

8×8ドット以上のキャラクタフォントの設定と表示は次のようにします。

キャラクタの単位は8×8ドットなので、縦横の大きさが8の倍数のもののみ設定可能。
これを8×8づつに区切って、キャラクタフォントへ登録していく。
データ変換は手計算では大変なので、付属ツール『Bmpcnv』ビットマップコンバータを使用する。

図のような32×32ドットの『Witch.bmp』のデータファイル「witch.h」を生成する。

witch.h

#define witch_width 4
#define witch_height 4

unsigned char bmp_witch[] = {
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 
	0x40, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x0F, 0x1F, 0x01, 0x03, 0x07, 0x0D, 0x18, 
	0x7F, 0xFF, 0xFF, 0x90, 0x26, 0x26, 0x46, 0x80, 
	0xFF, 0xFF, 0xFF, 0x02, 0x19, 0x19, 0x18, 0x00, 
	0x80, 0xFC, 0xFE, 0x60, 0x30, 0x38, 0xAC, 0x46, 
	0x30, 0x21, 0x02, 0xF8, 0x8E, 0x83, 0x81, 0xCD, 
	0xE0, 0x1F, 0x01, 0x03, 0x07, 0x07, 0x4F, 0x3F, 
	0x01, 0xFE, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFD, 
	0xC3, 0x21, 0x10, 0x10, 0x08, 0x00, 0x01, 0x03, 
	0x47, 0x73, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x1F, 0xCF, 0x77, 0x1F, 0x00, 0x00, 0x00, 0x00, 
	0xFC, 0xFC, 0xF8, 0xFF, 0x30, 0x17, 0x1F, 0x1C, 
	0xFE, 0x48, 0xC8, 0x38, 0x00, 0x00, 0x00, 0x00, 
};
変換されるとこのようなヘッダファイルとして生成される。

witch_width は横のキャラクタ数(横ドット数/8)

witch_height は縦のキャラクタ数(縦ドット数/8)

を表す定数として宣言される。(ビットマップファイル名に _width , _height がぞれぞれ付加される)

実際のデータは bmp_witch という配列に設定される。


witch.c


#include <sys/bios.h>
#include "witch.h"

void main()
{
    unsigned witch[] = {
        1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
    };

    font_set_monodata(1, witch_width, witch_height, bmp_witch);
    screen_set_char(SCREEN2, 0, 0, witch_width , witch_height , witch);
    key_wait();
}
「1番」から「16個分」のキャラクタフォントに、「witch.h」 で宣言した配列「bmp_witch」の内容を設定している。

0番のパレットを使うとすると、表示するデータは「witch」の配列内容となる。

スクリーン2の「横2、縦1」のキャラクタ座標位置へ、データ配列 witch の内容を 「横1列、縦1行」へ展開しています。