下図のようなキャラクタをデザインし、これをスクリーンに表示させるまでの手順は
|
@キャラクタをデザインし、データに変換。 付属の画像変換ツール『bmpcnv』はRGB値の違うもの(この例では赤) を透明な色(色番号0)として認識します。 この例では黒を色番号3番、灰色を2番、白色を1番、赤色を0番 としてデータが作成されます。 |
display_control( DCM_SCR1 | DCM_SPR ); |
Aスクリーンとスプライトの表示を指定します。 |
font_set_colordata(5, 4*4, bmp_witch); |
Bキャラクタフォントの番号を指定して登録する。 この例では、「5番」から「16個分」のキャラクタフォントを設定しています。 |
for(i=0;i<16;i++) sprite_set_char(i,(i+5) | 4<<9 | CFM_SPR_UPPER); (bit 15) 縦方向反転表示。1で反転。 (bit 14) 横方向反転表示。1で反転。 (bit 13) スクリーン2に対する優先度。1でスクリーン2より優先。 (bit 12) クリッピングタイプ。1でスプライト・ウィンドウの 外側部分を表示。 (bit 9-11)スプライトキャラクタカラーパレット番号。 8〜15のスプライト用キャラクタカラーパレット番号 から8を引いた値。 (bit 0-8) キャラクタ番号。0〜511のキャラクタ番号。 disp.h の中で以下のように定義されています。 #define CFM_FLIP_V 0x8000 #define CFM_FLIP_H 0x4000 #define CFM_SPR_UPPER 0x2000 #define CFM_SPRWIN_CLIP 0x1000 |
Cスプライトにデータをセットします。情報を組み合わせて2バイト(unsigned型)とします。 |
sprite_set_range( 0, 16 ); | D画面に表示するスプライト番号の範囲を設定します。この例では 0番から、16個分のスプライトキャラクタを利用可能にします |
x=0; y=40; for ( i=0; i<4; i++ ) { for ( j=0; j<4; j++ ) { sprite_set_location( i*4+j, x+j*8, y+i*8 ); } }sprite_set_location( スプライト番号,横位置,縦位置 ); |
Eデータが用意できたところでスクリーンへセットします。 表示座標は1ドット単位で指定できます キャラクタと違ってまとめて表示する機能はありません。8×8ドットの1つづつ 位置を指定して表示させます。実際のプログラミングでは関数にするのがよいでしょう。 |
#include <sys/bios.h> #include "witch.h" unsigned witch[4*4]; void main() { int x,y,i,j; display_control( DCM_SCR1 | DCM_SPR ); font_set_colordata(5, 4*4, bmp_witch); for(i=0;i<16;i++) sprite_set_char(i,(i+5) | 4<<9 | CFM_SPR_UPPER); sprite_set_range( 0, 16 ); x=10; y=40; for ( i=0; i<4; i++ ) { for ( j=0; j<4; j++ ) { sprite_set_location( i*4+j, x+j*8, y+i*8 ); } } key_wait(); } |
以上の説明をプログラムにするとこのようになります。 最後の「key_wait();」はプログラム終了後なにかキーが押されるまで 待機します。すぐに終了してしまうと実行結果が確認できないためです。 |
#include <sys/bios.h> #include "witch.h" unsigned witch[witch_width * witch_height]; int sprite_set(int, int, int, int, int); void main() { int x,y,i;; display_control( DCM_SCR1 | DCM_SPR ); font_set_colordata(1, witch_width * witch_height, bmp_witch); for(i=0;i<16;i++) sprite_set_char(i,(i+1) | 4<<9 | CFM_SPR_UPPER); sprite_set_range( 0, 16 ); x=0; y=40; while(key_press_check()==0){ sprite_set(x, y, witch_width, witch_height, 0 ); sys_wait(1); x++; } } int sprite_set(int x, int y, int width, int height, int no) { int i,j; for ( i=0; i<height; i++ ) { for ( j=0; j<width; j++ ) { sprite_set_location( no+i*width+j, x+j*8, y+i*8 ); } } }