0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

4.キャラクターの動作付与

Posted at

4.キャラクターの動作付与

前回はタイル(画像)を読み込みキャラクターを表示させたため、
キャラクターに動作を付けてあげようと思います。

・目次
1.2つのタイル(画像)を追加
2.タイルの切り替え実装
3.動作確認





1.2つのタイル(画像)を追加
 キャラクターに動作を付けるため、2つのタイルを追加する。

main.c
#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サンプルを元にしていますが、不要部分は端折って記載しています。 
 詳しくはサンプルをご確認ください。)

main.c

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.動作確認

ダウンロード.gif

以上!次回はマップを作ろうかな??

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?