目次
pygame(ゲーム開発用)トップレベル記述
pip install pygame
# pip install pygame
import pygame
import sys
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()
以下は、Pygameのウィンドウ表示を「関数化」し、エントリーポイント(main)から呼び出す基本構成です。
これにより、コードが整理され、再利用や機能追加がしやすくなります。
✅ Pygame ウィンドウ表示を関数 + main で管理する基本構成
# pip install pygame
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()
✅ 解説
| 要素 | 説明 |
|---|---|
run_game() | ゲーム/ウィンドウ表示ロジックを関数にまとめる |
main() | エントリーポイント。実行時に run_game() を呼ぶ |
if __name__ == "__main__" | このスクリプトが直接実行されたときだけ main を実行 |
✅ 応用したいときは?
以下のような拡張にもすぐ対応できます:
run_game()にパラメータを渡して解像度やタイトルを変更- FPSを管理する
pygame.time.Clock()の追加 - キーボード/マウス入力対応
- クラス化して「GameApp」や「Scene」構成に拡張
了解しました!run_game() をクラス化することで、ゲームウィンドウ全体のロジックを GameApp のようなクラスにまとめることができます。これにより、状態管理・イベント処理・画面切り替えなどをオブジェクト指向で整理できます。
✅ クラス化した Pygame アプリの基本構成
# pip install pygame
import pygame
import sys
class GameApp: # Pygame アプリ本体クラス
def __init__(self, width=400, height=300, title="Pygame クラス版"):
pygame.init()
self.screen = pygame.display.set_mode((width, height))
pygame.display.set_caption(title)
self.clock = pygame.time.Clock()
self.running = True
def run(self):
while self.running:
self.handle_events()
self.update()
self.draw()
pygame.display.flip()
self.clock.tick(60) # FPS制限
pygame.quit()
sys.exit()
def handle_events(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.running = False
def update(self):
pass # ロジック更新(必要ならここに追加)
def draw(self):
self.screen.fill((255, 255, 255)) # 白背景
def main(): # main
print("main() が呼び出されました")
app = GameApp()
app.run()
if __name__ == "__main__": # エントリーポイント
main()
✅ 解説
| メソッド | 役割 |
|---|---|
__init__() | ウィンドウと基本設定の初期化 |
run() | メインループの実行 |
handle_events() | 入力イベント処理(Quitなど) |
update() | ゲームロジックの更新(今は空) |
draw() | 描画処理(今は背景のみ) |
✅ 応用に強い構成
このクラス構成なら以下も簡単に追加できます:
- 🔘 マウスやキーボード入力に応じた処理
- 🖼️ スプライト画像の描画
- 🎮 シーン切り替え(タイトル画面、ゲーム画面、結果画面など)
- 🔊 サウンド、アニメーション
- 🔁 状態管理(ポーズ、ゲームオーバーなど)
素晴らしい段階です!
今回は main() 相当の処理もクラス化して、「アプリケーション全体を1つのクラスにまとめる」構成を紹介します。
✅ ゴール
GameApp:ゲーム本体ロジック(描画・イベント処理など)Application:エントリーポイント管理クラス(main相当)
✅ Pygame: main()を Application クラスにクラス化した完全例
# 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()
✅ 構造のポイント
| クラス | 役割 |
|---|---|
GameApp | ウィンドウ作成、イベント処理、描画などゲームロジック全般 |
Application | main() の代替。起動の流れをまとめるクラス |
✅ この構成のメリット
- ✅ 拡張しやすい(
Applicationでログイン・設定読み込みなども管理可) - ✅ モジュール化しやすい(複数ゲームを切り替えたりも可能)
- ✅ テスト・再利用しやすい
🧠 さらに拡張するには?
- ✅
SceneManagerを導入して複数画面切り替え - ✅ メニュー画面やゲーム画面をクラス分離
- ✅ ログ機能、設定ファイル読み込みを
Applicationに追加