📚

【Pygame】セットアップ手順とゲーム製作で役立つモジュール一覧(基礎から応用まで)

2024/12/09に公開

はじめに

PygameはPythonで2Dゲームを開発するためのライブラリです。
ゲームを構築するための豊富な機能が用意されており、Python初心者からゲーム開発者まで広く利用されています。
https://github.com/pygame/pygame

私も実際にPygameで自作ゲーム開発をしてみたところ、シューティングゲームやパズルゲームなど様々なゲームを簡単につくることができました✨🎮
まさに、開発初心者の方や自作ゲーム開発を始めるのにうってつけのライブラリです!

そこで、今後のためにもよく使われるPygameのモジュールや関数を整理したいと思い、備忘録を作成しました。
以下に、基礎から応用までPygameのモジュールとその使い方を具体例とともにわかりやすくご紹介します。

基礎

1:Pygameのインストール

PygameライブラリをPCにインストールします。
一例として、コマンドでインストールする方法をご紹介します。
<手順>
コマンドプロンプトで以下のコマンドを実行しインストールします。

pip install pygame

実行後、Successfully installed pygame -version ~と表示されればOKです。

試しに、サンプル ゲームを実行してみましょう!
コマンドプロンプトで以下のコマンドを実行します。

python -m pygame.examples.aliens

問題がなければ、以下のようなゲームのウィンドウが開きます。

2: 基本的なウィンドウの作成

pygame.init() でPygameを初期化し、pygame.display でゲームウィンドウの作成と管理を行います。

関数 説明
pygame.display.set_mode(size) ウィンドウの作成。
pygame.display.set_caption(title) ウィンドウタイトルの設定。
pygame.display.flip() 画面全体を更新。

▼関連ドキュメント
https://www.pygame.org/docs/tut/ImportInit.html
https://www.pygame.org/docs/ref/display.html

基本のコード構造

import pygame
import sys

# 初期化
pygame.init()

# ウィンドウの作成
screen = pygame.display.set_mode((800, 600))  # サイズを指定
pygame.display.set_caption("Pygame 基礎")

# 色の定義
white = (255, 255, 255)

# メインループ
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    screen.fill(white)  # 背景色を塗る
    pygame.display.flip()  # 画面を更新

pygame.quit()
sys.exit()

▼実行結果

3: キーボードやマウスの入力の処理

pygame.eventでイベント(入力)を管理します。

Pygame の「イベント」は、ユーザーがマウスをクリックしたり、キーボードのボタンを押したりするなど、特定のアクションを実行したときに発生します。

pygame.event.get() でイベントを取得し、キーボードやマウスの入力を処理します。
イベントタイプ(例: QUIT, KEYDOWN, MOUSEBUTTONDOWN)に応じた処理を記述します。

▼基本コードから抜粋

# メインループ
running = True
while running:
    for event in pygame.event.get(): #イベントを取得
        if event.type == pygame.QUIT:
            running = False

▼関連ドキュメント
https://www.pygame.org/docs/ref/event.html

4: 図形の描写

pygame.draw モジュールを使って、直線や円など図形を描画します。
プレイヤーや敵の描写に役立ちます。

関数 説明
pygame.draw.rect(screen, color, rect) 長方形
pygame.draw.circle(screen, color, center, radius)

※他にも線や多角形の描画が可能です。

▼関連ドキュメント
https://www.pygame.org/docs/ref/draw.html#module-pygame.draw

5: キーボード入力の処理

pygame.keyでキー入力を検出し、キャラクターの動きを制御します。
pygame.key.get_pressed() では現在押されているキーの状態をチェックします。

また、Pygameには、キーボードキーに対応する定数が用意されています。
代表的なものを以下のとおりです。

矢印キー

関数 説明
pygame.K_UP 上矢印
pygame.K_DOWN 下矢印
pygame.K_LEFT 左矢印
pygame.K_RIGHT 右矢印

数字キー

関数 説明
pygame.K_0 ~ pygame.K_9 キー「0」~「9」

特殊キー

関数 説明
pygame.K_SPACE スペースキー
pygame.K_RETURN Enterキー
pygame.K_ESCAPE Escキー
pygame.K_TAB Tabキー
pygame.K_BACKSPACE Backspaceキー

▼関連ドキュメント
https://www.pygame.org/docs/ref/key.html

サンプルコード ~シューティングゲーム~

サンプルコード
import pygame
import random

# Pygameの初期化
pygame.init()

# 画面サイズと基本設定
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("シューティングゲーム")

# 色の設定
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)

# プレイヤー設定
player_size = 50
player_x = WIDTH // 2
player_y = HEIGHT - 2 * player_size
player_speed = 5

# 敵設定
enemy_size = 50
enemy_speed = 5
enemies = []

# 弾の設定
bullet_size = 10
bullet_speed = 10
bullets = []

# ゲームのループを制御する変数
running = True
clock = pygame.time.Clock()

# 敵を生成する関数
def create_enemy():
    x = random.randint(0, WIDTH - enemy_size)
    y = 0
    enemies.append(pygame.Rect(x, y, enemy_size, enemy_size))

