画像の透過処理

ラビップルをディスプレイに表示させていますが、背景部分が気になりますよね。Pygameでは画像の透過処理も簡単にできます。

画像の透過

import pygame
from pygame.locals import *
import os

def load_image(dir, filename, colorkey=None):
    file = os.path.join(dir, filename)
    image = pygame.image.load(file)
    image = image.convert()
    if not colorkey == None:
        if colorkey == -1:
            colorkey = image.get_at((0, 0))
        image.set_colorkey(colorkey, RLEACCEL)
    return image

前回のcursor.py同様、画像の読み込みもよく使う機能なので別ファイルに保存しておきます。

os.path.join()は文字列を結合してパスにすることができるPythonの関数です。fileに読み込む画像までのパスが格納されます。

convert()はピクセル形式を変更する関数です。引数になにも指定しない場合、ディスプレイと同じピクセル形式になります。画像を扱う際には、この命令でピクセル形式を最適化しておくといいようです。

load_image()の第三引数colorkeyを指定することで、背景色の処理を分岐させることができます。

ラビップルのようなキャラクターやアイテムなどは透過処理を行いたい、でも背景画像やマップチップなどはそのままでいい、といったことが可能になります。

colorkeyはデフォルトではNoneが指定されています。個別の色を指定すれば指定した色が透明になり、-1を指定すれば画像の左上のピクセルと同じ色が透明になります。

タイトル画面を作成する

画像、テキスト、カーソルを描画することができたので、簡単なタイトル画面なら作ることができます。

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

# toolsの読み込みを追加
import cursor, tools

SCR_RECT = Rect(0, 0, 640, 480)

class Main():
    def __init__(self):
        pygame.init()
        pygame.display.set_caption("sample")
        screen = pygame.display.set_mode(SCR_RECT.size)

        self.font = pygame.font.Font("data/minamoji04.ttf", 80)
        # タイトルテキスト
        self.title = self.font.render("ラビップルの冒険", True, (0, 0, 0))
        # スタートテキスト
        self.start = self.font.render("はじめる", True, (0, 0, 0))

        # -1を指定し、背景を透過させる
        self.image = tools.load_image("data", "rabipple.png", -1)

        # 背景画像は透過処理しない
        self.bg = tools.load_image("data", "bg.png")

        self.cursor = cursor.Cursor(90, 330, (0, 0, 0))

        clock = pygame.time.Clock()
        while True:
            clock.tick(30)
            self.update()
            self.draw(screen)
            pygame.display.update()
            self.key_handler()

    def update(self):
        self.cursor.update()

    def draw(self, screen):
        # 背景画像を描画
        screen.blit(self.bg, (0, 0))

        screen.blit(self.title, (((320 - (self.title.get_width() / 2)), 100)))
        screen.blit(self.start, (((320 - (self.start.get_width() / 2)), 300)))
        screen.blit(self.image, (288, 200))

        self.cursor.draw(screen)

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

if __name__ == "__main__":
    Main()

画像の読み込み用の関数、load_image()を記述したtools.pyをインポートし、背景画像やラビップルを読み込みます。ラビップルの背景は透過処理したいので、-1を指定します。

カーソルの位置や、テキストのサイズなどを微調整すれば、なんだかもう胸躍る冒険の始まりを予感させますね!