4.キャラクターの動作付与
前回はタイル(画像)を読み込みキャラクターを表示させたため、
キャラクターに動作を付けてあげようと思います。
・目次
1.2つのタイル(画像)を追加
2.タイルの切り替え実装
3.動作確認
1.2つのタイル(画像)を追加
キャラクターに動作を付けるため、2つのタイルを追加する。
#include <gb/gb.h>
#include <stdint.h> //ライブラリ参照
#include "tile.c"
UINT8 p_xy[2] = {0};// [x, y] が入る
void main(){
set_sprite_data(0, 2, tile); //2個のタイルを登録
set_sprite_tile(0, 0); // スプライト番号 0 にタイル 0を設定
set_sprite_tile(1, 1); // スプライト番号 1 にタイル 1を設定
//タイル0を表示する位置決め
p_xy[0] = 10 << 3; //x軸160
p_xy[1] = 10 << 3; //y軸16
move_sprite(0, p_xy[0], p_xy[1]); // 0 番目のスプライトを移動
move_sprite(1, p_xy[0], p_xy[1]); // 1 番目のスプライトを移動
SHOW_SPRITES; // スプライトの表示を ON
◇解説
set_sprite_data(0, 2, tile); //2個のタイルを登録
→第2引数に2を指定して、2個のタイルを登録する
set_sprite_tile(0, 0); // スプライト番号 0 にタイル 0を設定
→1つ目のタイルを登録(前回同様)
set_sprite_tile(1, 1); // スプライト番号 1 にタイル 1を設定
→2つ目のタイルを登録
move_sprite(0, p_xy[0], p_xy[1]); // 0 番目のスプライトを移動
→1つ目のタイルを表示(前回同様)
move_sprite(1, p_xy[0], p_xy[1]); // 1 番目のスプライトを移動
→2つ目のタイルを表示
以上で2つのタイルが登録できた。
しかし、現状では2つのタイルが同じ場所に表示され、被って表示されるだけなので、
方向キーを一回入力するたびに
"1つ目のタイルを非表示にし、2つ目のタイルを表示させる"を繰り返す必要がある。
2.タイルの切り替え実装
2つのタイルを交互に切り替えるため、方向キーの入力度にフラグを切り替え、
タイルの表示、非表示を繰り返す。
(large_mapサンプルを元にしていますが、不要部分は端折って記載しています。
詳しくはサンプルをご確認ください。)
uint8_t flag = 1;//歩き画像変更用フラグ
void main(){
move_sprite(0, p_xy[0], p_xy[1]); // 0 番目のスプライトを移動
//move_sprite(1, p_xy[0], p_xy[1]);
while (TRUE) {
if (joy & J_UP) {
if(flag){
hide_sprite(0); // 0 番目のスプライトを削除
move_sprite(1, p_xy[0], p_xy[1]); // 1 番目のスプライトを移動
flag = 0;
} else{
hide_sprite(1); // 1 番目のスプライトを削除
move_sprite(0, p_xy[0], p_xy[1]); // 0 番目のスプライトを移動
flag = 1;
}
}
}
◇解説
uint8_t flag = 1;//歩き画像変更用フラグ
→切り替え用の変数追加
//move_sprite(1, p_xy[0], p_xy[1]);
→2個目のタイル情報だが、最初から表示していると1個目のタイルと被るため定義しない
while (TRUE) {
→While文でループ(large_mapサンプルを参照)
if (joy & J_UP) {
→if文で方向キー入力を判定(large_mapサンプルを参照)
if(flag){
→if文でflag変数の値を判定し真(=1)の場合を追加(初期値は1で設定している)
hide_sprite(0); // 0 番目のスプライトを削除
→hide_sprite関数で1個目のタイルを削除
move_sprite(1, p_xy[0], p_xy[1]); // 1 番目のスプライトを移動
→move_sprite関数で2個目のタイルを表示
flag = 0;
→フラグ変数を0に更新
※上記でフラグ変数を0に更新しているため、次に方向キー入力をした場合、else条件を通ることとなる。
} else{
→if文でflag変数の値を判定し偽(=0)の場合を追加
hide_sprite(1); // 1 番目のスプライトを削除
→hide_sprite関数で2個目のタイルを削除
move_sprite(0, p_xy[0], p_xy[1]); // 0 番目のスプライトを移動
→move_sprite関数で1個目のタイルを表示
flag = 1;
→フラグ変数を1に更新
※上記でフラグ変数を1に更新しているため、次に方向キー入力をした場合、if条件を通ることとなる。
上記実装で方向キー入力のたびにフラグが1→0→1→0・・・と繰り返し、
1個目、2個目のタイルを表示非表示と切り替えることができる。
3.動作確認
以上!次回はマップを作ろうかな??