'sqr'atch-note

ちりはつもれど ちりぬるを

pygameの備忘録

Pythonの勉強の中で、『最短距離でゼロからしっかり学ぶ Python入門』を読みながら、pygameというゲームライブラリで雑にシューティングゲームを作ってみて、その中で学んだことの書き留めを試みる。納得行くまで取り組んではいないが、ゲームを作りたいわけでないため、ある程度pygameを触ったなと感触はあるので、先に進むためここに石碑的な意味合いで記録しておく。あわよくば再びpygameを使いたいとなったときに思い出すきっかけとなれば良いなと思う。

Pygameのゲームプログラム構造

pygameで作るゲームプログラムは、無限ループとなるメインループ処理が1つある構造となっている。後で知ったが、Unityの場合は違うらしい。 f:id:sqr2:20210116110022p:plain

  1. ウィンドウのsurfaceを作成(pygame.display.set_mode())、いろいろ初期化
  2. while Trueのメインループと、その中での処理
  3. 何らかの入力をチェックする(pygameのイベントキューに入ってる)
  4. メインループの中で、毎フレームにオブジェクトの更新処理をかける

ウィンドウSurfaceの生成は、ゲームプログラムが実行されて、ゲームのクラスが初期化される(def __init__(self))中で実行される。ウィンドウ内の座標は、左上を原点(0,0)として描かれる。オブジェクトは、ウィンドウの下に行くとy座標が大きくなるし、右に移動すればx座標が大きくなる。上図の中で2~4のオブジェクトは、メインループ内で処理される。例えば、キーボードやマウスからの入力によってキャラクターを動かしたりする処理を実行する。また、2~4の番号はメインループで処理する順番を表す。背景Surfaceの処理をキャラやその他オブジェクトの後に行うと背景Surfaceの下にキャラなどが描かれることになり、ユーザが目にするのは背景のみとなる(背景が透過されてる画像でない限り見えない)。なので、メインループ内の順番は気にしておく必要がある。

メインループの話

f:id:sqr2:20210116100502p:plain:w550

  • Unity触ったことがないので、伝聞で得た情報を元になんとなくこう言うことだろうと図を描いてみた。
  • pygameは、明示的に処理の順番をメインループ内で記述できるので、そのとおりの順番で処理される。
  • Unityは、各オブジェクトの中でUpdate処理等を呼び出す。どのオブジェクトが、どの順番で処理されるかはUnity任せ。
    • なので、例えば敵の位置によって、主人公の処理が変わるような仕組みはやりづらいらしい。
    • 当然、作り込めば処理の優先度を変えられる様子。

pygameのクラス

Surface

  • デジタルイラストにおけるレイヤーのようなもの。背景、キャラクター、宝箱や石、木などモノの要素ごとにSurfaceが1つ作成される。そのSurface単位で処理を作り込んでいく。
  • Surfaceは、pygameの1つのクラスであり、画像オブジェクトを扱う。
    • 属性として、解像度、位置情報(rect)を持たせられる
  • すべてのsurfaceを重ねていくベースとなるsurfaceは、pygame.display.set_mode()で作成する

Sprite

  • pygameのクラスの一つ。
  • surfaceをまとめるグループ(のようなもの?)。グループ化したすべての要素に対してまとめて処理を行える。イメージ的には行列操作? f:id:sqr2:20210116094129p:plain:w150
  • 例えば、敵が複数出てくる場合に、1つ1つをEnemyクラスからインスタンスを作成していくと、処理が煩雑になるし、管理が出来なくなる。なので、.sprite.Group()クラスを利用して、複数のsurfaceをまとめて管理する。
  • Spriteについては、中身がどういう表現になってるのかほとんど分かってない。なので、記述はこの程度に留める。