1MAP_STG ver.0.009 炸裂弾を実装しよう


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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です