STGでよくある、「敵が自機と近すぎると、敵弾を撃ってこなくなる」
いわゆる、”弾封じ”を再現したいと思っています。
「敵が敵弾を撃」、というサブルーチンとは別のところで、
自機と敵の距離を測って、近づきすぎたらフラグを立てる、ということを
しているのですが、ここで立てたフラグを、「敵が敵弾を撃つ」条件に
当てはめても、敵が1機なら正常に動くのですが、敵が複数登場すると
有効になりません。
dim tf : dim tfd ;範囲内の敵機を数えるための配列 dim tfx : dim tfy ;敵機座標の配列 dim teki_shot ;弾封じ用の配列 ;ザコがランダムに出現する--------------------------------------- if jiki_st = 2{ ;自機が生存中なら tb = 20 ;敵スプライトの割り当て開始番号 s = 0 repeat ;くりかえし es_find s, 0, tb, 59 ;Sに全てのtype値で検索した20から59までのスプライトNOを検索した結果を返すよ if s < 0 : break ;0ならbreakで出る tb = s + 1 ;次の検索をするため、Sに+1する es_get x, s, 3 ;xに検出したSのX座標を取得 es_get y, s, 5 ;yに検出したSのY座標を取得 if f \ 50 = 0 & y<600 & teki_shot = 1{ ;y座標が600以内,弾封じされてなければ es_exnew z, 2000, 3000 ;変数Z(敵弾)に1000から2000までのスプライトを設定 if z >= 0 { ;空きが在れば es_set z, x+32, y+32, 500, 0 , 10 ;zはX,Y座標から敵弾[4]を射出 es_type z, 16 ;type値は16 es_aim z, myx+32, myy+32, rnd(50) + 110 ;zは自機座標を狙って飛んでくる動きをするよ } } loop } return *tama_huuji;------------------ ;※敵機と自分の距離 if jiki_st >=1 { ;自機が復活中以上なら tf=0 ;変数[tf]を初期化 repeat ;繰り返し開始 es_find tf,8,tf:if tf=-1 : break;画面中の敵type値[8]の数探す if tf>=0 { ;画面内に敵がいたら es_get tfx,tf,3 ;[tfx]に、[tf]のX座標を取得する es_get tfy,tf,5 ;[tfy]に、[tf]のY座標を取得する es_dist tfd,tfx,tfy,myx+32,myy+32 ;[tfd]に固定小数で、距離が返ってくる emint tfde,tfd ;[tfde]に整数にした数字が入り if tfde <= 128 & tfde >= -128{ ;敵機と自機の距離[tfde]が[128]ドットの範囲内なら teki_shot = 0 ;敵ショットフラグを[0]撃たないにするよ } else { ;範囲外に出たら teki_shot = 1 ;敵ショットフラグを[1]撃つにするよ } tf+ ;次の敵機[tf]を探すためのtf+ loop ;repeatに戻れ } } return ;メインルーチンに戻る
コードの貼り付けはこんな感じでいいんでしょうか…?
結局、「敵スプライト」とは別に、「敵弾を発射するスプライト」、
「敵弾を発射しないスプライト」を別々に作成し、範囲内に入ったら
es_chr で「敵弾を発射しないスプライト」に変える
といった、一見回りくどい?ような方法がベストなのかな、
と考えていますが…
なにかいい方法はありませんでしょうか?