1MS ショットをマシンガン化してみよう


2018年 5月25日
 
 
 今回はショットをマシンガンみたいにしてみる。
 
 
 変更点としては、

1、ショットの速度を出すためにショットの移動処理を 1フレームに複数回する

2、照準か敵ヒット場所に着弾する

3、敵に耐久度をもうけ一撃で倒されないようにする
 
 
 ver.0.004



 
 

1、ショットの速度を出すために移動処理を 1フレームに複数回する

 これはなぜかと言うと、敵の大きさ以上の速さでショットを移動させると「すり抜ける」からです。

 そうなると、例えば敵の大きさが 20ドットだったとして、1フレームにショットを 20ドット以上の速さで動かせません。

 でもマシンガンなら弾速は早くないとね。

 これも本当は面と線との当たり判定とかすれば 1回で済むと思うんですけど、数学的に少し難しいと思うので今回はしません。

 そこで今回はもっとも初歩的な方法で、1フレームに複数回ショットの移動処理と敵との当たり判定の処理をする方法を使います。

 1フレームに 3回移動させて、表示は 3回目の座標の 1回となり、移動スピードは 1フレームで20 × 3 = 60となります。

 3回移動させる必要があるのは、敵との当たり判定を都度するためです。

 ちょっと間の弾の表示が抜けるので間延びした感じにはなりますが、だから本来 STGは FPS60(1秒間に 60回表示)で作る事が多くて、このゲームでは FPS15ですけど、FPS60なら何もしなくても 1フレーム 20移動 × 4倍FPSで 4倍の速度が出て、表示も 4倍してくれる訳です。

 しかしこれはブラウザゲーム前提なので、様々な環境を考慮してあえて FPS15にしてます。

 もう一つの方法は、最初に 3発発射させて 1つ目は2回、2つ目は 1回、3つ目は 0回移動させておく、という方法を考えましたけど、ちょっとややこしくなるので、とにかく今回はもっともベタな方法にしてます。

照準か敵ヒット場所に着弾する

 前回までは画面端まで飛んで行きましたが、今回は照準地点で止まるようにしてます。

 合わせてマシンガンらしく、集弾率表現として着弾点がランダムにずれるようにしてます。

 それからグラを用意して着弾表示をするようにしました、マシンガンらしいでしょう。

 ← 小さいけど着弾エフェクト

 着弾点のずらしは、初歩的に最初のカーソル座標に乱数で + -してずらしてますが、本当はこれだと遠くを狙えば狙うほど集弾率が良くなってしまうので、ラジアン(円周率)の値にランダムで + -した方が均等で良いと思いますが今回は割愛します。

 着弾判定ですが、始めに全移動距離を測定しておき、移動した量がそれを上回れば着弾地点に座標を固定という方法をとってます。

敵に耐久度をもうける

 装甲がゴリゴリと削れる表現として、敵に HP(耐久度)をもうけました。

 集弾率表現と合わせて、ずいぶんマシンガンらしくなったのではないでしょうか。

 本当は後、効果音を付ければだいぶらしくなると思いますが、まだ割愛します。
 
 
 それではソースを

 カーソルのグラ(少し大きくした)

 自機、ショット、敵は前回と同じ。
 
 

プログラム解説

ショットの処理

skc=3
 ショットを 1フレームに移動する回数。

su=32
 集弾率、ランダムに 32ドットずれる。

 xx=x-su/2+rnd(su) ; ショットの着弾点x
 yy=y-su/2+rnd(su) ; ショットの着弾点y

 カーソル座標に半分値を -して全値ランダムを +

dim sxb,sb ; 終点座標x
dim syb,sb ; 終点座標y

 sxb(cnt)=xx : syb(cnt)=yy ; 終点座標

 着弾地点座標。
 
 
ddim skn,sb ; 現移動距離
 ショットの現在移動した距離を入れておく。

ddim skb,sb ; 最終移動距離
 ショットの始点から着弾点までの距離を入れておく。

x2=xx-jx : y2=yy-jy
 skb(cnt)=sqrt(x2*x2+y2*y2)
; 最終移動距離

 sqrt = ルートの値を出す HSPの命令です。

 xx=ショット終点座標、jx=始点座標です。

 最初に全移動距離を算出するが、これは 2点間の距離を測る方法、ピタゴラスの定理を使う。

 a2乗=b2乗+c2乗 → a=√(b × b)+ (c × c)

 直角三角形の斜辺の2乗は、横の長さの 2乗 + 縦の長さの 2乗に等しいとかなんとか。

 これをベタに書くと sqrt((xx – jx) × (xx – jx) + (yy – jy) × (yy – jy)) となるが見難いので上記のようにしてる。

 これで 2点間の距離が分かる、例によって数学的な事は自分には良く分からないのでググってね。
 
 
skn(scn)+=ssp ; どれだけ距離を進んだか
 if skn(scn)>=skb(scn) { ; 終点判定
  sx(scn)=double(sxb(scn))
  sy(scn)=double(syb(scn))
  sf(scn)=-1 ; 着弾フラグ
 }

 移動距離(skn)が全距離(skb)を超えたかどうかで着弾したかどうか判定する。

 その場合ショットの座標を最終座標にし、フラグを着弾したとする値 -1にする。

 -1は表示の時に着弾グラを表示させるのに使い、着弾表示したらその場で 0にしてフラグを消す。
 
 
ddim sr,sb ; 向き
 向き、敵の向きと同じ要領で算出してる。
 着弾グラの表示の時に使う。

 
 
敵の処理

ehpb=40 ; 耐久度
 敵の最大耐久数。

dim ehp,eb ; 耐久度
 敵の耐久数。

 ショットが当たった時に -1して行き、0になったら破壊。

コメントを残す

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