敵の生成と移動アルゴリズム1

敵の移動や硬さなどを制御する要素には、
  1. 画面に表示できる最大数
  2. x軸座標
  3. y軸座標
  4. x軸の移動量
  5. y軸の移動量
  6. 画面上に表示されているかどうか
最低限この6つが必要となってきます。このうち「画面上に表示されているかどうか」の要素を使って、「敵の固さ」という概念も導入しています。つまり、自機弾が何発か当らなければ倒せない、という敵を用意する事もできるわけです。

また、このサンプルではこれらの要素のほかに、
  • 敵の種類
  • 出現からのフレーム数
といった要素も用意してあります。ゲームをやってみると分かりますが、敵は全部で三種類あり、三種類とも動きや固さ・弾の発射タイミングなどが異なります。これを処理するためにはこういった要素も不可欠でした。


	emax=50			;敵の最大数

;■ 配列定義
	dim ex,emax		;敵x軸座標
	dim ey,emax		;敵y軸座標
	dim ef,emax		;敵固さ・生死
	dim en,emax		;敵種類
	dim exv,emax		;敵x方向運動量
	dim eyv,emax		;敵y方向運動量
	dim et,emax		;敵出現からの時間

;■ メインルーチン
*main
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
	if frame\(25-level)=0 : gosub *enemyborn	;敵生成
	gosub *enemymove				;敵移動
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
	frame++
	level=frame/500+1
	if level>20 : level=20
goto *main


;■ 敵生成
*enemyborn
	rnd temp,7
	if temp=0 : return			;出現しない
	repeat emax
		if ef.cnt>0 : continue	;未使用の要素番号を調べる
		if temp=1 : en.cnt=1	;敵1
		if temp=2 : en.cnt=1	;敵1
		if temp=3 : en.cnt=1	;敵1
		if temp=4 : en.cnt=2	;敵2
		if temp=5 : en.cnt=2	;敵2
		if temp=6 : en.cnt=3	;敵3
		ef.cnt=en.cnt		;固さ
		rnd ex.cnt,640		;初期出現位置x軸
		ey.cnt=-50			;初期出現位置y軸
		exv.cnt=0			;初期移動量x軸
		eyv.cnt=10			;初期移動量y軸
		et.cnt=0			;出現からのフレーム数リセット
		break
	loop
return

まず、メインルーチンでどういったタイミングで敵を生成するかの制御を行っています。このサンプルではレベルが上がっていくと生成頻度が高くなるような形になっています。これを、決まったタイミングでいつも同じように出現するようにしようと思うと、全く違った形の処理(「Aeolianation」ではそういう処理をおこなっています)をしなければなりません。

続いて「敵生成」のルーチンで、どの敵を出現させるのかを決め、その固さや初期出現位置などを決めます。ここでは乱数(変数tempに代入した値)によってそれを決めていますが、弱い敵1を多く出現させ、強い敵3はあまり出現させないようにしています。見たままですが、(敵1:敵2:敵3)=(3:2:1)という出現頻度になっています。


;■ 敵移動
*enemymove
	repeat emax
		et.cnt++
		if ef.cnt<1 : continue
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
		if en.cnt=1 : gosub *enemy1
		if en.cnt=2 : gosub *enemy2
		if en.cnt=3 : gosub *enemy3
	loop
return


;■ 敵1
*enemy1
	pos ex.cnt,ey.cnt : gcopy 2,250,0,50,50
	dx=mx-ex.cnt
	dy=my-ey.cnt
	if dy<350 {
		if dx<0 {
			exv.cnt=exv.cnt-1
			if exv.cnt<-25 : exv.cnt=-25
		}
		else {
			exv.cnt=exv.cnt+1
			if exv.cnt>25 : exv.cnt=25
		}
	}
	if dx<0 : dx=-dx
	if dx<50 : gosub *tamaborn
	eyv.cnt=4
	ex.cnt=ex.cnt+exv.cnt
	ey.cnt=ey.cnt+eyv.cnt
	if ex.cnt<-50 : ef.cnt=0
	if ex.cnt>640 : ef.cnt=0
	if ey.cnt<-50 : ef.cnt=0
	if ey.cnt>480 : ef.cnt=0
return

ここでは敵の動きと弾発射のタイミングを決めています。まず、自機との距離(x軸の差とy軸の差)を求め、y軸方向の距離が350未満の時には、自機に接近する方向にx軸の移動速度を変化させています。この移動速度を一気に変えると恐ろしい動きをすることになってしまうので、だんだん変化させ、一定以上の速度にはならないようにしています。

続いて、自機とのx軸方向の距離(差を求めてから絶対値を出す)を調べ、自機との距離が50未満の時には弾生成ルーチンへ飛ぶようになっています。

・・・そしてここでもまたやっちゃってるんですが、先に表示してから移動をさせてしまっています。これをやってしまうと本来の位置と画像の表示位置が微妙にずれるので、当り判定をした時に「画像は当ってないのに当った」ということが起こってしまうので、移動をしてから表示するようにしましょう。悪い例です^^;

最後に、画面外へ消えたときは消滅させる処理を行っています。画面外から戻ってくるようにするには、ここの値を変えたり処理しないようにすればいいのです。ただ、最終的には消滅させるようにしなければ、画面外に消えた敵がいつまでも残り、emaxで決めた値を超えるとそれ以上敵が出てこないようになってしまうので気をつけましょう。

前のページへ戻る 解剖記のメニューへ戻る 次のページへ進む