1MAP-STG オートエイムを実装しよう


2018年 6月9日
 
 
 今回はオートエイム(自動照準)を実装します。

 スマホゲームって、どうしても操作に馴染まないというか、画面を操作すると指で隠れますから鑑賞できないというか、だから自動ゲームというか放置ゲーム向きだと思います。

 その点パズドラは良く考えられていると思うけど、精々そのくらいの操作が限界なのかとも思う。

 この 1MAP-STGもスマホだとイマイチゲームしずらいですね。

 そこで今回はスマホ用にオートエイムを作ってみる事にします。

 ver.0.0006


 
 
 オートエイムのやりかたですけど「標的とする敵の座標へ照準を動かす」だけです。

 どの敵を狙うかは、始めと標的を倒した時だけ捜査します。

 毎フレーム事だと計算が頻繁になるし、標的が都度変わるので照準がウロウロします。

 どの敵が一番近いかは、照準と全敵との距離を測ります。

 距離を測るプログラムは前回以前にやりました。

x2=ex(cnt)-cx : y2=ey(cnt)-cy
 nd2=sqrt(x2*x2+y2*y2); 距離

 毎フレーム事、標的にした敵の座標へ照準を動かし、もし照準と敵の距離が照準のスピード以下なら照準の座標を標的の座標に置き換えます。
 
 
 autofでオートモードとマニュアルモードの切り替えをします。

 autof=0でマニュアル、1でオートモードです。

 切り替えは真ん中の自機をクリックする事で行います。
 
 
 それと今回は #deffuncを使って、標的を特定するソースを、メインルーチンから呼び出して使ってます。

 これは標的を特定する箇所がソース内で複数のため、同じソースを何回も書くと多くなるし見づらいからです。

 合わせてこの方法だと、バグを潰しやすくなります。

 実は #deffunc returnについては、ラベルの gosub returnと違いありません。

 つまり *mainというラベルがあったとして #deffunc main と書かれるだけの事です。

 一種のラベル定義命令だと思えば良いと思います。

 ただ変数を渡せるのと、例えばソースが

n=10 : gosub *syori と書くのと
syori 10 と書くのとで

 小さく書けるので、頻繁に使ったりするのだと書きやすいし見易いです。

 HSPの場合の欠点は「呼び出される #deffuncソースが、呼び出しを行うソースより前に無いとエラー」になる事です。

 そのため HSPの場合どうしても、メインルーチンがソースの一番最後に置かれる、という奇妙な事になります。

 昔 BASIC何かのインタプリタ(逐次訳実行)言語では、メインルーチンは処理の早い前に置け、と言うのがセオリーでした(笑)(今のコンピュターの速度では大差無いんでしょうね)
 
 
 今一度キャラを全部置いておきます。







 右クリックして「画像を保存」で使って下さい。
 
 
 それではソースを

 
 

プログラム解説

標的の選定

#deffunc esn_set int esn_setf ; 標的設定
 esn=0 ; 一番近い敵No.
 nd1=1000.0 ; 一番近い距離
 repeat eb
  if ef(cnt)=0 : continue
  if esn_setf=0 : x2=ex(cnt)-jx : y2=ey(cnt)-jy ; 自機に近い
  if esn_setf=1 : x2=ex(cnt)-cx : y2=ey(cnt)-cy ; 照準に近い
  nd2=sqrt(x2*x2+y2*y2); 距離
  if nd2<nd1 : nd1=nd2 : esn=cnt
 loop
return

#deffunc esn_set int esn_setf
 呼び出しルーチン定義。
 int esn_setfは int(整数値)を渡すと言う意味で、呼び出し側は esn_set 0のような書き方になり、この場合 0の値を渡す。

  if esn_setf=0 : x2=ex(cnt)-jx : y2=ey(cnt)-jy ; 自機に近い
  if esn_setf=1 : x2=ex(cnt)-cx : y2=ey(cnt)-cy ; 照準に近い

 渡された esn_setfの値を元に、0の場合は画面中心の自機に近い敵を標的とし、1の場合は動き回る照準に近い敵を標的とする。

 呼び出しが複数個所で行われていて、ショットで敵を倒した場合は 0、つまり自機に近い敵、バルカンで倒した場合は 1、つまり照準のその場所から近い敵となってる。

return
 呼び出されたメインのルーチンへ戻る。

 
 
オートモード

if jx1<x and x<jx2 and jy1<y and y<jy2 : autof=(autof+1)\2 : break
 クリック発動の時に、座標が自機の位置ならオートモードの on off切り替え。

 autof=(autof+1)\2の\(HSPエディタのソース表示では ¥ の表示)は、割った数の余りを求める記号で、この場合実効事に autofの値は 0 1 0 1 0 ・・・となる。
 つまり\3なら、0 1 2 0 1 2と変化する。

if autof=0 : cx=double(x) : cy=double(y) : break ; マニュアルの場合
 マニュアルモードの時は照準の座標、cx cyを、マウス座標 x yにする。

if nd<csp : cx=ex(esn) : cy=ey(esn) : break
 オートモードの時、照準と標的の距離が照準のスピードより近いなら、照準の座標は標的の座標で置き換えるだけで良い。

コメントを残す

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