>> シューティングゲーム作成入門トップに戻る

ボスを作ろう2(移動パターン追加)

今回はボスの移動パターンを増やしてみます。

最終的には一定ごとのダメージをくらったら、
順番に移動パターンを変化させていくんですが、その仕組みは後で説明するとして、
とりあえず移動パターンのコードだけ追加します。
単純に左右に移動するパターンと三角形のライン上を移動する移動パターンの2つを追加します。

まずはMovePattern2関数です。
こちらは単純に左右に移動するだけの移動パターンです。

void BOSS::MovePattern2()
{
	if(!wait){

		x+=raise2;

		if(x==70){
			raise2=2;
			wait=true;
		}else if(x==330){
			raise2=-2;
			wait=true;
		}
	}

	if(wait){
		++waitcount;
		if(waitcount==20){
			wait=false;
			waitcount=0;
		}
	}
}

まず変数の説明ですが、waitというのはフラグ用の変数です。
ボスがどちらかの端まで移動したら20カウントほど停止させます。
端に達したときにそのフラグを立てるようにします。
下側のif文を見てもらえればわかると思いますが、フラグが立っているときに、
待機中のカウントを示すwaitcountを増やし、20に達したときにフラグをカウントを元に戻しています。
こうすることで端に達した瞬間に20カウント待機させることができます。

上側のif文の説明ですが、
waitフラグが立っていなければ、x座標に移動量を示すraise2を加えています。
x座標が70に達したら移動量を示すraise2の値を2にして、waitフラグをtrueにします。
こうすることで20カウント待機した後、増加量が変わった状態でx座標にraise2が加算されていくので、
次はxが330になるまで移動し続けます。
330になったら、移動量を変えてwaitフラグを立ててるだけです。

こうすることで以下の動画のような移動パターンを追加することが出来ます。


次にMovePattern3関数です。
こちらは三角形のライン上を移動させる移動パターンです。

void BOSS::MovePattern3()
{

	double temp;

	angle+=2;

	temp=sin(angle*PI/180);

	x = prev_x+temp*movex;
	y = prev_y+temp*movey;

	if(angle==90){

		if(p3_state==0){
			MoveInit(70,80,1);
		}else if(p3_state==1){
			MoveInit(200,160,2);
		}else{
			MoveInit(330,80,0);
		}
	}

}

このMovePattern3関数では、sin波を使って移動を滑らかに行うようにします。
angleは2ずつ増加するようにし、それを元に計算されたsin波を一時変数tempに代入してます。
その下で座標の計算を行っています。
prev_x,prev_yは前回の座標が入っており、movex,moveyは前回の位置から目的の位置までの
距離が入っています。
前回説明したAppear関数の時と一緒ですね。
その値にsin値tempをかけているので、滑らかに移動しながら目的の位置まで移動することになります。
その前回の座標を保存したり、目的地までの距離はどこで計算しているのかというと、
その下のif文の中で実行されているMoveInit関数で行われています。
90度になるとsin値は1になるので、目的地まで移動したことになります。
するとif文の条件にマッチするので、if文の中の処理が行われます。
p3_stateという変数は三角形のライン上のどの頂点へ移動するのかを示す変数です。
0なら左端頂点、1なら真ん中の頂点、2なら右端頂点を意味します。
それぞれMoveInit関数を実行していますが、以下のようになっています。

void BOSS::MoveInit(double bx,double by,int state)
{

	prev_x=x;
	prev_y=y;

	movex=bx-x;
	movey=by-y;

	angle=0;

	p3_state=state;
}

引数のbx,byは目的地の座標を指定します。
stateは次にどの頂点に移動するのかを示すp3_stateの値を指定します。
prev_x,_prev_yには現在の座標をそのまま代入しときます。
movex,moveyを目的地までの距離を表すので、目的地の座標を示す、
bxからxの減算、byからyの減算をした値をそれぞれ代入しています。
angleも当然0にしておき、p3_stateに第三引数で指定した、次の移動頂点を示す値を代入してます。
このMoveInit関数を実行したあとに、またMovePattern3関数を実行すると、
sin値が1、つまりangleが90になるまで、目的地まで滑らかに移動させることができます。
また90度になると、今度はp3_stateの値が違うので、
上記if文の違う分岐のMoveInit関数が実行されるので次の頂点へまた移動することができます。
この移動をループし続けます。

このMovePattern3関数では以下の動画のような移動を行うことができます。

以上で移動パターンを三つ用意できました。
実際は一定ダメージを負ったら移動パターンを変化させるようにしますが、
その説明は当たり判定の説明の時に説明します。
今回の説明は以上です。

>> 【ボスを作ろう3(ショット発射)】に進む
>> シューティングゲーム作成入門トップに戻る