敵が弾を撃つ(1/4)

 敵が自機に向けて弾を撃ちます。

 1.敵の弾の配列変数を宣言する
 2.敵の弾の変数に初期値を代入する
 3.敵の弾を射出する
 4.敵の弾を移動する
 5.敵の弾を表示する

 自機の弾や敵の出現、移動処理と同じようなものですが、三角関数の計算を行う点が違います。これは、HSPの標準機能ではできません。プラグイン、HSPEXT.DLLが必要です。ですが、これはHSPに同梱されています。つまり、これを使うために何かを追加でインストールする必要はありません。これを使うために必要な操作は、プログラムの先頭に#include "hspext.as"と記述することだけです。

三角関数

 自機に向けて弾を撃つには、サイン、コサイン、アークタンジェントの計算が必要です。
  サインコサイン
 (targetx,targety)の、原点(0,0)に対する角度rは、アークタンジェントにより求めます。
  r=atan targety/targetx
 この角度rに対し、単位長さ当たりのx成分dxはコサイン、y成分dyはサインにより求めます。
  dx=cos r
  dy=sin r
 HSPEXT.DLLでは、アークタンジェントはematan、コサインはemcos、サインはemsinという関数を用います。ただし、ematanとemcos、emsinでは角度の定義が違うので、ematanで求めた角度rに対して次の変換が必要となります。
  r=192-r
 つまり、
  ematan r,targetx,targety
  r=192-r
  emcos dx,r
  emsin dy,r
 となります。r,dx,dyは、整数ではありません。固定少数です。また角度は通常の0〜360度でもなければ、ラジアンでもありません。0.0が0度、1.0が360度に対応します。0.5なら180度ですし、0.25なら90度です。上図は数学の座標系で表していますが、HSPEXT.DLLではy軸は下が正方向、角度はx軸のマイナス方向が0度で、反時計回りに増えていきます。(emcos、emsinの場合です。)
  サインコサイン

固定小数

 HSPの標準機能では、数値は32ビットの整数です。これを、上位24ビットを整数部、下位8ビットを小数部として扱うのが固定小数です。(何も指定しなければ、です。何ビットを小数部として扱うかは、emathという命令で指定します。8ビット以外にしたければemath命令を使って指定して下さい。)
  固定小数
 整数部はいいですね? 小数部は、%100000000(=256)が1.0に相当します。%00000000(=0)が0.0に相当します。(ちなみに、HSPでは2進数の頭に%をつけます。)ということは、%10000000(=128)は256の半分なので0.5になりますし、%01000000(=64)はそのまた半分で0.25になります。すると、%10000000(=128)と%01000000(=64)を足した値%11000000(=192)は0.75に相当します。これらは、整数として考えた数字を256で割った値になっていることが分かると思います。
 上図のように、%11010000000は整数として表すと1664ですし、固定小数として表すと6.5です。
 整数部だけを取り出すと、%11000000000(=1536)が6に相当します。小数部8ビットは取り除いて考えますから、%110(=6)です。これは、%11000000000を8ビット右にシフトしたのと同じです。8ビット右にシフトするのは、256で割るのと同じことです。
 ということは、整数部も小数部も関係なく全体として、整数表現を256で割れば固定小数表現に、固定小数表現を256倍すれば整数表現になるということです。「三角関数」の所で、r,dx,dyは固定小数であると書きました。ところが、これらの変数に代入されている値を例えばmes命令などで表示させても、0.5とか1.0とかいう格好では表示されません。整数表現で表示されます。ですから、実際にはそれを256で割った値を表していると理解する必要があります。

例:
#include "hspext.as"

r=32
emcos dx,r
emsin dy,r
mes r
mes dx
mes dy
stop

実行結果:
32    ←固定小数では0.125。45度を表す。
-181   ←固定小数では-0.707
181    ←固定小数では0.707

ビットシフト演算

 ビットシフトとは、各ビットを隣に1つずらすことです。HSPでは、右ビットシフトは">>"、左ビットシフトは"<<"です。例えば、240(=%11110000)を左に1回ビットシフトする(左に1ビットシフトする)計算は240<<1と書きます。この結果は480(=%111100000)になります。
  %0……0011110000 ←240
  %0……0111100000 ←480
 この時、1番右のビットには0が補填されます。左に1ビットシフトするのは、2倍するのと同じです。
 240を右に1ビットシフトする計算は240>>1です。この結果は120になります。
  %0……0011110000 ←240
  %0……0001111000 ←120
 この時、1番左のビットには0が補填されます。右に1ビットシフトするのは、2で割るのと同じです。
 (ただし、負の数を右にビットシフトする場合に限り、1番端のビットには1が補填されます。これは、正負の符号がおかしくならないようにするためにそうなっています。)
 240を右に6ビットシフト(240>>6)すると、3(=%11)になります。
  %0……0011110000 ←240
  %0……0000000011 ←3
 1が2つ消えました。このように、ビットをずらした結果追い出されたビットはなくなります。
 固定小数の値を、普通の整数にするためには、右に8ビットシフトします。
  %0……011010000000 ←1664(固定小数では6.5)
  %0……000000000110 ←6(1664>>8)
 小数点以下は切り捨てとなります。逆に、普通の整数値を固定小数にするためには、左に8ビットシフトします。
  %0……000000000110 ←6
  %0……011000000000 ←1536(固定小数の6)

[目次へ][前へ][次へ] inserted by FC2 system