目次
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
に追加