« [解剖記]敵と自機弾の当り判定 | トップページ | [解剖記]敵弾と自機の当り判定 »

[解剖記]敵弾の生成と移動

さてお次は敵弾の生成です。ここのポイントは、如何にして自機を狙ってくる弾を撃たせるか?という部分です。Hspの命令に√を扱うものがあればそれほど問題にはならないし、sin・cos・tanを扱うものがあればもっと楽なんですが、残念ながら基本命令では四則演算しかできないため、ちょいとひねったことをやっています。


;■ 平方根の準備
dim calc,900
repeat 900
temp=cnt : calc.cnt=temp*temp
loop


;■ 弾生成
*tamaborn
if frame\(8-(level/4))>0 : return
dx=mx-ex.cnt : px=dx : if dx<0 : dx=0-dx
dy=my-ey.cnt : py=dy : if dy<0 : dy=0-dy
dst=(dx*dx)+(dy*dy)
edx=ex.cnt+12 : edy=ey.cnt+12
repeat 900
if dst<calc.cnt : dst=cnt : break
loop

repeat tmax
if tf.cnt>0 : continue
tf.cnt=1
tx.cnt=edx : ty.cnt=edy
rnd ds,8 : ds=level/5+3+ds
txv.cnt=px*ds/dst
tyv.cnt=py*ds/dst

break
loop
return

要は、最終的には弾の運動量(txv,tyv)が、ちゃんと自機の座標方向へ進むものであればいいわけです。その方向は(px,py)で決まってきます。 これは、自機座標から敵機座標を単純に引いたものです。例えば敵機が自機の右斜め前方にいる場合、弾の運動量はx方向はマイナス・y方向はプラスになりま す。

自機座標から敵機座標を引けば、どういう場合でもちゃーんと方向だけは算出できます。後はこれに弾の速さ(サンプルの場合ds)を掛けて、一定数で割ればいいだけです。問題は「割る数をどうやって出すか?」です。

例えば定数で割ると、自機と敵機が近いと遅い弾・自機と敵機が遠いと速い弾という妙な事になってしまいます。要は、自機と敵機の実距離で割ればいいのです。奮闘記の一番最後で二点間の距離の算出方法が解説してありますが、サンプルではそれを応用しています。

もっとシンプルにやるのであれば、xの差(dx)とyの差(dy)で大きいほうで割るという手もあります。Miaさんのページで はその方法が解説してあり、「Aeolianation」でもこの方法で敵弾の処理を行っています。処理速度と手間を考えると、この方法のほうが楽です が、斜めに飛んでくる弾が若干速くなるという欠点があります。いずれにしても、基本命令だけでやろうと思うと結構無理があります。拡張dllを使い、斜め の実距離を計算で出す(hepext.dllを使う)か、ソフト的にやらせる(hspdx.dll = DirectXの拡張dllを使う)方が全然ラクです^^;

そういえば、この「二点間の距離を求める」解説をした際に、もっと簡単なやり方があるよ~と教えてもらったことがありました。これを使ってやるという方法 もありますので、紹介させていただきます。実は私も最初はサンプルを作るときにこれを使おうと思ったのですが、うまくいかないので自分なりに開発したやり 方にしてしまったという経緯があります^^;


bits=10 ; 2のbits乗-1までの整数を平方根として求める。
x=573* ; xに√を求めたい値を代入

b=$400 ;1<<bits;10でないときはこれを使う

repeat bits
b=b>>1 : aa=ans|b : if aa*<=x : ans=aa
loop

mes "√"+x+"="+ans
stop

どなたか、これを使ってもっと簡単に狙い弾を撃たせるスクリプトを開発してくださいまし。私にはできませんでした。お願い~。

« [解剖記]敵と自機弾の当り判定 | トップページ | [解剖記]敵弾と自機の当り判定 »

2.解剖記」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/67538/57445611

この記事へのトラックバック一覧です: [解剖記]敵弾の生成と移動:

« [解剖記]敵と自機弾の当り判定 | トップページ | [解剖記]敵弾と自機の当り判定 »