Pyxelは9個のサンプルが用意されています。
これらのサンプルのソースコードを見ることで、Pyxelでのゲーム開発をどのようにすれば良いのかを解説していきます。
※サンプルは2021年2月6日時点のものを使っています。
サンプルの内容は今後変更になるかもしれません。
前回は、1つ目のサンプル(01_hello_pyxel.py)について解説しました。
今回は、2つ目のサンプルについて解説します。
02_jump_game.pyはどんなサンプル?
前回のサンプルは文字とロゴが表示されるサンプルだったので、ゲームっぽくはありませんでしたが、今回のサンプルはアクションゲームになっています。
02_jump_game.pyを実行すると下のサンプルが起動します。
キャラクターを左右のキーで操作して、下に落ちないようにフルーツを取って、得点を稼ぐゲームになっています。
bgmや効果音もあるので、『ゲーム』って感じがしますよね。
02_jump_game.pyのソースコード解説
では、ソースコードの解説をしていきます。
ソースコード全部はここに載せないので、各自エディタなどで確認してください。
またこれまでに解説した内容については割愛することもあります。
02_jump_game.pyの構成について
公式サイトの推奨通り、AppクラスでPyxelの処理をラップする形になっています。
今回のサンプルは、前回の01_hello_pyxel.pyでは、Appクラス内のメソッドはコンストラクタである__init__とupdateとdrawの基本的な3つでしたが、今回の02_jump_game.pyでは、さらにプレイヤーと床とフルーツに関するメソッドが追加された形になっています。
1つずつのメソッドの処理は大きくないので、プログラミングが苦手な方でもわかりやすいと思います。
import
1行目
from random import randint
ランダムでフルーツや床を発生させる必要があるので、ランダムを使用するためのモジュールをインポートしています。
__init__メソッド(コンストラクタ)
9行目
pyxel.load("assets/jump_game.pyxres")
今回のサンプルでは、プレイヤー、フルーツなどの画像とbgmが使われています。
Pyxelの大きな特徴として、画像や音楽をPyxeleditorというツールを使用して作成することができます。
作成した画像や音楽はpyxresファイルにまとめられています。
この9行目のコードは、その作成したpyxresファイルをロードする処理になります。
引数にpyxresファイルが置いている場所のパスを指定します。
12行目~21行目
ここでは変数の初期化をしています。
各変数の説明を簡単にしておきます。
変数 | 説明 |
---|---|
score | 得点 プレイヤーが下に落ちると0に戻る |
player_x | プレイヤーのx座標(横位置) |
player_y | プレイヤーのy座標(縦位置) |
player_vy | プレイヤーの縦方向の速度 |
player_is_alive | プレイヤーの生存フラグ 生きている間はTrue |
far_cloud | 遠くに見える雲 |
near_cloud | 近くに見える雲 |
floor | 床 |
fruit | フルーツ プレイヤーが取ると得点アップ |
23行目
pyxel.playm(0, loop=True)
10行目でロードしたpyxresファイルからbgm再生する処理です。
第1引数の0は0番の音楽を再生するという設定です。
第2引数は音楽のループ再生設定になります。
Trueに設定することで、ループ再生します。
updateメソッド
updateメソッドにプレイヤー、床、フルーツの処理をすべて書かず、それぞれさらに関数化しています。
update_playerメソッド
プレイヤー情報を更新するメソッドになります。
40行目~41行目
if pyxel.btn(pyxel.KEY_LEFT) or pyxel.btn(pyxel.GAMEPAD_1_LEFT):
self.player_x = max(self.player_x - 2, 0)
キーボードの左キー、またはゲームパッドの左ボタンを押した時のプレイヤーの移動処理です。
Pyxelはキーボード操作だけでなく、ゲームパッドにも対応しているのは便利ですね。
x座標について簡単に説明します。
左端を0とし、右にいくにつれて大きくなっていきます。
41行目では、プレイヤーが画面の左端からさらに左にいって見えなくならないように、最小で0で止まる処理をしています。
46行目
self.player_y += self.player_vy
プレイヤーの縦方向の位置の処理です。
縦方向の速度を足し合わせることで、縦方向の位置を更新しています。
y座標についても簡単に説明します。
上端を0とし、下にいくにつれて大きくなっていきます。
47行目
self.player_vy = min(self.player_vy + 1, 8)
プレイヤーの縦方向の速度の更新処理です。
下に落ちる方向速度が8よりも大きくならない処理が入っています。
49行目~59行目
プレイヤーが下に落ちてしまった時の処理になります。
52行目の
pyxel.play(3, 5)
では、落ちた時の効果音を出しています。
55行目~59行目のスコアなどの初期化は、プレイヤーが落ちた後少し時間をあけて復活する時間をつくるために54行目のように条件判定をつけています。
update_floorメソッド
is_activeという変数が出てきます。
床はプレイヤーに踏まれると下に落ちて行くようになっているのですが、プレイヤーに踏まれていない床はTrueになっています。
プレイヤーが床を踏むと、プレイヤーがジャンプするように上方向に速度を設定し、is_activeをFalseして床が落ちるように処理しています。
さらにスコアが10プラスされて、効果音が鳴るようになっています。
またxとyという変数も出てきますが、これは床のx座標、y座標になります。
update_fruitメソッド
フルーツは床と処理の内容は似ています。
フルーツは床と違って数種類あるので、kindという変数が使われています。
drawメソッド
updateで更新した内容を基に、描画する処理になります。
前回の01_hello_pyxel.pyと同様に画像データはblt関数を使って呼び出しています。
まとめ
今回は、アクションゲームである02_jump_game.pyについて解説しました。
ここに書かれているソースコードが理解できれば、これに似たアクションゲームは自作できるようになるでしょう。
まずは、ソースコードを理解し、そのソースコードをいろいろと変更してみて自分なりのゲームを作っていくのがおススメです。
※サンプル3つ目の解説記事も作りました。
コメント