Pygameをインストールし、Python3でゲームを開発するためのテンプレートを作成する方法
序章
pygame ライブラリは、ゲームやその他のマルチメディアアプリケーションの作成を支援することを特に目的としたPythonプログラミング言語用のオープンソースモジュールです。 移植性の高いSDL(Simple DirectMedia Layer)開発ライブラリの上に構築されたpygameは、多くのプラットフォームやオペレーティングシステムで実行できます。
pygameモジュールを使用することで、ビデオやオーディオの操作に必要なバックエンドの複雑さを気にすることなく、ゲームのロジックとグラフィックスを制御できます。
このチュートリアルでは、最初にpygameをPythonプログラミング環境にインストールしてから、pygameとPython3を使用してゲームを開発するためのテンプレートを作成する手順を説明します。
前提条件
このチュートリアルを使用できるようにするには、Python3とプログラミング環境がローカルコンピューターまたはサーバーに既にインストールされていることを確認してください。
また、次のPythonプログラミングの概念にも精通している必要があります。
プログラミング環境がセットアップされ、 Pythonプログラミングに精通していれば、pygameでの作業を開始する準備が整います。
pygameのインストール
Python3プログラミング環境をアクティブ化することから始めましょう。
. my_env/bin/activate
これを有効にすると、pipを使用してpygameをインストールできます。
pip install pygame
このコマンドを実行すると、次のような出力が表示されます。
OutputCollecting 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がグラフィックとサウンドで何ができるかを示す模擬ゲームを実行します。
python -m pygame.examples.aliens
サンプルを開きたくない場合、またはセットアップの一部としてAVがない場合は、Pythonインタラクティブコンソールにアクセスして、pygameモジュールをインポートできることを確認することもできます。 まず、python
コマンドを入力して、コンソールを起動します。
python
次に、コンソール内でモジュールをインポートできます。
import pygame
コマンドの後にENTER
キーを押してもエラーが表示されない場合は、pygameが正常にインストールされたことがわかります。 quit()
コマンドを使用して、Pythonインタラクティブコンソールを終了できます。
コマンドラインでのインストールで問題が発生した場合は、pygameの[GettingStarted wiki]( http://pygame.org/wiki/GettingStarted#Pygame インストール)を確認できます。
後のステップでは、コードを検証するためのこのチュートリアルの一部として、モニターを使用してグラフィカルユーザーインターフェイスを表示することを想定しています。
pygameのインポート
pygameに慣れるために、our_game.py
というファイルを作成しましょう。このファイルは、nanoテキストエディターで作成できます。たとえば、次のようになります。
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()
機能は、表示面全体を画面に更新します。
多くの場合、update()
関数は、flip()
関数の代わりに使用されます。これは、領域全体ではなく画面の一部のみを更新し、メモリを節約するためです。
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ループを作成します。 ループはTrue
のBoolean値を呼び出します。これは、ループが中断されない限り、ループが永久にループすることを意味します。
プログラムのこのメインゲームループ内で、 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)
コードが機能していることを確認するために、プログラムを実行してみましょう。
python our_game.py
ファイルを実行すると、800x600のウィンドウがポップアップ表示されます。 イベントをテストするには、ウィンドウの上にマウスを置き、ウィンドウ内をクリックして、キーボードのキーを押します。 これらのイベントはコンソールウィンドウに出力されます。
受け取る出力は次のようになります。
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
を押して、プログラムの実行を停止します。
この時点で、print()
ステートメントを削除するか、コメントアウトすることができます。これは、この端末のすべてを出力する必要がないためです。
ここから、ゲームを終了する方法を学習して、テンプレートの完成に取り組むことができます。
やめる
pygameプログラムを終了するには、最初に関連するモジュールの初期化を解除してから、通常どおりPythonを終了します。
pygame.quit()
関数は、すべてのpygameモジュールの初期化を解除し、Pythonquit()
関数はプログラムを終了します。
ユーザーはゲームの機能とイベントを制御できるため、ユーザーがゲームウィンドウの上部にある[X]をクリックしてプログラムのシャットダウンを要求すると、pygame.QUIT
がイベントキューに送信されることも知っておく必要があります。コーナー。
イベント処理for
ループ内の条件付きifステートメントを使用して、プログラムのフローの制御を開始しましょう。
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(): if event.type == QUIT: pygame.quit() quit()
上記のコードでは、ユーザーがプログラムのシャットダウンを要求した場合、プログラムはpygame.quit()
でpygameモジュールの初期化を解除し、quit()
でプログラムを終了する必要があると言っています。
pygame.locals
をインポートしたので、event.type
とQUIT
をそのまま呼び出すことができます(これらの前にpygame.
を付けるのではありません)。
ユーザーはゲームウィンドウの上隅にある[X]をクリックすることを知っているかもしれませんが、他の特定のユーザーイベントがプログラムの終了要求をトリガーするようにしたい場合があります。 これは、KEYDOWN
イベントタイプと1つ以上のキーを使用して実行できます。
KEYDOWN
イベントは、ユーザーがキーボードのキーを押し下げていることを意味します。 ここでは、Q
キー(「quit」のように)またはESC
キーでプログラムを終了できるとしましょう。 for
ループ内にこれを示すコードを追加しましょう。
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(): if event.type == QUIT or ( event.type == KEYDOWN and ( event.key == K_ESCAPE or event.key == K_q )): pygame.quit() quit()
ブール論理演算子を追加して、ユーザーがゲームウィンドウの上部コーナーにある「X」をクリックした場合、またはユーザーがエスケープキーのいずれかであるキーを押した場合にプログラムを終了できるようにしました。またはQ
キー(大文字と小文字は区別されないことに注意してください)。
この時点で、python our_game.py
コマンドを使用してプログラムを実行すると、「X」アイコンでウィンドウを終了するか、を押して、実行してから終了するゲームの機能をテストできます。 Q
またはESC
キーのいずれか。
コードの改善と次のステップ
上記のプログラムは完全に機能していますが、コードを改善するためにできることがいくつかあります。
手始めに、代わりにwhile
ループにあるコードを関数定義に入れることができます。
def event_handler(): for event in pygame.event.get(): if event.type == QUIT or ( event.type == KEYDOWN and ( event.key == K_ESCAPE or event.key == K_q )): pygame.quit() quit()
これにより、while
ループが少しすっきりと凝縮され、特にゲームに機能が追加されます。
さらに、ゲームをより洗練されたものにするために、ウィンドウのタイトルバーにキャプションを追加できます(現在はpygame window
と表示されています)。 これは、次の行で実行できます。
pygame.display.set_caption('Our Game')
上記の文字列'Our Game'
は、ゲームと呼びたいものに設定できます。
さらに、pygame.display.update()
関数をメインのゲームループに移動できます。
これで、完全なコードは次のようになります。
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.set_caption('Our Game') def event_handler(): for event in pygame.event.get(): if event.type == QUIT or ( event.type == KEYDOWN and ( event.key == K_ESCAPE or event.key == K_q )): pygame.quit() quit() while True: event_handler() pygame.display.update()
また、 breakステートメントを使用してゲーム終了に移動する前にループから抜け出すなど、上記のコードにアプローチするさまざまな方法を検討することもできます。
ここから、描画やスプライトを使用して画像を表示する方法、画像をアニメーション化してフレームレートを制御する方法などについて学習します。 公式のpygameドキュメントを読むことで、pygameゲームの開発について引き続き学ぶことができます。
結論
このチュートリアルでは、オープンソースモジュールpygameをPython 3プログラミング環境にインストールする方法と、Pythonゲームのメインループを制御するために使用できるテンプレートを設定してゲーム開発に取り組む方法について説明しました。
Pythonモジュールを使用する他のプログラミングプロジェクトを行うには、「Tweepyライブラリを使用してTwitterbotを作成する方法」または「matplotlibを使用してデータをプロットする方法」を学習できます。