序章

pygame ライブラリは、ゲームやその他のマルチメディアアプリケーションの作成を支援することを特に目的としたPythonプログラミング言語用のオープンソースモジュールです。 移植性の高いSDL(Simple DirectMedia Layer)開発ライブラリの上に構築されたpygameは、多くのプラットフォームやオペレーティングシステムで実行できます。

pygameモジュールを使用することで、ビデオやオーディオの操作に必要なバックエンドの複雑さを気にすることなく、ゲームのロジックとグラフィックスを制御できます。

このチュートリアルでは、最初にpygameをPythonプログラミング環境にインストールしてから、pygameとPython3を使用してゲームを開発するためのテンプレートを作成する手順を説明します。

前提条件

このチュートリアルを使用できるようにするには、Python3とプログラミング環境がローカルコンピューターまたはサーバーにすでにインストールされていることを確認してください。

また、次のPythonプログラミングの概念にも精通している必要があります。

プログラミング環境がセットアップされ、 Pythonプログラミングに精通していれば、pygameでの作業を開始する準備が整います。

pygameのインストール

Python3プログラミング環境をアクティブ化することから始めましょう。

  1. . my_env/bin/activate

これを有効にすると、pipを使用してpygameをインストールできます。

  1. pip install pygame

このコマンドを実行すると、次のような出力が表示されます。

Output
Collecting pygame Using cached pygame-1.9.3-cp35-cp35m-manylinux1_x86_64.whl Installing collected packages: pygame Successfully installed pygame-1.9.3

ビデオとオーディオが利用可能なシステムにpygameをインストールした場合は、次のコマンドを実行してインストールを確認できます。このコマンドは、pygameがグラフィックとサウンドで何ができるかを示す模擬ゲームを実行します。

  1. python -m pygame.examples.aliens

サンプルを開きたくない場合、またはセットアップの一部としてAVがない場合は、Pythonインタラクティブコンソールにアクセスして、pygameモジュールをインポートできることを確認することもできます。 まず、pythonコマンドを入力して、コンソールを起動します。

  1. python

次に、コンソール内でモジュールをインポートできます。

  1. import pygame

コマンドの後にENTERキーを押してもエラーが表示されない場合は、pygameが正常にインストールされたことがわかります。 quit()コマンドを使用して、Pythonインタラクティブコンソールを終了できます。

