コンテンツにスキップ

Pythonゲームの簡単な使い方

[

PyGame:Pythonゲームプログラミング入門

Jon Fincherによる80件のコメントを受けて

マーク完了

目次

  • 背景とセットアップ
  • 基本的なPyGameプログラム
  • PyGameのコンセプト
    • 初期化とモジュール
    • ディスプレイとサーフェス
    • 画像と長方形
  • 基本的なゲームデザイン
    • PyGameのインポートと初期化
    • ディスプレイの準備
    • ゲームループの準備
    • イベントの処理
    • 画面に描画する
    • .blit()と.flip()の使用
  • スプライト
    • プレイヤー
    • ユーザー入力
  • スプライトグループ
  • カスタムイベント
  • 衝突検出
  • スプライト画像
    • オブジェクトコンストラクタの変更
    • 背景画像の追加
  • ゲームの速度
  • サウンド効果
  • 出典について
  • 結論

広告を削除

私がコンピュータプログラミングを学び始めたのは、前の千年紀に遅いタイミングで、コンピュータゲームを書きたいという欲求によって引き起されました。私はPythonを含む、学んだ言語とプラットフォームごとにどのようにゲームを書くかを理解しようとしました。そうして私はpygameを見つけ、それを使ってゲームや他のグラフィカルなプログラムを書く方法を学びました。当時、私は本当にpygameについての入門書が欲しかったのです。

この記事の最後まで、次のことができるようになります:

  • 画面にアイテムを描画する
  • サウンドエフェクトと音楽を再生する
  • ユーザーの入力を処理する
  • イベントループを実装する
  • ゲームプログラミングが通常の手続き型のPythonプログラミングとどのように異なるかを説明する

この記事のコードをダウンロードして、一緒に進めることができます:

背景とセットアップ

pygameは、SDLライブラリ(Simple DirectMedia Layer)のPythonラッパーです。SDLは、サウンド、ビデオ、マウス、キーボード、ジョイスティックなど、システムのマルチメディアハードウェアコンポーネントにクロスプラットフォームでアクセスできるようにします。pygameは、停止したPySDLプロジェクトの代わりとして誕生しました。SDLとpygameのクロスプラットフォームの特性により、それらをサポートするすべてのプラットフォームでゲームや豊富なマルチメディアのPythonプログラムを書くことができます。

シェル

$ pip install pygame

コピー!

インストールが正常に完了しているかどうかは、ライブラリに付属の例の1つをロードして確認できます:

シェル

$ python3 -m pygame.examples.aliens

コピー!

ゲームウィンドウが表示された場合、pygameが正しくインストールされています!問題が発生した場合は、再度インストールを試みてください。

PyGameの基本プログラム

それでは、pygameを使用した基本的なプログラムを作成してみましょう。このプログラムでは、ウィンドウを表示し、ウィンドウに色を塗りつぶします。次のコードを作成して、hello_pygame.pyという名前で保存します:

import pygame
pygame.init()
screen = pygame.display.set_mode((400, 300))
done = False
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
screen.fill((255, 255, 255))
pygame.display.flip()
pygame.quit()

このプログラムは、ウィンドウのサイズを400x300ピクセルに設定し、ウィンドウを白で塗りつぶします。プログラムは、ウィンドウが閉じられるまで無限ループで実行されます。ウィンドウが閉じられたイベントが発生すると、doneフラグがTrueに設定され、ループが終了します。

PyGameのコンセプト

初期化とモジュール

はじめに、pygameのモジュールをインポートし、pygameを初期化する必要があります。

import pygame
pygame.init()

pygame.init()は、pygameを初期化するための関数です。これにより、pygameの各モジュールが使用可能になります。

ディスプレイとサーフェス

pygameは、ウィンドウや画面の描画に使用する「サーフェス」と呼ばれるオブジェクトを提供します。pygame.displayモジュールを使用して、ウィンドウを作成し、表示します。

screen = pygame.display.set_mode((400, 300))

pygame.display.set_mode()は、指定されたサイズのウィンドウを作成します。この例では、幅400ピクセル、高さ300ピクセルのウィンドウを作成しています。

画像と長方形

ゲームで使用する画像やオブジェクトの位置やサイズは、pygame.Rectオブジェクトを使用して管理できます。

rect = pygame.Rect(10, 20, 100, 200)

この例では、(10, 20) の位置から始まる100x200ピクセルの長方形を作成しています。

基本的なゲームデザイン

PyGameのインポートと初期化

まず、pygameをインポートして初期化する必要があります。

import pygame
pygame.init()

pygame.init()は、pygameを初期化するための関数です。これにより、pygameの各モジュールが使用可能になります。

ディスプレイの準備

次に、ウィンドウを作成し、表示する必要があります。ウィンドウのサイズやタイトルなどの設定を行います。

screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("My Game")

この例では、幅800ピクセル、高さ600ピクセルのウィンドウを作成し、タイトルを”My Game”に設定しています。

ゲームループの準備

次に、ゲームループを設定する必要があります。ゲームループは、ゲームの更新と描画のために使用されます。

clock = pygame.time.Clock()
running = True
while running:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill((0, 0, 0))
pygame.display.flip()

この例では、フレームレートを60フレーム/秒に設定し、ゲームループを開始します。ゲームループの中では、イベントの処理、画面のクリア、画面の更新などが行われます。ゲームループを終了するには、runningフラグをFalseに設定します。

イベントの処理

ゲーム中のプレーヤーの入力などのイベントは、pygame.event.get()関数を使用して処理できます。

for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
jump()
if event.type == pygame.MOUSEBUTTONDOWN:
do_something()

この例では、キーダウンイベントとマウスボタンダウンイベントを処理しています。キーダウンイベントが発生した場合は、スペースキーが押された場合にjump()関数が呼び出されます。また、マウスボタンダウンイベントが発生した場合は、do_something()関数が呼び出されます。

画面に描画する

ゲーム中の画像やオブジェクトを画面に描画するには、pygame.Surfaceオブジェクトを使用します。

image = pygame.image.load("image.png")
screen.blit(image, (x, y))

この例では、“image.png”という名前の画像ファイルを読み込み、screen.blit()関数を使用して画面に描画しています。

.blit()と.flip()を使用する

pygame.Surfaceオブジェクトの.blit()メソッドを使用すると、画像やオブジェクトを画面に描画することができます。

screen.blit(image, (x, y))

この例では、imageを座標(x, y)に描画しています。

pygame.display.flip()関数を呼び出すと、画面が更新されます。

pygame.display.flip()

スプライト

ゲームでよく使用されるスプライトを表すオブジェクトは、pygame.sprite.Spriteクラスを継承して作成できます。

class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
# スプライトの初期化などの処理
def update(self):
# スプライトの更新処理など

この例では、Playerクラスがpygame.sprite.Spriteクラスを継承しています。Playerクラスのインスタンスを作成すると、スプライトの初期化および更新メソッドが呼び出されます。

ユーザー入力

ゲーム中のプレーヤーの入力は、ゲームループ内でイベントを処理することで取得できます。

for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
player.move_left()
elif event.key == pygame.K_RIGHT:
player.move_right()
elif event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
player.stop_moving()

この例では、キーダウンイベントとキーアップイベントを処理しています。キーダウンイベントが発生した場合は、左キーが押された場合にplayer.move_left()メソッドが呼び出され、右キーが押された場合にplayer.move_right()メソッドが呼び出されます。キーアップイベントが発生した場合は、左キーまたは右キーが離された場合にplayer.stop_moving()メソッドが呼び出されます。

ゲーム中の敵キャラクターは、スプライトとして表すことができます。敵キャラクターのインスタンスを作成し、ゲームループ内で表示することで、表示および更新できます。

enemy = Enemy()
enemies = pygame.sprite.Group()
enemies.add(enemy)
while running:
for enemy in enemies:
enemy.update()
enemy.draw(screen)

この例では、Enemyクラスのインスタンスをenemiesグループに追加しています。ゲームループ内で、すべての敵を更新し、画面に描画しています。

スプライトグループ

関連するスプライトをグループ化することもできます。これにより、複数のスプライトを一度に操作できます。

players = pygame.sprite.Group()
player1 = Player()
player2 = Player()
players.add(player1, player2)
while running:
players.update()
players.draw(screen)

この例では、Playerクラスのインスタンスをplayersグループに追加しています。ゲームループ内で、playersグループ内のすべてのスプライトを更新し、画面に描画しています。

カスタムイベント

ゲーム内で発生するカスタムイベントを処理するために、pygame.event.Eventクラスを使用することができます。

GAME_OVER = pygame.USEREVENT + 1
game_over_event = pygame.event.Event(GAME_OVER, message="Game Over")
pygame.event.post(game_over_event)
for event in pygame.event.get():
if event.type == GAME_OVER:
print(event.message)

この例では、GAME_OVERというカスタムイベントを作成し、messageという追加の情報を含めています。カスタムイベントを発生させるには、pygame.event.post()関数を使用します。後でイベントを処理するために、イベントタイプをチェックする必要があります。

衝突検出

スプライト同士の衝突を検出するには、pygame.sprite.spritecollide()関数を使用します。

bullets = pygame.sprite.Group()
enemies = pygame.sprite.Group()
collisions = pygame.sprite.spritecollide(player, enemies, True)

この例では、playerスプライトとenemiesグループの間の衝突を検出しています。衝突が発生した場合は、enemiesグループから衝突した敵スプライトを削除します。

スプライト画像

スプライトに画像を追加することもできます。pygame.sprite.Spriteクラスを継承したクラスを作成し、image属性に画像を指定します。

class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.image.load("player.png")
self.rect = self.image.get_rect()

この例では、Playerクラスがpygame.sprite.Spriteクラスを継承しています。image属性には、“player.png”という名前の画像ファイルを読み込んだものを指定しています。rect属性は、スプライトの位置やサイズを表すpygame.Rectオブジェクトです。

オブジェクトコンストラクタの変更

スプライトのオブジェクトコンストラクタを変更することで、スプライトの初期化をカスタマイズできます。

class Player(pygame.sprite.Sprite):
def __init__(self, image, x, y):
super().__init__()
self.image = pygame.image.load(image)
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y

この例では、Playerクラスのオブジェクトコンストラクタを変更し、画像と座標を引数として受け取るようにしています。オブジェクトが作成されるときに、指定された座標にスプライトが配置されます。

背景画像の追加

背景画像をゲームに追加するには、pygame.Surfaceオブジェクトを使用して背景を描画します。

background = pygame.Surface(screen.get_size())
background.fill((255, 255, 255))
screen.blit(background, (0, 0))

この例では、screenと同じサイズのbackgroundサーフェスオブジェクトを作成し、白で塗りつぶしています。screen.blit()関数を使用して背景を画面に描画します。

ゲームの速度

ゲームの速度を制御するためには、pygame.time.Clockオブジェクトを使用します。

clock = pygame.time.Clock()
FPS = 60
while running:
clock.tick(FPS)
# ゲームの更新と描画の処理

この例では、フレームレートを60フレーム/秒に設定しています。clock.tick(FPS)は、ゲームの速度をフレームレートに制限するために使用されます。

サウンド効果

ゲームにサウンド効果を追加するには、pygame.mixer.Soundオブジェクトを使用します。

sound = pygame.mixer.Sound("sound.wav")
sound.play()

この例では、“sound.wav”という名前のサウンドファイルを読み込み、再生しています。

出典について

このチュートリアルでは、PyGameを使用したゲームプログラミングの基本を学びました。以下のリソースを参考にして、詳細な情報や例を探求してみてください。

結論

このチュートリアルでは、Pythonプログラミングでゲームプログラミングを行うためのPyGameの基本的な使い方を学びました。PyGameを使用して、画像を描画し、サウンドエフェクトや音楽を再生し、ユーザーの入力を処理し、イベントループを実装する方法を学びました。また、ゲームプログラミングが通常の手続き型のPythonプログラミングとどのように異なるかについても理解しました。

これで、あなたはPyGameを使用してPythonゲームを開発するための基礎を学びました。さあ、自分自身でゲームを作り始めましょう!