pythonnの pygame を使ってWindowを表示する

目次

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ウィンドウ作成、イベント処理、描画などゲームロジック全般
Applicationmain() の代替。起動の流れをまとめるクラス

✅ この構成のメリット

  • 拡張しやすいApplicationでログイン・設定読み込みなども管理可)
  • モジュール化しやすい(複数ゲームを切り替えたりも可能)
  • テスト・再利用しやすい

🧠 さらに拡張するには?

  • SceneManagerを導入して複数画面切り替え
  • ✅ メニュー画面やゲーム画面をクラス分離
  • ✅ ログ機能、設定ファイル読み込みを Application に追加

よかったらシェアしてね!
目次