Pyxelでは9個のサンプルが用意されています。
これらのサンプルのソースコードを理解することで、Pyxelでのゲーム開発をどのようにすれば良いのかがわかってきます。
本記事では、そのサンプルについて解説しています。
今回は、6個目のサンプルについて解説します。
06_click_game.pyはどんなサンプル?
今回のサンプルはゲーム性を持ったものになります。
丸いボールのようなものが複数個動いています。
それをクリックすると、はじけたように複数個の小さいボールに分裂します。
またボール同士がぶつかると、くっついて大きくなります。
06_click_game.pyのソースコード解説
では、ソースコードの解説をしていきます。
これまで通り、全てのソースコードはここには載せないので、各自エディタで確認してください。
またこれまでに解説した内容については、割愛することがあります。
06_click_game.pyの構成
06_click_game.pyでは、3つのクラスで構成されています。
前述までボールと言っていたBubbleのクラスとBubbleの位置情報をもつVec2クラス、そしてAppクラスになります。
(丸い物体はボールでなくて、泡だったんですね)
Vec2クラスは特に特出すべきことは無いので、割愛します。
Bubbleクラスについて
Bubbleクラスで定義されているメソッドは__init__メソッド(コンストラクタ)とupdateメソッドの2つです。
__init__メソッド(コンストラクタ)
Bubbleの初期設定をしています。
具体的にはBubbleの大きさ、Bubbleの初期位置、Bubbleの速度、Bubbleの色の設定になります。
Bubbleのランダム性を持たせるために、randomが使用されています。
random.randint(X, Y)
このrandom.randintは第1引数と第2引数の間の整数値のランダム値を生成します。
また、
random.uniform(X, Y)
は第1引数と第2引数の間の浮動小数点数のランダム値を生成します。
updateメソッド
Bubbleの位置情報の更新と速度の更新の処理です。
速度の更新処理では、壁にぶつかったら反射するための処理が実装されています。
Appクラスについて
updateメソッド
ソースコード69行目~95行目の処理は、マウスで左クリックしたときの処理が実装されています。
75行目にある
if dx * dx + dy * dy < bubble.r * bubble.r
の条件がBubbleをクリックしたかどうかの判定になっています。
Bubbleをクリックした場合、Bubbleが分裂して新しいBubbleを生成する処理がそれ以降に続く形になっています。
次に97行目~119行目の処理ですが、これはBubble同士がぶつかった時の処理になります。
107行目の
if dx * dx + dy * dy < total_r * total_r
でぶつかったかどうかの判定をして、ぶつかった場合はくっついて大きなBubbleになるnew_bubbleについての設定をしています。
ぶつかった元のBubbleはnew_bubble生成後、削除されていますね。
del self.bubbles[i]
del self.bubbles[j]
drawメソッド
これはいつもの画面描画の処理になります。
処理の最初に一度画面クリアした後、Bubbleに関する描画とBubbleをクリックするまで表示されているテキストの表示の処理です。
まとめ
今回は、クリックゲームである06_click_game.pyについて解説しました。
Bubbleの衝突判定やマウスのクリック判定などで少し数学的な処理をしていて難しいと感じるかもしれませんが、実際に実装する際は一度紙などで図を描きながら考えるとわかりやすいと思います。
自分もこういう位置情報的な処理はいったん紙に書いて、どんな処理が必要かということを考えることが多いです。
コメント