ゲーム開発には、支えてくれる仲間がいるはずです。今回は、スタッフロールを作成したいと思います。
スタッフロールとは
ゲームを完全に一人で作成するのはとても難しいことです。
プログラムができる人が、イメージどおりの絵を描けるとは限りません。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でもあまり変わりません。