シューティングゲームにボスキャラを追加する
Python向けレトロゲームエンジン「Pyxel(ピクセル)」を使ってのゲーム作成を通してプログラミングを学習します。
シューティングゲーム作成の記事「Pyxel ソースファイルを分ける - 勉強ボックス管理者ブログ」で,大きなソースファイルを機能のまとまりごとに分割しました。次はそれらを1つのHTMLファイルにまとめてゲームを遊びやすくする手順の紹介と考えていましたが,その前にボスキャラを追加したいと思います(遊んだ時に達成感を得られるように)。
作りたいボスキャラのイメージは,横スクロールのシューティングゲーム「グラディウス」に登場するビッグコアのようなものです。ビッグコアは大きな機体の中央部分が弱点で,そこを攻撃しないと倒すことができません。
実装方法の検討
他の敵より大きなボスキャラを作る方法について案を考えます。
<案1> 大きな敵機を作って,ドット絵のパーツを配置して表示する。ボスキャラ用に周辺と中央部分用の衝突判定を追加する。
<案2> 中央部分だけを敵機にして,描画処理で周りにパーツを表示する。
<案3> 中央部分で1体の敵機。周辺のパーツもそれぞれ1体ずつ敵機として配置する。
案1の衝突判定は複雑になりそうです。案2は周辺部分を弾が通過してしまいます。案3のようにボスの機体をいくつかのパーツに分けて独立した敵機として扱えば今の衝突判定で対応できます。部分的に破壊することもできるということもメリットと考え案3で作成します。
・ボスは1回の攻撃では倒せないようにします。Enemyクラスにlifeという変数を追加して,破壊するまでに何回弾で撃つ必要があるかを設定します。
・ボスのまわりに,BossPartsクラスのインスタンスを表示させます。中央のパーツは2回弾が当たると破壊されます。Boss自身は残りlifeに従ってドット絵の表示を切り替えるようにもしましょう。
・Bossクラスのコンストラクタ(__init__())でBossPartsクラスのインスタンスを作成して,Bossのmove()でパーツの座標も変更します。
ソースコード例
ソースファイルの内容は下記を参照してください。
シューティングゲーム04 - Google ドライブ
effects.py
【ソースコード】はこちらのリンクから確認してください(Googleドキュメント)
・BlastSmallクラス追加
弾が敵機に当たったときlifeが残っている場合に行う「爆発演出(小)」の処理です。
・BlastLargeクラス追加
ボスを撃破した際に行う「爆発演出(大)」の処理です。ドット絵を切り替えるアニメーション表示です。
enemies.py
【ソースコード】はこちらのリンクから確認してください(Googleドキュメント)
・敵の種別を変数に設定して定数として扱う
・Enemyクラスに変数life追加
・Bossクラス追加
・BossPartsクラス追加
enemies.py抜粋
class Boss(Enemy): ・・・ def __del__(self): self.parts.clear()
・__del__()
デストラクタとも呼ばれる特別なメソッドです。インスタンスが破棄されるときに実行されるので,何か後始末をしたいときなどに利用できます。
class BossParts(Enemy): def __init__(self, x, y, lif, idx): super().__init__(x,y,0,0) self.w = abs(BOSS_PARTS[idx][2]) self.h = abs(BOSS_PARTS[idx][3]) ・・・
・abs()
abs()はPythonの組み込み関数です。引数の絶対値を返します。BOSS_PARTSには,ドット絵を反転表示するため幅や高さの所に負の値を設定していますが,当たり判定用の敵機の幅や高さには符号を取り除いて代入しています。
player.py
【ソースコード】はこちらのリンクから確認してください(Googleドキュメント)
・ゲームパッドのボタン対応
ボスキャラ追加とは無関係の変更です。横画面なのでスマホには不向きですがタブレット端末ならばプレイ可能かと追加しました。
・スペースキーを押し続けた場合にも弾を発射するコードに変更
stages.py
stg_main.py
【ソースコード】はこちらのリンクから確認してください(Googleドキュメント)
・Appクラス __init__()
ボスが登場したかどうかのフラグ boss を追加
周回ごとにボスのlifeを増やす目的でステージ番号 stage を追加
・update_title_scene()
ゲームパッドのボタン対応
・update_play_scene()
敵機の出現間隔を修正。タイマーで20秒経過時にボスを出現させる。
敵機の衝突判定にボスを追加
衝突時に life を減らすようにして,lifeが0になった敵機が爆発するように変更
ボス撃破時の処理で爆発演出(大)を複数個インスタンス作成
・update_gameover_scene()
ゲームパッドのボタン対応
ゲームオーバー時の変数初期化を追加(boss,stage)
<実行結果>
Webブラウザでのデモ
http://benkyoubox.starfree.jp/100_game/10_pyxel/mystg_04.html
ボスキャラとの戦いを追加して,遊ぶ時の目標がわかりやすくなりました。
次はBGMの追加に関して少し記載して,その後HTMLファイル作成にしようと思います。