1MAP-STG ショットを複数にした


2018年 5月5日
 
 
 今回はショットを複数撃てるようにした。

 それかから switch文を使ってタイトル、ゲーム、ゲームオーバーのモードを分けるようにした。

 まだ 1ループプログラムだ。
 
 


 
 
 それではソースを

 
 

それではプログラムの説明

 今回は単発だったショットを複数にし、敵と同じで一定の間隔で発射するようにした。

 見てもらえれば分けるけど、プログラム的に敵のソースとほとんど同じ。

 sf,sx,sdx,sy,sdyを配列変数にしただけだ。

 ちょっと説明が要るのは、ショットと敵の当たり判定は 1つの弾と敵全部を総当りする必要がある。

 これもなんか「外積」とか言うのを使うと当たり判定を高速にできるらしいんだけど、外積は大学の数学らしくて自分はやり方を知らない。
 
 
 ショットも敵も敵弾(まだ無いが)も大体同じ処理をする。

 1、出現処理
   a、フラグon
   b、初期位置をセット
   c、移動値をセット

 2、移動処理
   a、現座標に移動量を +
   b、当たり判定
   c、場外判定
 
 
出現処理

repeat sb
 sb=ショット最大数、ショット最大数回分繰り返すという意味。

if sf(cnt)>0 : continue
 cntは repeatの値で繰り返し何回目か、1回目の値は0、2回目は1、3回目の値は2となり 1つずつ増える。
 sf=出現フラグで、0=出現してない、1=出現してる。
 配列変数 sf(cnt)が0でないならつまり既にその番は仕様中なら、continueこれは repeatを先頭に戻って繰り返して下さいという意味。

sf(cnt)=1
 出現フラグを onにする。

sx(cnt)=double(px) : sy(cnt)=double(py)
 初期位置をセット、px pyは自機の座標だが、ショットは自機からでるので。
 doubleはこの変数は実数(小数点を扱う)にするという意味。

xn=double(x-px)
yn=double(y-py)
rad=atan(xn,yn)
 x yはマウスの座標、マウスと自機(ショット初期位置)の角度を求めてます。
 詳しくは前回を参照して下さい。

sdx(cnt)=sin(rad)*ssp
sdy(cnt)=cos(rad)*ssp
 求めた角度から、ショットの移動量を求めてます。
 sdx sdy=ショット移動量、sspはショットスピードです。

break
 ここで repeatを抜ける(終わらせる)という意味で、一個ショットを設定したので抜けます。

sc=scb
 発射間隔をリセットしてます。

 
 
移動処理

scn=cnt
 repeat内で repeatを使ってるため、ショット用の cnt値を scnに渡して代用します。

sx(scn)+=sdx(scn)
sy(scn)+=sdy(scn)

 現座標に移動量を足して移動します。

repeat eb
if ef(cnt)=0 : continue

 敵との当たり判定、総当りになります。

if sx(scn)<ex(cnt)+ox and ex(cnt)<sx(scn)+ox and sy(scn)<ey(cnt)+oy and ey(cnt)<sy(scn)+oy {
 当たり判定処理、これについては前回を参照して下さい。

ef(cnt)=0 : sf(scn)=0
 当たった場合は、その敵とショットのフラグを 0にして消します。

scr+
if hiscr<scr : hiscr=scr

 スコアを足して、ハイスコアより上ならハイスコアを上書きします。

break
 敵用の repeatから抜けます。

if sf(scn)=1 : if sx(scn)<0-ox or wx<sx(scn) or sy(scn)<0-oy or wy<sy(scn) : sf(scn)=0
 場外判定、この場合画面の端(上下左右 4辺)より外ならフラグを off(0)にして消します。
 左端と上端は判定座標をキャラの大きさの分だけマイナスして判定します。
 そうしないと完全にキャラが枠外に出ません。

 
 
 さて、この仕様だとショットと敵の発生間隔が同じだった場合、百発百中だと延々とゲームが続く。

 敵を撃ちもらした分だけ包囲網が狭まるのだが、そこでショットの発生を敵より僅かに早くすると追い詰められてからの復帰ができる。

 この場合、敵のスピードが遅かったり、発生間隔が短いと簡単すぎてやはりゲームが終わらない。

 そこで敵のスピードを早くして、ミスを誘発するようにした。

 ゲームバランスを考えるのに一番時間がかかってる。
 
 
 mainf switch文にかけて、タイトル画面とゲームと GAMEOVER画面を振り分けてる。

 つまり mainf=0はタイトル、1=ゲームモード、2=GAMEOVER画面モードだ。

 表示も同じやり方で、前よりスッキリしたと思う。

コメントを残す

メールアドレスが公開されることはありません。