龍神録プログラミングの館さて敵情報が確立したので、今度は敵にショットを撃たせてみましょう。今回は追加する部分が多いので、同梱されているプロジェクトの内容と比較しながらご覧下さい。弾幕の登録は、敵が出現してからのカウント数と、設定した弾幕発射カウントが一致した時に行います。敵に設定された、弾幕開始時間はbltimeです。敵が出現してからのカウント数はcntです。よって以下の時に登録します。shot[j].num=i;//num=どの敵から発射されたものか。printfDx("enemy[i].patternの%d値が不正です。}}ここでその弾幕データはどうなっているか、構造体の定義と変数の定義を見てみましょう。"struct.h"はファイルの一番最後になるようにして下さい。---memset(shot,0,sizeof(shot_t)*SHOT_MAX);bullet_tが弾についての構造体です。これもまた、沢山変数がありますが、覚える必要はありません。見ておいて、こんな変数が中にあるんだなとだけ知っておいて下さい。弾にはフラグをはじめ、飛んでいるスピードや角度、座標や状態などが必要なのは当然ですね。中でもtilは最低でも消えない弾のカウント数です。単純に「画面から消えたら消す」では、自分が本当に作りたい弾幕が作れない場合があります。そこで、最低でもtillで設定した時間は弾が画面外に出ても消えないようにする為にこの変数を設定します。effはその弾にどんなエフェクトを付けるか、base_angleは弾の角度が動的に変化する時、その基準となる角度を保存するものです。shot_tという構造体は弾幕データを1つ分管理する構造体です。弾幕データ1つ分に、各変数と、SHOT_BULLET_MAX(ここでは1000)個弾がある構造になっています。shot_tは敵が撃つ弾幕情報なので、敵が一度に表示出来る最大数と同じ数だけ用意しておけばいいでしょう。弾幕データの格納庫を30個用意しておけば、結局弾は30xSHOT_BULLET_MAX個用意することになり、かなりの数用意される事になりますので、bullet_tにはあまり無駄な変数は持たせないようにしましょう。弾幕データ、弾データ共に登録制なので、登録している情報を探して計算します。そこで、弾幕情報メイン部はshot.cppファイル内でこのようになっています。0;}弾幕データの最大数までループして登録されているものを探し、登録されているデータがあれば、計算部に処理を渡します。弾幕の種類はこれからかなりの数作ることになるので、敵の行動パターンの時のように関数ポインタを使っています。実際の計算部は以下のようになっています。}}弾幕メイン関数から弾幕番号がnとして渡されますので、n番目の弾幕データを計算します。弾幕データの中にSHOT_BULLET_MAX個の弾があるので、更にその中で登録されているデータの計算を行います。敵は倒されたらそれ以上弾を発射し続けるとおかしいので、敵は倒されたらそこで弾の登録をやめなければなりません。そこで、最初に敵が倒されたらフラグを2にしているのです。画面中に弾が一つもなければ弾幕を終了します。Hardの0番の弾幕計算関数はshotH.cppでshot_bullet_H000として以下のように計算します。}}shot[n].numは登録した敵のデータ識別番号なので、enemyに対して上記のように利用できます。最後にse_flag[0]=1としているのは、弾の発射音を鳴らすためです。音楽ファイルの管理は一箇所で行った方がいい為、ここではフラグのみを立てます。music.cppファイルに以下の2つの関数を追加します。}}music_iniで、ループの最初に毎回フラグを全て0にします。ループの最後にmusic_playでフラグが立っている番号の効果音を鳴らします。するとPlaySoundMemは一箇所にのみかけばよく、管理もバグチェックも楽になります。後はshot.cppに追加した関数を他から呼べるようにしておきます。sound_se[0]=LoadSoundMem("../dat/se/enemy_shot.wav");最後に弾を描画します。ある弾幕情報(shot)の中の弾(bullet)が発射されていたらそのフラグがオンのはずです。全ての配列のフラグを調べ、フラグがオンになっていたらその種類の弾を表示します。ここで「線形補完描画」というわかりにくい言葉が出てきますが、これをセットして描画することで、「座標1.5ピクセル目に描画」のように、表示したい位置に小数点が含まれるような場合、キレイに中間を補間して描画してくれるのです。ここで、中学の時にならった一次関数「y=10x」のグラフを思い出してください。キツイ傾斜の右上がりですね。こんなショットを撃つ時、小数点を考慮しないピクセル上を進むと、ガタガタになってしまうことが予想できると思います。このバイリニア法と呼ばれる方法で描画することで中間をキレイに補間して描画させます。ように色々な行動を敵が行えば成功です。