# メインループ
while running:
    screen.fill(BLACK)

    # イベント処理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                # スペースキーで弾を発射
                bullet = pygame.Rect(player_x + player_size // 2 - bullet_size // 2, player_y, bullet_size, bullet_size)
                bullets.append(bullet)

    # プレイヤーの移動
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT] and player_x > 0: # 左矢印を押下すると左へ移動
        player_x -= player_speed
    if keys[pygame.K_RIGHT] and player_x < WIDTH - player_size: # 右矢印を押下すると右へ移動
        player_x += player_speed

    # 敵の生成
    if random.randint(1, 30) == 1:  # 一定確率で敵を生成
        create_enemy()

    # 敵の移動
    for enemy in enemies[:]:
        enemy.y += enemy_speed
        if enemy.y > HEIGHT:  # 画面下に到達したら削除
            enemies.remove(enemy)

    # 弾の移動
    for bullet in bullets[:]:
        bullet.y -= bullet_speed
        if bullet.y < 0:  # 画面上に到達したら削除
            bullets.remove(bullet)

    # 衝突判定(弾と敵)
    for bullet in bullets[:]:
        for enemy in enemies[:]:
            if bullet.colliderect(enemy):
                bullets.remove(bullet)
                enemies.remove(enemy)
                break

    # 図形の描画
    player = pygame.Rect(player_x, player_y, player_size, player_size)
    pygame.draw.rect(screen, GREEN, player)

    for enemy in enemies:
        pygame.draw.rect(screen, RED, enemy)

    for bullet in bullets:
        pygame.draw.rect(screen, WHITE, bullet)

    # 画面更新
    pygame.display.flip()
    clock.tick(30)

# ゲーム終了
pygame.quit()

▼実行結果
https://youtu.be/3a2l2KJGJwE

応用

6: サウンド再生と画像描写

  1. pygame.image で画像をロードして描画します。
関数 説明
pygame.image.load(file) 画像を読み込み。
screen.blit(image, (x, y)) 指定座標に画像を描画。
  1. pygame.mixer で音声をロードして再生します。
関数 説明
pygame.mixer.Sound(file) 効果音のロード。
pygame.mixer.Sound.play() 効果音の再生。

▼関連ドキュメント
https://www.pygame.org/docs/ref/image.html
https://www.pygame.org/docs/ref/mixer.html

7: 衝突検出

colliderect は、PygameのRectオブジェクトに組み込まれた衝突判定メソッドです。
これを使うと、四角形同士の衝突を簡単に検出することができます。
図形の一部が重なっている場合は true を返します。

▼シューティングゲームのサンプルコードから抜粋

    # 衝突判定(弾と敵)
    for bullet in bullets[:]:
        for enemy in enemies[:]:
            if bullet.colliderect(enemy):
                bullets.remove(bullet)
                enemies.remove(enemy)
                break

▼関連ドキュメント
https://www.pygame.org/docs/ref/rect.html

8: 時間処理

pygame.time を使うことで、ゲームのフレームレートの管理や時間経過の計測ができます。

  1. フレームレート(FPS)を制御するためには pygame.time.Clock を使います。
    各フレームの間隔を調整することで、ゲームが一定の速度で動作します。

▼サンプルコード

clock = pygame.time.Clock()

clock.tick(fps)

上記の例では、フレームレートをfpsに制限します。
例えば、clock.tick(60)とすると、ゲームが60FPSで動作します。

  1. ゲーム内の経過時間を測るには、pygame.time.get_ticks() 関数を使用します。
    pygame.time.get_ticks()はPygameが初期化されてから経過した時間をミリ秒単位で返します。
    ゲームのタイマーやイベントのスケジュールに役立ちます。

▼サンプルコード

start_time = pygame.time.get_ticks() # ゲーム開始時の時間

while running:
    elapsed_time = pygame.time.get_ticks() - start_time # 経過時間計算
    print(f"経過時間: {elapsed_time}ms")

▼関連ドキュメント
https://www.pygame.org/docs/ref/time.html

まとめ

Pygameのゲーム開発でよく使われるモジュールを基本から応用までまとめてみましました。
また気づきがあれば随時アップデートしていこうと思います!

これらの知識を組み合わせることで、面白いゲームを作成することができます。
Pygameのお手軽さと機能性を活かして、自作ゲーム開発に挑戦してみてはいかがでしょうか。

最後まで読んでくださりありがとうございました✨
少しでも参考になる情報となっていれば幸いです。

また、改善点やご意見などあればコメントお願いいたします!

関連記事

Pygameでゲームを作る手順については過去の記事でご紹介しています!
今回紹介したモジュールを使って作成しています。

▼シューティングゲーム
https://zenn.dev/nira123/articles/18551161bfd40c

▼上から降ってくるアイテムを落とさないようにしつつハイスコアを狙うキャッチゲーム
https://zenn.dev/nira123/articles/cd18fe2fb7bc41

▼時間内に敵から逃げ切るサバイバルゲーム
https://zenn.dev/nira123/articles/d1ae4f8ac104cf

参考サイト

https://www.pygame.org/wiki/tutorials

https://www.pygame.org/docs/

https://learn.microsoft.com/ja-jp/windows/python/beginners

Discussion