ウィンドウを表示し、テキストと画像を描画する

Pygameをインストールしたら、ウィンドウを作成してテキストと画像を描画してみます。

ウィンドウの作成

まず最初に、ウィンドウを表示してみます。

#!/usr/bin/env python
import pygame
from pygame.locals import *
import sys

SCR_RECT = Rect(0, 0, 640, 480) # スクリーンサイズの矩形を作成する

class Main():
    def __init__(self):
        pygame.init() # Pygameを初期化し、使えるようにする
        pygame.display.set_caption("sample") # ウィンドウのタイトル
        screen = pygame.display.set_mode(SCR_RECT.size) # SCR_RECTのサイズでディスプレイを作成する

        clock = pygame.time.Clock()
        while True:
            clock.tick(30)
            self.update() # 更新(この時点では、まだディスプレイに反映されない)
            self.draw(screen) # 描画
            pygame.display.update() # 更新をディスプレイに反映させる
            self.key_handler() # キー操作などを受け付ける

    def update(self):
        pass

    def draw(self, screen):
        screen.fill((0, 0, 0))

    def key_handler(self):
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

if __name__ == "__main__":
    Main()

ただウィンドウを表示するだけならもっと短いコードで実現できますが、ゲームを作っていくための土台とするために、オブジェクト指向でやっていこうと思います。オブジェクト指向については、Pythonの入門本などのプロの方の説明を参照してください。

まず大切なのは__init__()という関数です。これはコンストラクタと呼ばれ、クラスがインスタンス化されたときに最初に実行される初期化用の関数です。ここでウィンドウを作成するために必要な定義をして、while文でメインループを開始しています。

screen = pygame.display.set_mode(SCR_RECT.size)

pygame.display.set_mode()で、6行目で定義していたSCR_RECTのサイズのディスプレイを作成し、screenという変数に格納しています。

メインループの中では、「更新→描画→更新をディスプレイに反映→キー操作の受け付け」を延々と実行しています。

update()はまだ空っぽですが、動きをつけたい場合はここにコードを記述していきます。最後に、描画用の関数・draw()でスクリーンを真っ黒に塗りつぶしています。draw()の引数にさきほど作成したscreenを渡すことで、screenがfill()で指定した色に塗りつぶされます。

テキスト・画像の描画

続いて、テキストと画像を描画してみます。

日本語を描画するためには、フォントファイルを用意して読み込む必要があります。今回はfub工房さんの「水面字 フリー版」をお借りします。FAQに「自作ゲームへの組み込みは問題なし」と書かれているので大丈夫だと思います。画像やフォントを使用する場合は、著作権やライセンスに気をつけて使用しましょう。

#!/usr/bin/env python
import pygame
from pygame.locals import *
import sys

SCR_RECT = Rect(0, 0, 640, 480) # スクリーンサイズの矩形を作成する

class Main():
    def __init__(self):
        pygame.init() # Pygameを初期化し、使えるようにする
        pygame.display.set_caption("sample") # ウィンドウのタイトル
        screen = pygame.display.set_mode(SCR_RECT.size) # SCR_RECTのサイズでディスプレイを作成する

        # フォントオブジェクトの作成
        self.font = pygame.font.Font("data/minamoji04.ttf", 80)
        self.text = self.font.render("留年", True, (255, 255, 255))

        # 画像のロード
        self.image = pygame.image.load("data/rabipple.png")

        clock = pygame.time.Clock()
        while True:
            clock.tick(30)
            self.update() # 更新(この時点では、まだディスプレイに反映されない)
            self.draw(screen) # 描画
            pygame.display.update() # 更新をディスプレイに反映させる
            self.key_handler() # キー操作などを受け付ける

    def update(self):
        pass

    def draw(self, screen):
        screen.fill((0, 0, 0))

        # テキストの描画
        screen.blit(self.text, (120, 240))

        # 画像の描画
        screen.blit(self.image, (360, 80))

    def key_handler(self):
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

if __name__ == "__main__":
    Main()

先ほどのコードに、いくつか追記しました。

コンストラクタでFontオブジェクトを作成し、それを描画したSurfaceオブジェクト(self.text)を作成します。

Fontオブジェクトは

pygame.font.Font(使いたいフォントのファイル, サイズ)

で作成できます。作成したFontオブジェクトを、self.fontに格納します。

Pygameでテキストを描画するには、「Fontオブジェクトを作成→Fontオブジェクトでテキストを描画したSurfaceオブジェクトを作成する」という、なんだか二度手間感のあるやり方をしなければなりません。「テキストを書く」というよりは、「テキストが書かれた画像を描画する」イメージです。

Fontオブジェクトのrender()という関数を用いて、文字を描画したSurfaceオブジェクトを作成します。

self.text = self.font.render(文字, アンチエイリアス, 色, 背景色)

先ほど作成したself.font(Fontオブジェクトが格納されている)のrender()を使います。引数に渡した文字が描画されたSurfaceオブジェクトを、self.textに格納します。背景色は、省略すると透明になります。改行はできません。

そして作成したSurfaceオブジェクトをdraw()でscreen上にblitしています。

画像も考え方はほぼ同じで、コンストラクタで画像を読み込み、draw()内でblitしています。

pygame.image.load(使いたいファイル)

で、画像を読み込んだSurfaceオブジェクトが作成されます。ここでは、作成されたSurfaceオブジェクトをself.imageに格納しています。

画像とテキストが描画できれば、あとは動きをつけるだけで簡単なゲームなら作れてしまいますね。