今回は、敵を自動生成させて一定の条件になったら敵も弾を発射するようにしていきます。
三角関数を使うので、ちょっとややこしくなりますが、敵を好きな方向に移動させるためには必要な知識なので、マスターしておきたい所です。
敵を自動生成させて弾を発射させるようにする
まずは、敵用の画像と敵が発射する弾の画像2種類を用意しておきましょう。
あらゆる処理を足してきているので、徐々にソースコードが長くなってきましたね。
とりあえず、実行するとどうなるのか先に動画を載せておきます。
私の場合は、パンプキンを敵に見立てて、赤い弾を攻撃手段としています。
それでは、敵の行動に関する処理を解説していきます。
まずは、ランダムと三角関数を使用するので「math」と「random」モジュールをインポートします。
プレイヤーの時と同様に、敵の最大数や座標リストを作ります。また、プレイヤーの時と違うのは角度を管理するリストを用意している所や、敵の種類・速度リストを作った部分です。この辺はゲームの難易度に関わる部分ですね。
敵は、30フレームにつき1体出現させるようにします。この仕様だと1秒に1体って事ですね。
set_enemy()関数で敵を出現させる準備を行います。座標や角度、スピードなどをここでセットするわけですね。第4引数が敵の種類になるので、リストを参考に添え字を指定します。
敵のデータをセットしたら、breakで処理を抜けて新しい敵データをセットするときの為に、ebull_nの値を1増やしておきます。
move_enemy()関数が敵の動きを管理する関数になります。ebull_fがTrueになると敵が存在するという事になるので、移動と描画を行います。
移動方法は、三角関数sin()とcos()を使う事で、XとYそれぞれの移動量を求めることが出来ます。この結果により、座標を変化させて敵の移動を実現します。このプログラムでは90度を指定しているのでプレイヤーに向かってくるようになります。
最終的に、縦横いずれかの画面外に消えたら敵を削除するようにします。
弾の発射タイミングは、敵のY座標が100を超えたらとしています。今回のプログラムは、敵だけじゃなくて弾に関してもset_enemy()関数を使って準備するようにします。
pygame.transform.rotozoomで指定した画像の回転角と拡大率を決めます。パンプキンの画像を「-180」にして、拡大率はそのまま「1.0」にしています。
次の行screen.blitで描画しますが、「ebull_x,ebull_y」の値を中心にして描画したいので、先ほど作成した画像の幅と高さを半分にした値を引いています。
割と長くなってしまいましたが、着実にシューティングゲームっぽくなってきました。
次回は、プレイヤーと敵の当たり判定について実装していきます。