敵の移動



敵の移動は、自機とは違い、勝手に動いていなければなりません。
今回は自機は無視してください。当たり判定とかを次の回でやります。
移動方法は様々なパターンがあります。まっすぐ直進するパターン、ランダムに動くパターン、それぞれ決まった動きをするパターンなどありますが、直進は簡単すぎますし、決まった動きをするとなるとそれなりの動きのデータが必要になってめんどくさいので、ランダムな動きにしましょう。
乱数をよく使います。randomizeは忘れずに!!

	;敵のランダム移動
	randomize	;乱数の初期化

	screen 0,300,400,1	;パレットモード

	ex=130		;敵機の初期位置x
	ey=180		;敵機の初期位置y
	esizex=40	;敵機の大きさx
	esizey=40	;敵機の大きさy

	high=100	;最大移動時間
	low=50		;最低移動時間
	timer=0		;移動時間

	movex=0		;移動量x
	movey=0		;移動量y

*mainloop
	redraw 0
	color : boxf
	gosub *direction
	ex+movex
	ey+movey
	if ex<0 : ex=0 : timer=0		;画面端のチェック
	if ey<0 : ey=0 : timer=0
	if ex>(winx-esizex) : ex=winx-esizex : timer=0
	if ey>(winy-esizey) : ey=winy-esizey : timer=0
	color ,,255 : boxf ex,ey,ex+esizex,ey+esizey		;敵の表示
	redraw 1
	await 1
	goto *mainloop

*direction
	if timer=0 {
		rnd timer,high-low	;差値分のランダム数値
		timer+low		;最低値を足す事により、最低値から最高値−1の間の数値になる
		rnd movex,7
		movex-3			;-3〜3の数になる
		rnd movey,7
		movey-3
	}
	timer--		;0になったら方向を変える
return

mainloop内については、自機の移動を理解していればすぐわかると思います。問題はdirection(方向)サブルーチンです。
mainloopはとりあえずループしているということだけ考えて、directionについてトレースしてみましょう。
1回目、はじめはtimerが0なので、if内が実行されます。
if内の最初の2行は、次に方向転換をするまでのタイマーの長さを少しランダムに設定しています。
上の例では、rndで0〜49(100-50)の乱数を作り、最小値(50)を足すと50〜99の値になります。
次の4行では移動量をランダムで計算しています。上の例では、まずrndで0〜7までの乱数を作りだし、それから3を引けば、movex,moveyは-3〜3の値になります。
そしてtimerを1減らして2回目へ…。
2回目、1回目でtimerが変更されてしまったため、ここではtimerを減らして終了です。



timerが0になったらまたif内が実行され、方向を変えるというようになります。
はっきり言ってこのスクリプトや方法はあまりお勧めできません。私はやっぱり決まった動きをするのが一番いいと思います。めんどいけど。
さあ次は当たり判定です。たぶん一気に遅くなります。


前へ 戻る 次へ