Pyxelでシューティングゲームを作った話

タイトルの通りPythonでPyxelを使って弾幕シューティングゲームを作りました

ルール

各ミッションの敵を倒せばクリアとなります。全20ミッション。

被弾したらやり直し。当たらなければいいのです。

なぜつくったの

弾幕シューティングが好きだから(超重要)

愛がなければゲーム開発できません

スクリーンショット

f:id:sh00t:20190120155617p:plain

f:id:sh00t:20190120155626p:plain

f:id:sh00t:20190120155720p:plain

f:id:sh00t:20190120155448p:plain

f:id:sh00t:20190120155759p:plain

開発

開発は12/31の夜から始めてだいたい1/15位に完成しました

Pyxelに触れるのは初めてだったので最初はexample実行してコード見たりしてました。

オブジェクトプール

オブジェクトプールは大量に生成・破棄するオブジェクトをあらかじめ(ゲームの最初など)生成しておいてゲーム中で使いまわすのに使用します。今回はEnemyBulletPoolクラスのクラス変数にゲーム開始時にあらかじめ弾を生成しておくようになっています。250発生成するので画面上に最大250発弾が存在できます。弾が250発ある状態で発射しようとしても出ません。ちなみに250発より多く発射しようとして制限に引っかかっている弾幕があります。

敵弾

敵弾は角度と速度を指定して発射します。発射された後の挙動を変更したい場合はそれようの関数を使用して挙動を設定します。

 

Pyxelのコマンドで処理時間確認してみたらupdateよりdrawの時間のほうが時間がかかっていたので60fps諦めようかと考えたりもしたけどオブジェクトプールで弾数制限かけたり敵の弾幕を調整したりしてなんとか60fpsで動作するように

攻略のヒント

とにかく近づいて攻撃してください。敵本体に当たり判定は無いので衝突する心配はないです。

ダメージキャップを設定してないので当たった弾がそのままダメージになります。下の方でショットを撃っていると弾の残存数の制限にに引っかかってショットが途切れてしまいます。逆に少しでも敵に近づいて攻撃すると与えるダメージは大幅に上がり、下に避けるスペースも作れます。位置によってどのぐらい与えるダメージが変化するかはmission1で試してみてください(ほとんどそれ用に作ったものなので)。