コマンドラインでのインストールで問題が発生した場合は、pygameの[GettingStarted wiki]( http://pygame.org/wiki/GettingStarted#Pygame インストール)を確認できます。

後のステップでは、コードを検証するためのこのチュートリアルの一部として、モニターを使用してグラフィカルユーザーインターフェイスを表示することを想定しています。

pygameのインポート

pygameに慣れるために、our_game.pyというファイルを作成しましょう。このファイルは、nanoテキストエディターで作成できます。たとえば、次のようになります。

  1. nano our_game.py

pygameでプロジェクトを開始するときは、モジュールのインポートに使用されるimportステートメントから始めます。これは、ファイルの先頭に追加できます。

our_game.py
import pygame

オプションで、最初の行の下に別のimportステートメントを追加して、pygameの定数と関数の一部をファイルのグローバル名前空間に追加することもできます。

our_game.py
import pygame
from pygame.locals import *

pygameがプログラムファイルにインポートされたら、それを使用してゲームテンプレートを作成する準備が整いました。

pygameを初期化しています

ここからは、「初期化」の略であるinit()関数を使用してpygameの機能を初期化します。

our_game.py
import pygame
from pygame.locals import *
 
 
pygame.init()

init()関数は、初期化が必要なすべてのpygameモジュールを自動的に起動します。

次のように、pygameの各モジュールを個別に初期化することもできます。

pygame.font.init()

init()関数は、必要に応じてタプルを返します。 このタプルは、初期化の成功と失敗を示します。 これは、一般的なinit()呼び出しと、特定のモジュールの初期化(これらのモジュールが使用可能かどうかを示します)の両方で実行できます。

i = pygame.init()
print(i)
 
f = pygame.font.init()
print(f)

上記のコードを実行すると、次のような出力が返されます。

Output
(6, 0) None

この場合、i variableはタプル(6, 0)を返しました。これは、pygameの初期化が6回成功し、失敗が0回であることを示しています。 f変数がNoneを返しました。これは、モジュールがこの特定の環境内で使用できないことを示しています。

表示面の設定

ここから、ゲームの表示面を設定する必要があります。 pygame.display.set_mode()を使用して、表示用のウィンドウまたは画面を初期化し、それを変数に渡します。 関数に、タプルの幅と高さを表す数値のペアである表示解像度の引数を渡します。 この関数をプログラムに追加しましょう。

our_game.py
import pygame
from pygame.locals import *
 
 
pygame.init()
 
game_display = pygame.display.set_mode((800, 600))

タプル(800, 600)set_mode()関数の引数として渡し、幅(800ピクセル)と高さ(600ピクセル)の解像度を表します。 タプルは関数の括弧内に含まれているため、上記の関数には二重括弧があることに注意してください。

ゲームの解像度にはintegersを頻繁に使用する可能性があるため、数値を何度も使用するのではなく、これらの数値を変数に割り当てることをお勧めします。 これにより、変数に渡されるものを変更するだけでよいため、プログラムを変更する必要がある場合に簡単になります。

ゲームのディスプレイの幅に変数display_widthを使用し、高さにdisplay_heightを使用して、これらの変数をset_mode()関数に渡します。

our_game.py
import pygame
from pygame.locals import *
 
 
pygame.init()
 
display_width = 800
display_height = 600
 
game_display = pygame.display.set_mode((display_width, display_height))

この時点で、ゲームの表示面はその幅と高さの解像度で設定されます。

表示の更新

次に、ゲームサーフェスの表示を更新するために、使用可能な2つの関数のいずれかを使用する必要があります。

アニメーションは通常、時間の経過とともに異なるフレーム間で変化します。 パラパラマンガは、1ページから次のページへと徐々に変化する一連の画像で構成されているため、アニメーションについて考えるときに思い浮かぶかもしれません。 これらのページは、ページのコンテンツが動いているように見えるため、すばやくめくったときの動きのシミュレーションを提供します。 コンピュータゲームでは、ページではなくフレームが使用されます。

ページまたはフレームをめくるという概念のため、ゲームの表面の表示を更新するために使用できる関数の1つはflip()と呼ばれ、上記のファイルで次のように呼び出すことができます。

pygame.display.flip()

flip()機能は、表示面全体を画面に更新します。

flip()関数の代わりにupdate()関数が使用されることがよくあります。これは、領域全体ではなく画面の一部のみを更新してメモリを節約するためです。

update()関数をour_game.pyファイルの最後に追加しましょう。

our_game.py
import pygame
from pygame.locals import *
 
 
pygame.init()
 
display_width = 800
display_height = 600
 
game_display = pygame.display.set_mode((display_width, display_height))
 
pygame.display.update()

この時点で、エラーなしでプログラムを実行できますが、表示面は単に開いてすぐに閉じます。

ゲームループの作成

pygameをインポートして初期化し、表示セットを設定し、ゲームサーフェスを更新したら、メインのゲームループの作業を開始できます。

ゲームを実行するwhileループを作成します。 ループはTrueBoolean値を呼び出します。これは、ループが中断されない限り、ループが永久にループすることを意味します。

プログラムのこのメインゲームループ内で、 for loop を作成して、pygame.event.get()関数によって呼び出されるイベントキュー内のユーザーイベントを反復処理します。

この時点では、forループ内には何もありませんが、print()ステートメントを追加して、コードが期待どおりに動作していることを示すことができます。 反復内のイベントをprint(event)としてステートメントに渡します。

これらの2つのループとprint()ステートメントをプログラムファイルに追加しましょう。

our_game.py
import pygame
from pygame.locals import *
 
 
pygame.init()
 
display_width = 800
display_height = 600
 
game_display = pygame.display.set_mode((display_width, display_height))
 
pygame.display.update()
 
while True:
    for event in pygame.event.get():
        print(event)

コードが機能していることを確認するために、プログラムを実行してみましょう。

  1. python our_game.py

ファイルを実行すると、800×600のウィンドウがポップアップ表示されます。 イベントをテストするには、ウィンドウの上にマウスを置き、ウィンドウ内をクリックして、キーボードのキーを押します。 これらのイベントはコンソールウィンドウに出力されます。

受け取る出力は次のようになります。

Output
<Event(4-MouseMotion {'rel': (616, 355), 'buttons': (0, 0, 0), 'pos': (616, 355)})> <Event(5-MouseButtonDown {'button': 1, 'pos': (616, 355)})> <Event(6-MouseButtonUp {'button': 1, 'pos': (616, 355)})> <Event(2-KeyDown {'scancode': 3, 'key': 102, 'unicode': 'f', 'mod': 0})> <Event(3-KeyUp {'scancode': 3, 'key': 102, 'mod': 0})> ...

この出力には、発生しているユーザーイベントが表示されます。 これらのイベントは、ユーザーによって生成されるときにゲームを制御するものです。 pygame.event.get()関数を実行するたびに、コードはこれらのイベントを受け取ります。

ターミナルウィンドウでCTRL+ Cを押して、プログラムの実行を停止します。

この時点で、