PyGame(パイゲーム)は、Python でゲームを作るためのライブラリです。以下のポイントを押さえると、全体像がわかります。
目次
🔷 PyGame の基本概要
● 目的
PyGame は、2Dゲームや簡単なインタラクティブアプリケーションの開発に向いており、画像、音声、入力処理などを簡単に扱えるようにした Python ライブラリです。
● 主な機能
- 画面描画(画像、図形)
- 音楽・効果音の再生
- キーボード・マウス入力の処理
- ゲームループの構築
- アニメーション制御
- 衝突判定(コリジョン)
🔷 PyGame の構成要素(主なモジュール)
| 機能 | モジュール | 説明 |
|---|---|---|
| 画面描画 | pygame.display | ウィンドウや画面の初期化・更新 |
| 画像処理 | pygame.image | 画像の読み込みと描画 |
| 図形の描画 | pygame.draw | 円・線・四角などの図形を描く |
| サウンド処理 | pygame.mixer | 効果音・音楽の再生 |
| 入力処理 | pygame.key, pygame.mouse | キーやマウスイベントの取得 |
| 時間管理 | pygame.time.Clock | フレームレート制御やタイマー |
| イベント管理 | pygame.event | ゲーム内のイベント処理 |
🔷 最小構成サンプルコード
import pygame
import sys
# 初期化
pygame.init()
# 画面作成
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("PyGame サンプル")
# 色の定義
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
# メインループ
running = True
while running:
screen.fill(WHITE) # 背景塗りつぶし
# 四角を描く
pygame.draw.rect(screen, BLUE, pygame.Rect(100, 100, 150, 100))
# イベント処理
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 表示更新
pygame.display.flip()
# 終了処理
pygame.quit()
sys.exit()
🔷 PyGame の特徴と利点
| 特徴 | 内容 |
|---|---|
| ✅ 学習コストが低い | Python の基本がわかればすぐ始められる |
| ✅ シンプルなAPI | 関数の呼び出しだけで多くの処理ができる |
| ✅ 教育用途に最適 | プログラミングの導入教材として人気 |
| ✅ クロスプラットフォーム | Windows / macOS / Linux に対応 |
🔷 PyGame で作れるものの例
- ブロック崩し
- シューティングゲーム
- スクロールアクション
- シンプルな RPG やパズルゲーム
- 教育用のシミュレーションや可視化ツール
🔷 まとめ
| 用途 | 特徴 |
|---|---|
| 2Dゲームの開発 | 簡単・軽量で始めやすい |
| 教育・学習用途 | プログラミングの導入に最適 |
| Pythonで完結 | C/C++の知識不要で環境構築も簡単 |
あなたのPyGameコードを、エントリーポイント if __name__ == "__main__" から main() 関数を呼び出す構造にリファクタリングする例を以下に示します。
✅ 改良版:main() 関数を使った構造
# pip install pygame
# -*- coding: utf-8 -*-
import pygame
import sys
def run_window():
pygame.init() # Pygameの初期化
screen = pygame.display.set_mode((640, 480)) # ウィンドウのサイズを設定
pygame.display.set_caption("PyGame サンプル") # ウィンドウのタイトルを設定
WHITE = (255, 255, 255) # 白色
BLUE = (0, 0, 255) # 青色
running = True
while running: # メインループ
screen.fill(WHITE) # 背景塗りつぶし
pygame.draw.rect(screen, BLUE, pygame.Rect(100, 100, 150, 100)) # 四角を描く
for event in pygame.event.get(): # イベント処理
if event.type == pygame.QUIT:
running = False
pygame.display.flip() # 表示更新
pygame.quit() # 終了処理
sys.exit()
def main():
print("PyGame アプリケーション開始")
run_window() # ゲームウィンドウ表示
if __name__ == "__main__":
main()
💡構成のポイント
| 関数名 | 役割 |
|---|---|
main() | エントリーポイント、アプリの起動を管理 |
run_window() | PyGame ウィンドウの表示とメインループ処理 |
run_window() 関数をクラスにリファクタリングすることで、より構造的で拡張しやすいコードになります。以下に GameWindow というクラスを作成し、Pygame ウィンドウの表示・イベント処理・描画処理をクラス内に整理した例を示します。
✅ クラス化した PyGame 実装(GameWindow クラス)
# pip install pygame
# -*- coding: utf-8 -*-
import pygame
import sys
class GameWindow:
def __init__(self, width=640, height=480):
pygame.init()
self.width = width
self.height = height
self.screen = pygame.display.set_mode((self.width, self.height))
pygame.display.set_caption("PyGame クラス版サンプル")
# 色定義
self.WHITE = (255, 255, 255)
self.BLUE = (0, 0, 255)
self.running = True
def run(self):
while self.running:
self.handle_events()
self.update()
self.render()
self.cleanup()
def handle_events(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.running = False
def update(self):
# 今後、ゲームの状態更新ロジックを追加できる場所
pass
def render(self):
self.screen.fill(self.WHITE)
pygame.draw.rect(self.screen, self.BLUE, pygame.Rect(100, 100, 150, 100))
pygame.display.flip()
def cleanup(self):
pygame.quit()
sys.exit()
def main():
print("PyGame クラスベースアプリを起動")
game = GameWindow()
game.run()
if __name__ == "__main__":
main()
🔍 クラス設計のポイント
| メソッド | 役割 |
|---|---|
__init__ | 初期化処理(画面サイズ・色・状態など) |
run | メインループの入口 |
handle_events | キー入力・マウスなどのイベント処理 |
update | ゲームロジック・状態更新(拡張用) |
render | 描画処理 |
cleanup | 終了処理(リソース解放など) |
main() 関数をクラス化する場合、アプリケーション全体を管理する「アプリケーションクラス」を作成します。
たとえば App クラスを定義し、その中で GameWindow を使ってゲームを実行するように構成できます。
✅ main() 相当をクラス化:App クラスを導入
以下は、App クラスを追加し、全体の流れを整理したコードです。
# pip install pygame
# -*- coding: utf-8 -*-
import pygame
import sys
class GameWindow:
def __init__(self, width=640, height=480):
pygame.init()
self.width = width
self.height = height
self.screen = pygame.display.set_mode((self.width, self.height))
pygame.display.set_caption("PyGame クラス版サンプル")
self.WHITE = (255, 255, 255)
self.BLUE = (0, 0, 255)
self.running = True
def run(self):
while self.running:
self.handle_events()
self.update()
self.render()
self.cleanup()
def handle_events(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.running = False
def update(self):
pass
def render(self):
self.screen.fill(self.WHITE)
pygame.draw.rect(self.screen, self.BLUE, pygame.Rect(100, 100, 150, 100))
pygame.display.flip()
def cleanup(self):
pygame.quit()
sys.exit()
class App:
def __init__(self):
print("アプリケーションを初期化します")
self.game = GameWindow()
def run(self):
print("ゲームを開始します")
self.game.run()
if __name__ == "__main__":
app = App()
app.run()
🧩 クラス設計の意図
| クラス名 | 役割 |
|---|---|
GameWindow | 実際のゲームロジック・描画・イベント管理 |
App | アプリ全体の起動と管理、ゲーム開始指示 |
この構成なら、以下のような拡張がしやすくなります:
Appにログイン画面や設定画面などを追加- ゲームのモード切り替え(例:タイトル画面・ゲーム画面)
- 他ライブラリ(例:PyQt や tkinter)との統合も可能
