Pygameを試してみました!
今回はPygameを使ってGUIアプリを作成します。
Pygameは、他のGUIライブラリと異なり、ゲーム作成に特化したライブラリです。
今回は、基礎の基礎をメインにするため、
- Pygameの雰囲気
- 基礎的なPygameの実装方法
をつかんでいただけたらと思います。
Pygameの概要
Wikipediaによると、
pygame は、ビデオゲームを製作するために設計されたクロスプラットフォームのPythonモジュール集であり、Pythonでコンピュータグラフィクスと音声を扱うためのライブラリを含んでいる。
pygameは、SDL ライブラリの上に構築されており、C言語のような低水準の機構を使わずにリアルタイムのコンピュータゲームを開発できるようにするための配慮がなされている。
ライセンス GNU Lesser General Public License
「PyQt」『フリー百科事典 ウィキペディア日本語版』より。
2020年7月02日 (木) 20:30 UTC
URL: https://ja.wikipedia.org/wiki/Pygame
※SDLとは、音声を出したり、グラフィックを描画したりする、C言語で書かれたライブラリです。
Pygameの特徴をまとめると、
- ゲームに特化したライブラリ
- 音声を出すことや、図形の描画が可能
- SDLライブラリを使用
参考までに、他のGUIライブラリは、こちらでご紹介しています。
■【Python】GUIライブラリ13個を比較【初心者へのオススメあり】
開発環境とPygameのインストール
開発環境
- OS Windows 10
- Pythonバージョン 3.7.1
- エディタ VS Code
- Pygameバージョン pygame 1.9.6
Pygameのインストール
コマンドプロンプトからpipを使ってインストールします(Windows10)。
pip install pygame
⇒「Successfully installed pygame-X.X.X」のようにでればOK
Pygameのサンプルゲームで遊んでみる
Pygameをインストールすると、いくつかのサンプルプログラムがついてきます。
どんなゲームが作れるのか、プログラムを書いてみる前に動かしてみました。
サンプルゲーム
格納フォルダ
Pygameをインストールした後には、下記フォルダにサンプルプログラム(○○.py)が入っています。
実行方法
コマンドプロンプトで、Pythonのモジュール実行することで、サンプルプログラムを動かすことができます。
python -m pygame.examples.〇〇
※○○にはプログラム名(○○.pyの○○の部分)を入れましょう。
また、格納フォルダにて、通常のPythonファイル実行コマンドでも、実行できます。
python 〇〇.py
注意
沢山のサンプルプログラムが用意されていますが、中には「開発版のPygameが無いと動かないもの」など、
環境によっては動かないプログラムがあります。
chimp チンパンジーゲーム
Pythonのモジュール実行コマンドを使って、実行してみます。
Pygameの画面が立ち上がりました。
マウスをクリックして、左右に逃げるチンパンジーを叩くゲームのようです。
chimp.pyのプログラム行数は、197行でした!
aliens シューティングゲーム
次は、格納フォルダにて、Pythonファイル実行コマンドを使って、実行します。
こちらを使っても、Pygameの画面が立ち上がりました。
これは、戦車に乗って、UFOを打ち落とすシューティングゲームです。
aliens.pyのプログラム行数は、351行でした!
コードを見ると、少ないプログラム行数でゲームが作れていますね。
【Python】GUIアプリを作ってみる【Pygame編】
それでは、実際にGUIアプリを作ってみましょう。
他のライブラリと比較して、少しだけ複雑になっていますが、頑張って説明します!!!
サンプルプログラム1 Hello World
ソースコード
import sys import pygame def main(): # pygameの初期化 pygame.init() # メイン画面(Surface)初期化(横, 縦) main_surface = pygame.display.set_mode((300, 300)) # メイン画面のタイトル pygame.display.set_caption("Pygame Sample") # フォントオブジェクト生成(引数:フォント名とフォントサイズ) # フォント名にNoneを指定するとPygameの既定のフォントになる font = pygame.font.Font(None, 30) # テキストのSurfaceオブジェクトの生成(引数:テキスト内容、antialias、文字の色RGB) text_surface = font.render("Hello World", True, (0, 0, 255)) #メイン画面の色設定(引数:RGB) main_surface.fill((220, 220, 220)) # メイン画面上にテキストを配置(引数:配置するSurface、座標) main_surface.blit(text_surface, (100, 100)) # メイン画面の更新 pygame.display.update() # Clockオブジェクトの生成 clock = pygame.time.Clock() # ループを続けるかのフラグ going = True # 終了イベント発生までループをまわす while going: # イベントを取得 for event in pygame.event.get(): # 終了イベント(画面の×ボタン押下など)の場合、 # ループを抜ける if event.type == pygame.QUIT: going = False # フレームレート(1秒間に何回画面を更新するか)の設定 clock.tick(10) # 終了処理 pygame.quit() sys.exit() if __name__ == '__main__': main()
実行結果
解説1 文字の描画について
Pygameでは、Tkinterのようにラベルウィジェットが無く、画面に直接文字を書くことができません。
文字を書くためには、テキストが書かれたSurfaceオブジェクトを作成し、それをメイン画面に張り付けていきます。
<Pygameの文字の書き方>
1.フォントオブジェクトの生成 14行目
font = pygame.font.Font(None, 30)
2.フォントオブジェクトからテキスト用のSurfaceオブジェクトの生成 16行目
text_surface = font.render("Hello World", True, (0, 0, 255))
3.メイン画面にテキスト用のSurfaceオブジェクトを配置 20行目
main_surface.blit(text_surface, (100, 100))
4.メイン画面の更新
pygame.display.update()
解説2 フレームレートについて
Pygameのコードの理解には、「フレームレート」の概念の理解が必要です。
とはいっても難しい話ではありません。
フレームレートとは、動画などで、1秒間あたりに見せるフレーム(静止画像数)のことです。
ゲームにおいても、動画と同様、動きを見せるために静止画を更新する必要があります。
Pygameは、ゲームを作るためのライブラリのため、プログラムの実装にもこの考え方が必要となります。
サンプルプログラムでは、下記の部分です。
# Clockオブジェクトの生成 clock = pygame.time.Clock() # ループを続けるかのフラグ going = True # 終了イベント発生までループをまわす while going: # イベントを取得 for event in pygame.event.get(): # 終了イベント(画面の×ボタン押下など)の場合、 # ループを抜ける if event.type == pygame.QUIT: going = False # フレームレート(1秒間に何回画面を更新するか)の設定 clock.tick(10)
画面で×ボタンが押されるなどの終了イベントが発生するまで、while分での無限ループとなり、画面が更新され続けます。
キャラクターを動かしたりする場合は、このwhile分の中に処理を書く必要があります。
38行目でフレームレートを設定しています。
次は実際にボールを画面上で動かしてみましょう!
サンプルプログラム2 ボールの落下
ソースコード
import sys import pygame def main(): # pygameの初期化 pygame.init() # メイン画面(Surface)初期化(横, 縦) main_surface = pygame.display.set_mode((300, 300)) # メイン画面のタイトル pygame.display.set_caption("Pygame Sample 2") # Clockオブジェクトの生成 clock = pygame.time.Clock() #ボールのy座標 y = 0 # ループを続けるかのフラグ going = True # 終了イベント発生までループをまわす while going: # イベントを取得 for event in pygame.event.get(): # 終了イベント(画面の×ボタン押下など)の場合、 # ループを抜ける if event.type == pygame.QUIT: going = False # メイン画面の初期化 main_surface.fill((220, 220, 220)) # ボールの座標を更新 y += 3 # ボールの描画 pygame.draw.circle(main_surface, (255,0,0), (150, y), 20) # メイン画面の更新 pygame.display.update() # フレームレート(1秒間に何回画面を更新するか)の設定 clock.tick(10) # 終了処理 pygame.quit() sys.exit() if __name__ == '__main__': main()
Hello Worldのプログラムと異なる点は、while文の中に、ボールを動かすアルゴリズムが実装されていることです。
28~35行目にて、
- メイン画面の初期化
- ボールの座標を更新
- ボールをメイン画面に描画
- メイン画面の更新
のように、ボールの位置をフレーム毎に更新しています。
実行結果
今回はここまで!
まとめ
Pygameを使って、簡単なGUIを作ることができました。
- Hello Worldを表示するGUIアプリ
- 動きをつけたGUIアプリ
ゲーム作成に特化したライブラリのため、簡単に動きをつけることができましたね。
最後に、Pygameは書籍で取り扱われているため、勉強がしやすいと思います。
ゲーム作成を通して楽しくPythonを学びたい方にお勧めです!
参考書籍
■Pygameを学べる書籍
Pythonをある程度使える人にはこちらがオススメ。