スプライト表示
ゲームボーイは背景の上にスプライトと呼ばれるモノをいくつか重ね合わせて構成されます。
スプライトは、透明フィルムのようなものであり、何枚もその透明フィルムを重ね合わせることで、ゲーム画面を構築していきます。
考え方としては、フォトショップなどのグラフィックツールのレイヤーのようなイメージです。
今回は、前のページで作成したタイルパターンをプログラム上に取り込んでみます。
まずはソースコードのサンプルを記載します。
#include <stdio.h>
#include <gb.h>
#include <rand.h>
#include "rect.c" /* タイルデータ */
void init( ); /* 初期化処理 */
void disp( ); /* 表示処理 */
void move( ); /* 移動処理 */
UBYTE posx, posy; /* 四角形XY座標 */
UBYTE rect_tile[4]= {0, 1, 2, 3}; /* 四角形タイルパターン */
UBYTE rect_config; /* 四角形傾き状態 */
void main( )
{
init( );
move( );
}
void init( ){
SPRITES_8x8; /* スプライトモードを8*8に設定 */
set_sprite_data(0, 4, TileLabel); /* タイルデータをスプライトとして設定 */
posx=rand() % 160 - 8; /* 四角形初期位置(X座標)を乱数で決定 */
posy=rand() % 144 - 8; /* 四角形初期位置(Y座標)を乱数で決定 */
rect_config = 0; /* 四角形傾き状態初期値 */
disp( );
SHOW_SPRITES; /* スプライトを表示 */
}
void disp( )
{
set_sprite_tile( 0, rect_tile[rect_config] ); /* スプライト番号0を設定 */
move_sprite( 0, posx+8 ,posy+16); /* スプライト0を移動 */
}
void move( )
{
BYTE dx;
BYTE dy;
dx = 1;
dy = 1;
while(1){
if(posx == 0){ /* X座標が最左端のとき */
dx = 1; /* 移動方向を右へ */
}else if(posx == 160 - 8){ /* X座標が最右端とき */
dx = -1; /* 移動方向を左へ */
}
if(posy == 0){ /* Y座標が最上端のとき */
dy = 1; /* 移動方向を下へ */
}else if(posy == 144 - 8){ /* Y座標が最下端のとき */
dy = -1; /* 移動方向を上へ */
}
posx += dx; /* X座標位置変更 */
posy += dy; /* Y座標位置変更 */
rect_config++; /* 四角形傾き状態変更 */
if(rect_config == 4){
rect_config = 0;
}
disp( ); /* 表示処理 */
delay(150);
}
}
【実行画面】
四角形がくるくる回りながら画面上を移動します。
端にくれば跳ね返り、方向を変えます。
では、ソースコードを見ていきます。
まずは、作成したタイルデータが入ったファイル(rect.c)をインクルードします。
スプライトサイズ設定
SPRITES_8x8
スプライトのサイズを8×8ドットに設定しています。
サイズは8×16ドットも設定できます。
set_sprite_data関数
set_sprite_data(UBYTE first_tile, UBYTE nb_tiles, unsigned char *data);
set_sprite_data関数により、タイルデータをスプライトとして設定します。
スプライトとして設定することにより、ゲームボーイ画面上に表示させることが可能になります。
引数には、一番初めのタイル番号、タイル数、タイルデータのラベルを指定します。
上記サンプルコードはGBTDにより下記のように作成したタイルデータを使用しています。
実際に、引数で指定しているデータと、タイルデータ作成時に設定したデータの関連を確認してみてください。
タイル番号0から、タイル番号3まで4つのタイルを作成しています。
タイルデータのラベルを「TileLabel」と設定しています。(A)
set_sprite_tile関数
set_sprite_tile(UBYTE nb, UBYTE tile);
スプライトは最大で40枚(0〜39)まで使用可能となっています。
set_sprite_tile関数で、何番目のスプライトにタイルをセットするかを決めます。
引数には、セットするスプライトの番号、タイル番号をそれぞれ指定します。
move_sprite関数
move_sprite(UBYTE nb, UBYTE x, UBYTE y);
move_sprite関数により、スプライトの位置を変更させます。
引数には、移動させたいスプライトの番号、X座標、Y座標を指定します。
なお、上記サンプルコードでは、引数で指定するX座標に8を、Y座標に16をそれぞれ加えています。
これはスプライトの設定範囲とゲームボーイの表示画面範囲が異なっているために施している処置です。
下記図はスプライト座標とゲームボーイ座標の関係をスプライト座標を軸にして示したものです。
スプライト表示
SHOW_SPRITES;
スプライトを表示させます。
|