Pyxelでは9個のサンプルが用意されています。
これらのサンプルのソースコードを理解することで、Pyxelでのゲーム開発をどのようにすれば良いのかがわかってきます。
本記事では、そのサンプルについて解説しています。
今回は、9個目のサンプルについて解説します。
今回がラストのサンプル解説記事になります。
09_shooter.pyはどんなサンプル?
09_shooter.pyは縦スクロールのシューティングゲームです。
キーボードの矢印キーで戦闘機を操作し、スペースキーでタコみたいなエイリアンを攻撃するゲームになります。
エイリアンを倒すごとにスコアが加算されていき、エイリアンにぶつかるまで倒し続けるというルールです。
bgmはありませんが、ビームの発射音がビームがエイリアンにヒットした時の効果音はあります。
09_shooter.pyのソースコード解説
では、ソースコードの解説をしていきます。
これまで通り、全てのソースコードはここには載せないので、各自エディタで確認してください。
またこれまでに解説した内容については、割愛することがあります。
09_shooter.pyの構成
09_shooter.pyは下記6つのクラスから構成されています。
- Background
- Player
- Bullet
- Enemy
- Blast
- App
また外部関数として、下記の3つが定義されています。
- update_list
- draw_list
- cleanup_list
では、順番に解説していきます。
Backgroundクラス
宇宙空間を移動しているように見せるために、上から下へ動く星のクラスです。
処理は星をランダムで発生させた後、位置情報の更新を行い、描画するという簡単な処理になります。
星の遠近感を出すために、星ごとに速度もランダムに設定しています。
生成された星はリストで管理して、制御しています。
Playerクラス
自機となる戦闘機のクラスです。
updateメソッドでは、キーボードの押したキーによって戦闘機が移動したり、ビームを発射したりするための処理を行い、drawメソッドで描画しています。
Bulletクラス
戦闘機から打ち出されるビームのクラスです。
updateメソッドで位置情報の更新、ビームの消失処理などを行い、drawメソッドで描画する形になります。
Enemyクラス
タコのような敵キャラのクラスです。
updateメソッドでは、まっすぐでなくクネクネしながら下に向かってくるような処理をして、drawメソッドで描画する形になります。
Blastクラス
ビームで敵キャラを倒したとき、あるいは敵キャラにぶつかった時の爆発のクラスになります。
爆発みたいに見せるために、中心から外側にむかって広がる処理がされています。
Appクラス
ゲーム本体のクラスです。
__init__メソッド(コンストラクタ)
自機や敵キャラのグラフィックは、pyxel.image(0).set()の部分で設定されています。
pyxel.image(0).set(0,0,[])が自機で、pyxel.image(0).set(8,0,[])が敵キャラになります。
またビーム発射の効果音や爆発の効果音は、pyxel.sound(0).set()で設定されています。
updateメソッド
画面がタイトル画面、ゲームプレイ画面、ゲームオーバー画面の3種類を切り替えられるようになっています。
このupdateメソッドでは、self.sceneの値によって条件判定を行い、処理の詳細は各画面のメソッドに実装されています。
update_title_sceneメソッド
タイトル画面のメソッドです。
キーボードのエンターキーを押すと、ゲームプレイ画面に遷移するようになっています。
update_play_sceneメソッド
ゲームプレイの処理です。
敵キャラの生成や、敵キャラとビームの当たり判定、敵キャラと自機の当たり判定をしています。
update_gameover_sceneメソッド
ゲームオーバー時の処理です。
drawメソッド
updateメソッドと同じように画面ごとに処理が実行されるように条件判定があります。
draw_title_scene
タイトル画面の描画です。
draw_play_scene
ゲームプレイ画面の描画です。
draw_gameover_scene
ゲームオーバー画面の描画です。
まとめ
ひとつひとつのクラス、メソッドの処理として、そんなに大きい規模のものはないので、わかりやすいと思います。
今回のサンプルは、画面構成がタイトル画面、ゲームプレイ画面、ゲームオーバー画面に分かれていて、それぞれにメソッドが定義されている形になります。
updateの方とdrawの方でちゃんと結びつくように把握しておくことが大切です。
ある程度細かく区切って処理を定義した方がメンテナンスがしやすいので、このサンプルを参考にしてみてはいかがでしょうか。
本格的なシューティングゲームなので、これを改良していくことでオリジナルシューティングゲームも簡単に作れると思うので、ぜひチャレンジしてみてください。
コメント