敵弾の生成と移動

さてお次は敵弾の生成です。ここのポイントは、如何にして自機を狙ってくる弾を撃たせるか?という部分です。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

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

前のページへ戻る 解剖記のメニューへ戻る 次のページへ進む