ボタンを作成してみる

Pygameには、ボタンオブジェクトがありません。なので、ボタンを作成してみたいと思います。

ボタンクラスを作成する

class Button:
    def __init__(self, pos, size, pad, color, txtcolor, text="Button"):
        self.x = pos[0]
        self.y = pos[1]
        self.pad = pad
        self.color = color
        self.font = pygame.font.SysFont(None, size)
        self.text = self.font.render(text, True, txtcolor)
        self.button = Rect(pos, (self.text.get_width() + pad, self.text.get_height() + pad))
        self.button_bottom = Rect(pos, (self.button.width, self.button.height + 5))

    def update(self):
        self.button.top = self.y

        for event in pygame.event.get():
            if event.type == pygame.MOUSEBUTTONDOWN:
                if self.button.collidepoint(event.pos):
                    self.button.top += 2
                    print(u"ボタンが押されました")

    def draw(self, screen):
        pygame.draw.rect(screen, self.color, self.button)
        screen.blit(self.text, (self.x + self.pad / 2, self.y + self.pad / 2))

初めは、テキストオブジェクトの背景色を設定することでボタンを表現しようとしました。

しかし背景色には幅や高さを設定することができなかったので、テキストにRectオブジェクトを重ねてボタンにしようと思います。

コンストラクタに渡すpadが、内側の余白です。

マウスがクリックされた点が、作成したRectオブジェクトの範囲内にあるかどうかを、collidepoint()関数で判定し、範囲内であれば処理を行います。

ここでは、「ボタンが押されました」と表示します。

ボタンの使い方

if __name__ == "__main__":
    pygame.init()
    pygame.display.set_caption("button")
    screen = pygame.display.set_mode((640, 480))
    button = Button((200, 200), 32, 16, (255, 0, 0), (255, 255, 255))

    clock = pygame.time.Clock()
    while True:
        clock.tick(30)
        screen.fill((0, 0, 0))
        button.update()
        button.draw(screen)
        pygame.display.update()

button.pyファイルをダブルクリックして実行することで、テストすることができます。

このまま別ファイルにインポートして使用する場合、

button = Button((200, 200), 32, 16, (255, 0, 0), (255, 255, 255))

のように、引数に(左上の座標、テキストサイズ、余白、ボタンの色、テキストの色、テキスト)を渡します。

テキストに日本語を使用したい場合は、別途フォントファイルを読み込む必要があります。

Pygameの機能は基本的なものが揃っているので、どのようなものにも応用することができます。