スプライトの設定/表示


スプライトの設定/表示

ゲームなどにおける自キャラクタやミサイル、ボールなど、画面上を動き回るグラフィックは スプライトを用いて表示します。 スプライトは最大128個表示することができますが、 1ライン上には同時に32個までしか表示できません。
スプライト同士が重なった場合には、番号の小さいものが手前に表示されます。 スクリーン1に対しては、全てのスプライトが手前に表示されます。スクリーン2に対しては、 各スプライト毎に優先度を指定し、手前、あるいは奥に表示することができます。
さらに、スクリーン2と同様のウィンドウ機能が利用できます。ウィンドウの内側・外側どちら で表示を行うかを各スプライトキャラクタ毎に設定します。

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

@キャラクタをデザインし、データに変換。

付属の画像変換ツール『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();」はプログラム終了後なにかキーが押されるまで 待機します。すぐに終了してしまうと実行結果が確認できないためです。


スプライトの移動

スプライトを移動させます。スクリーンのスクロールと同様、画面から消えると 逆側へ移動し、表示を続けます。スプライトの表示は簡単な関数にしています。 実機ではスクリーン1にはOSの画面が表示されたまま、スプライトが移動します。
#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 );
        }
    }

}