はじめに
Pythonでゲームを作ってみたいと思い調べていたところ、Pygame(パイゲーム)という便利そうなライブラリを見つけました。ゲーム開発というと難しそうなイメージがありましたが、Pygameは初心者でも扱いやすいと評判だったため、実際に触れてみることにしました。今回はPygameについて、備忘録としてまとめます。
Pygameとは
Pygameは、Pythonでゲームを開発するためのライブラリです。画像の表示、音声の再生、キーボードやマウスの入力処理など、ゲーム作りに必要な機能がまとめて提供されています。
Pygameは、SDL(Simple DirectMedia Layer/シンプル・ダイレクトメディア・レイヤー:画面・音・キーボードなどをプログラムから扱うための土台となるライブラリ)というマルチメディアライブラリをベースに作られています。SDLは元々C言語用のライブラリですが、PygameはこれをPythonから簡単に使えるようにしたものです。
ゲーム開発というと3Dゲームをイメージするかもしれませんが、Pygameは主に2Dゲーム向けのライブラリです。パズルゲーム、アクションゲーム、シューティングゲームなど、昔ながらのレトロゲームのようなものを作る際に適しています。
Pygameの特徴
Pygameがゲーム開発の学習に適している理由として、以下のような特徴があります。
- 学習コストが低い: Pythonの基本文法を知っていれば始められます。複雑な設定や専門知識が不要で、数十行のコードで動くゲームを作成できます
- 無料で使える: オープンソースライブラリ(自由に使えて改変もできる仕組み)なので、商用・非商用を問わず無料で利用できます
- クロスプラットフォーム対応: Windows、Mac、Linuxのどの環境でも動作します。一度作ったゲームを他のOSでも実行できるのが便利です
- 豊富な学習資料: 長い歴史があるライブラリなので、チュートリアルやサンプルコードが充実しています。困ったときに参考にできる情報が見つけやすいです
- シンプルな構造: ゲーム開発に必要な機能が整理されており、どこから手をつければいいのか分かりやすくなっています
Pygameで扱う基本要素
Pygameでゲームを作る際に理解しておくと役立つ基本的な概念を説明します。
【ゲームウィンドウとSurface】
ゲームを表示するウィンドウは、Surface(サーフェス:英語で「表面」の意味)というオブジェクトで管理されています。Surfaceは「描画できる領域」を表していて、画面全体を表すメインのSurfaceと、キャラクターや背景などの個別の画像を表すSurfaceがあります。
画面に何かを表示する際は、まず個別のSurfaceに画像や図形を描いてから、それをメインのSurfaceに貼り付けるという流れで処理されます。この仕組みのおかげで、複数の要素を重ね合わせて表示できます。
【座標系】
プログラミングでグラフィックスを扱う際の座標系は、数学で習う座標系とは異なり左上が原点(0, 0)になっています。右に進むとx座標が増え、下に進むとy座標が増える仕組みです。数学では上に進むとy座標が増えるので、上下が逆になっており、初学者は最初戸惑うかもしれません。
これはPygameに限らず、ほとんどのグラフィックスライブラリやゲームエンジンで共通の仕様です。
例えば、画面の中央に何かを配置したい場合は、画面の幅と高さの半分の位置を計算して指定します。800×600ピクセルの画面なら、(400, 300)が中央になります。
【ゲームループ】
Pygameで作るゲームは、「ゲームループ」という繰り返し処理で動いています。これは1秒間に何十回も実行される処理のことで、以下の流れを繰り返します。
- プレイヤーの入力を受け取る
- ゲームの状態を更新する(キャラクターを動かす、当たり判定をチェックするなど)
- 画面を描画する
このループが高速で回り続けることで、なめらかな動きが実現されます。テレビアニメと同じで、静止画を高速で切り替えることで動いているように見せる仕組みです。
【フレームレート】
フレームレート(1秒間に画面を更新する回数)は、ゲームループの実行速度を制御します。一般的には30FPS(1秒間に30回更新)や60FPS(1秒間に60回更新)が使われます。
フレームレートが高いほど動きが滑らかになりますが、処理が重くなります。PygameではClockオブジェクト(クロック:Pygameで時間を測り、フレームの進み具合を調整するためのオブジェクト)を使って、フレームレートを一定に保つことができます。これにより、高性能なパソコンでも低性能なパソコンでも、同じ速度でゲームが動くようになります。
【イベント処理】
キーボードやマウスの操作は、Event(イベント:プログラムの外側で起きた「出来事」を、プログラムが扱える形にしたもの)として扱われます。Pygameは発生したイベントをキュー(Queue:先に入ったものから順番に取り出される仕組み)に貯めていくので、ゲームループの中で順番に取り出して処理します。
例えば、スペースキーが押されたときにキャラクターをジャンプさせたい場合は、「スペースキーが押された」というイベントを検出して、キャラクターの位置を変更する処理を実行します。
【Sprite】
Sprite(スプライト)は、ゲーム内で動くキャラクターや敵などを管理するための仕組みです。Spriteを使うと、位置の更新や当たり判定などの処理を効率的に行えます。
複数のSpriteをグループ化して一度に処理することもできるので、たくさんの敵キャラクターを同時に動かす際に便利です。
実際の開発の流れ
Pygameでゲームを作る際の基本的な流れを説明します。
【初期設定】
最初に、Pygameライブラリを初期化してゲームウィンドウを作成します。ウィンドウのサイズやタイトルを設定し、フレームレートを管理するためのClockオブジェクトも用意します。
# ゲーム作成用のライブラリ「pygame」を読み込む
import pygame
# pygameの全機能を使える状態に初期化
pygame.init()
# 横800×縦600ピクセルのゲーム画面(ウィンドウ)を作成
screen = pygame.display.set_mode((800, 600))
# ウィンドウ上部のタイトルバーに表示する文字を設定
pygame.display.set_caption("サンプルゲーム")
# ゲームの速度(1秒間の画面更新回数)を管理する時計を作成
clock = pygame.time.Clock()
このコードでは、800×600ピクセルのウィンドウを作成しています。pygame.init()でPygameの各モジュールを初期化し、pygame.display.set_mode()でウィンドウを作成します。
【ゲームループの実装】
次に、ゲームのメインとなるループを作成します。このループの中で、イベント処理、状態の更新、画面描画を繰り返します。
running = True
while running:
# イベント処理
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 画面の更新
screen.fill((0, 0, 0))
pygame.display.flip()
# フレームレート制御
clock.tick(60)
pygame.quit()
pygame.event.get()でイベントのリストを取得し、それぞれのイベントを処理します。
if event.type == pygame.QUIT:では、取得したイベントの種類をevent.typeで判定しています。
pygame.QUITは、ウィンドウ右上の閉じるボタン(×)が押されたときに発生するイベントです。このイベントを検出したらrunning = Falseとすることで、while running:の条件が満たされなくなり、ループを抜けてpygame.quit()でPygameが終了します。この処理を書かないと、閉じるボタンを押してもウィンドウが閉じなくなるため、ゲームループには必ず含めておく必要があります。
screen.fill()で画面を黒色で塗りつぶし、pygame.display.flip()で実際に画面を更新しています。clock.tick(60)により、60FPSで動作するように制御されます。
【画像や図形の描画】
画面に何かを表示する際は、Surfaceに対して描画命令を実行します。図形を描く場合は専用の関数を使い、画像を表示する場合は画像ファイルを読み込んでから貼り付けます。
# 円を描画
pygame.draw.circle(screen, (255, 0, 0), (400, 300), 50)
# 画像を読み込んで表示
image = pygame.image.load("character.png")
screen.blit(image, (100, 100))
pygame.draw.circle()は円を描く関数で、引数には描画先のSurface、色(RGB形式)、中心座標、半径を指定します。blit()は画像を貼り付ける関数で、画像と座標を指定します。
他のゲーム開発ライブラリとの違い
Pygame以外にも、Pythonでゲームを作れるライブラリがいくつかあります。それぞれの特徴を比較すると、用途に応じて選びやすくなります。
- Arcade: Pygameよりも現代的な設計で、学習向けに作られています。より直感的なAPIが特徴ですが、Pygameほど情報が豊富ではありません
- Panda3D: 3Dゲームを作る際に適したライブラリです。本格的な3Dゲームを作りたい場合はこちらが向いていますが、学習コストは高めです
- Kivy: ゲームだけでなく、スマートフォンアプリも開発できるマルチプラットフォームライブラリです。タッチ操作にも対応していますが、ゲーム専用ではないため、ゲーム開発に特化した機能はPygameの方が充実しています
初めてゲーム開発に挑戦する場合、情報が豊富で学習しやすいPygameから始めるのがおすすめです。Pygameの基本を理解してから、必要に応じて他のライブラリに移行するという選択肢もあります。
まとめ
Pygameは、Pythonでゲームを作るための無料ライブラリで、2Dゲーム開発の学習に適しています。ゲームループやイベント処理などの基本概念を理解すれば、数十行のコードで動くゲームを作成できます。