2021年 6月 10日
1段落したので次の作品を作るまで、つなぎで 1MAP_STGをいじってみたいと思う。
ちなみに、ここから第三期にしてみたいと思います。
ver.0.009は炸裂弾を作ってみたいと思う。
炸裂弾というのは着弾したら爆発する弾、榴弾とも言う。
弾頭が飛んで行き
着弾したら爆風が広がります
爆風の範囲内の敵にダメージを与えます。
グラフィックはドットエディターで 64ドットでアニメを確認しながらザッと形を描いて
グラフィックソフトで 128ドットにしてエアブラシみたいので描いてる。
やはり、あまりうまくは無いが、重要と言う訳でも無いので妥協する。
炸裂弾に対応する敵を作る。
追尾式のミサイルを多数発射する敵にする
プログラム
今までの技術で出来るので特に新しい事は無い
炸裂弾
#deffunc eb_set ; 出現 repeat ebb : ebn=cnt if ebf(ebn)!1 : continue if ebc<=0 : ebf(ebn)=0 : break ; 弾薬が無い ebc- ; 弾薬消費 ebf(ebn)=2 ; 発射 ebx(ebn)=jxf : eby(ebn)=jyf ; 始点座標xy xn=ebxb(ebn)-ebx(ebn) ; 自機とマウスの距離x yn=ebyb(ebn)-eby(ebn) ; 自機とマウスの距離y ebr(ebn)=atan(yn,xn) ; 距離xyから角度を求める ebdx(ebn)=cos(ebr(ebn))*ebsp ; 角度とスピードから移動量xを求める ebdy(ebn)=sin(ebr(ebn))*ebsp ; 角度とスピードから移動量yを求める ebkn(ebn)=0.0 ; 現移動距離をリセット ebkb(ebn)=sqrt(xn*xn+yn*yn) ; 最終移動距離 loop return #deffunc eb_syo ; 爆裂弾移動処理 ; 爆裂弾移動処理 repeat ebb : ebn=cnt switch ebf(ebn) case 0 : swbreak case 1 : swbreak case 2 ; 移動 ebx(ebn)+=ebdx(ebn) ; xの移動 eby(ebn)+=ebdy(ebn) ; yの移動 ebkn(ebn)+=ebsp ; どれだけ距離を進んだか if ebkn(ebn)>=ebkb(ebn) { ; 終点判定 ebx(ebn)=double(ebxb(ebn)) eby(ebn)=double(ebyb(ebn)) ebf(ebn)=3 ; 着弾フラグ eban(ebn)=0 ; アニメNo. } swbreak case 3 ; 着弾 eban(ebn)+ : if eban(ebn)=21 : ebf(ebn)=0 if eban(ebn)!9 : swbreak ; 敵との当たり判定 repeat eb : en=cnt ; 敵No, if ef(en)=0 : continue eo2_set ; 大きさセット eo2+=ebo2 ; 敵の半径にショットの半径を足す f=0 hx=ex(en)-ebx(ebn) hy=ey(en)-eby(ebn) if (hx*hx)+(hy*hy)<=(eo2*eo2) : f=1 ; 当たり処理 if f=0 : continue eaf(en)=1 ; 被弾フラグ ehp(en)-=ebp ; 耐久度- if ehp(en)>0 : continue ; 倒したか scr+=escr(ef(en)) ; スコア if hiscr<scr : hiscr=scr ; ハイスコアの更新 if ef(en)=2 and ebc<ebcb : ebc+ ; 炸裂弾入手 ef(en)=0 ; 敵を消す if en=esn : esn_set 0 ; 次の標的を探す vc+=vck ; バルカンの残弾数を増やす if vc>vcb : vc=vcb ; 最大数 loop swbreak swend loop return
着弾点まで飛んでいくモードと、爆風が広がるアニメモードがある。
当たり判定は爆風が広がった時点、9枚目のアニメの時点で行うようにしている。
当たり判定については円形なので中心点と敵との距離のみで判定できる。
2点間の距離
if (hx*hx)+(hy*hy)<=(eo2*eo2) : f=1
敵ミサイル車両
本体は相変わらず自機に向けて直進するのみだが、ミサイルを発射してくる。
#deffunc e4_set ; 出現 if e4c>0 : e4c- : return ; ウエイト中 e4cb=200-flc/(5000/196) ; 出現間隔 if e4cb<4 : e4cb=4 e4c=e4cb ; 出現ウエイトリセット f=0 ; 空きフラグ確認 ---------- repeat eb : en=cnt ; 敵No. if ef(en)=0 : ef(en)=4 : f=1 : break ; 使用フラグon loop if f=0 : return ; 空きが無い ehp(en)=e4hpb ; 耐久力 ec(en)=rnd(2)*10 ; ミサイル発射位置 r=rnd(4) ; 出現方向 if r=0 : exs=wx1+rnd(wx-wx1)-e4o2 : eys=0-e4o2 ; 上 if r=1 : exs=wx1+rnd(wx-wx1)-e4o2 : eys=wy+e4o2 ; 下 if r=2 : exs=wx1-e4o2 : eys=rnd(wy)-e4o2 ; 左 if r=3 : exs=wx+e4o2 : eys=rnd(wy)-e4o2 ; 右 ex(en)=double(exs) ; 初期位置x ey(en)=double(eys) ; 初期位置y xn=double(jx-exs) ; 敵と自機の距離x yn=double(jy-eys) ; 敵と自機の距離y rad=atan(xn,yn) ; 距離xyから角度を求める edx(en)=sin(rad)*e4sp ; 角度とスピードから移動量xを求める edy(en)=cos(rad)*e4sp ; 角度とスピードから移動量yを求める er(en)=-rad+pai ; 向き return ; ミサイル車両 #deffunc e4_syo ; 敵2移動処理 ex(en)+=edx(en) : ey(en)+=edy(en) ; 移動 ex1=int(ex(en))-e4o2 ; 敵左座標 ex2=int(ex(en))+e4o2 ; 敵右座標 ey1=int(ey(en))-e4o2 ; 敵上座標 ey2=int(ey(en))+e2o2 ; 敵下座標 if jx1<ex2 and ex1<jx2 and jy1<ey2 and ey1<jy2 { mainf=2 : return ; 自機と当たりで GAME OVER } ;if ex2<0 or wx<ex1 or ey2<0 or wy<ey1 : ef(en)=0 ; 枠外でフラグ off ; ミサイル発射 ec(en)+ if ec(en)=30 : e5lrf=1 : e5sx=ex(en) : e5sy=ey(en) : e5_set if ec(en)=60 { e5lrf=2 : e5sx=ex(en) : e5sy=ey(en) ec(en)=0 e5_set } return
ミサイル
誘導で自機を追尾するようにしてる
#deffunc e5_set ; 出現 f=0 ; 空きフラグ確認 ---------- repeat eb : en=cnt ; 敵No. if ef(en)=0 : ef(en)=5 : f=1 : break ; 使用フラグon loop if f=0 : return ; 空きが無い ehp(en)=e5hpb ; 耐久力 ex(en)=e5sx ; 初期位置x ey(en)=e5sy ; 初期位置y xn=jxf-ex(en) ; 敵と自機の距離x yn=jyf-ey(en) ; 敵と自機の距離y rad=atan(xn,yn) ; 距離xyから角度を求める erad(en)=rad ; 移動の向き if e5lrf=1 : erad(en)+=1.0 ; 移動の向き if e5lrf=2 : erad(en)-=1.0 er(en)=-erad(en)+pai ; 表示向き return ; ミサイル #deffunc e5_syo ; 敵5移動処理 edx(en)=sin(erad(en))*e5sp ; 角度とスピードから移動量xを求める edy(en)=cos(erad(en))*e5sp ; 角度とスピードから移動量yを求める ex(en)+=edx(en) : ey(en)+=edy(en) ; 移動 ; 誘導向き計算 xn=jxf-ex(en); 敵と自機の距離x yn=jyf-ey(en); 敵と自機の距離y rad=atan(xn,yn) ; 距離xyから角度を求める if rad<erad(en) : erad(en)-=0.03 if rad>erad(en) : erad(en)+=0.03 er(en)=-erad(en)+pai ex1=int(ex(en))-e5o2 ; 敵左座標 ex2=int(ex(en))+e5o2 ; 敵右座標 ey1=int(ey(en))-e5o2 ; 敵上座標 ey2=int(ey(en))+e5o2 ; 敵下座標 if jx1<ex2 and ex1<jx2 and jy1<ey2 and ey1<jy2 { mainf=2 : return ; 自機と当たりで GAME OVER } ;if ex2<0 or wx<ex1 or ey2<0 or wy<ey1 : ef(en)=0 ; 枠外でフラグ off return
追尾の仕方は向きを修正するだけ
rad=atan(xn,yn) ; 距離xyから角度を求める
if rad<erad(en) : erad(en)-=0.03 ; 左に回転
if rad>erad(en) : erad(en)+=0.03 ; 右に回転
つまり自機とミサイルの角度を求めて、それに合わせるように舞フレーム少しづつ角度を修正するだけ。
自機クリックを PAUSEに変更
マニュアルモードは使う事が無いと思ったし、途中で PAUSEが欲しかったので変更した。
中心の A(自機)をクリックすると切り替わる
それから変更点としてフレームカウント(FLC)で敵の出現数が段々多くなるようにしたので、ずっとゲームが続くという事は無くなったと思う。
1MAP_STG_ver.0.009.zipファイル
1MAP_STG_ver.0.009