スタッフロールを作成する

ゲーム開発には、支えてくれる仲間がいるはずです。今回は、スタッフロールを作成したいと思います。

スタッフロールとは

ゲームを完全に一人で作成するのはとても難しいことです。

プログラムができる人が、イメージどおりの絵を描けるとは限りません。BGMの作曲などは、特別な才能が必要ですし、そのすべてを兼ね備えた人がいたとしても、それらを満足のいくクオリティで完成させ、さらにゲームという形にしていくのには想像以上の時間がかかります。

そうすると、音楽や背景画像は私のようにどこかから(フリーで公開していただいているものを)拝借して使うケースが出てきますが、多くの場合ライセンスの表記が必要になります。

ソースコードに表記しておけばいい場合もありますが、プレイヤーがソースコードを見るわけではないので、より多くの人の目に触れるよう、スタッフロールを作成しましょう。

スタッフロールを作成する

今回は、ゲームの中に実装するのではなく、スタッフロール単体のプログラムを作成します。

実際に使うときは、クリア後に挿入するような形で使うことを想定しています。

以下、ソースコードの全文です。

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

SCR_RECT = Rect(0, 0, 960, 540)

class Staffroll():
    def __init__(self):
        pygame.init()
        pygame.display.set_caption("Staff Roll")
        screen = pygame.display.set_mode(SCR_RECT.size)

        self.frame = 0
        self.staff = [
            ["企画", "Jizo Games"],
            ["デザイン", "Jizo Games"],
            ["プログラム", "Jizo Games"],
            ["監督", "Jizo Games"]
        ]
        self.line_height = 80
        self.visible = True

        # self.staffのフォントオブジェクトを作成
        self.roll_list = self.create_staff_font()

        # メインループの開始
        clock = pygame.time.Clock()
        while True:
            clock.tick(60)
            self.update()
            self.draw(screen)
            pygame.display.update()
            self.key_handler()
            if self.visible == False:
                break
    
    def update(self):
        self.frame += 1
        if self.frame >= 1200:
            self.visible = False
    
    def draw(self, screen):
        screen.fill((0, 0, 0))
        for s in self.roll_list:
            screen.blit(s, (480 - (s.get_width() / 2), self.roll_list.index(s) * (s.get_height() + self.line_height) + 560 - self.frame))
    
    def key_handler(self):
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN and event.key == K_ESCAPE:
                pygame.quit()
                sys.exit()
            
            # スペースキーで終了
            if event.type == KEYDOWN and event.key == K_SPACE:
                self.visible = False
    
    def create_staff_font(self):
        font_list = []
        font = pygame.font.Font("font/ipaexg00401/ipaexg.ttf", 40)
        for s in self.staff:
            # 文字を表示したsurfaceを作成する
            s1 = font.render(s[0], True, (255, 255, 255))
            s2 = font.render(s[1], True, (255, 255, 255))

            # 作成したsurfaceのwidthを比較する
            w1 = s1.get_width()
            w2 = s2.get_width()
            if w1 > w2:
                width = w1
            elif w1 < w2:
                width = w2
            else:
                width = w1
            
            # 新たなsurfaceを作成し、二つの文字を描画する
            s3 = pygame.Surface((width, s1.get_height() + s2.get_height()))
            center = s3.get_width() / 2
            s3.blit(s1, (center - (w1 / 2), 0))
            s3.blit(s2, (center - (w2 / 2), s1.get_height()))

            # font_listに追加する
            font_list.append(s3)
        return font_list


if __name__ == "__main__":
    Staffroll()

フォントが表示されたsurfaceを作成し、画面外からゆっくりと流れてくるようにするというだけです。

これでスタッフロールの基本的な部分ができました。

あとは「BGM:〇〇様」とか、「背景:〇〇様」とかのように、必要に応じて追記していけばOKです。

フォントオブジェクトを結合する

pygameでは、二つのsurfaceを結合するメソッドはないかもしれません(見つけられませんでした)。

なので、「企画」というsurfaceと「Jizo Games」というsurfaceを結合したい場合、二つのsurfaceを内包する新しいsurfaceを作成し、そこにblitする、という手順が必要になります。

見た目的には二つのsurfaceでも、一つに結合したsurfaceでもあまり変わりません。

ソースコードのダウンロード