敵の移動は、自機とは違い、勝手に動いていなければなりません。
今回は自機は無視してください。当たり判定とかを次の回でやります。
移動方法は様々なパターンがあります。まっすぐ直進するパターン、ランダムに動くパターン、それぞれ決まった動きをするパターンなどありますが、直進は簡単すぎますし、決まった動きをするとなるとそれなりの動きのデータが必要になってめんどくさいので、ランダムな動きにしましょう。
乱数をよく使います。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内が実行され、方向を変えるというようになります。
はっきり言ってこのスクリプトや方法はあまりお勧めできません。私はやっぱり決まった動きをするのが一番いいと思います。めんどいけど。
さあ次は当たり判定です。たぶん一気に遅くなります。