読者です 読者をやめる 読者になる 読者になる

人工知能に関する断創録

人工知能、認知科学、心理学、ロボティクス、生物学などに興味を持っています。このブログでは人工知能のさまざまな分野について調査したことをまとめています。最近は、機械学習・Deep Learningに関する記事が多いです。



テキストを描画する

Pygame

画面上にテキストを描画します。テキストを描画するにはpygame.fontモジュールを使います。pygame.fontは、TrueTypeフォント(TTF)を使って描画します。テキストの描画は、

  1. Font オブジェクトを作成
  2. Fontオブジェクトを使ってテキストを描画したSurfaceを作成
  3. Surfaceを画面に描画

という手順で行います。テキストを画像化するのがポイントです。

f:id:aidiary:20100605083443p:plain

サンプルスクリプト

draw_text.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pygame
from pygame.locals import *
import sys
 
SCREEN_SIZE = (640, 480)
 
pygame.init()
screen = pygame.display.set_mode(SCREEN_SIZE)
pygame.display.set_caption("Hello, world!")
 
# フォントの作成
sysfont = pygame.font.SysFont(None, 80)
# テキストを描画したSurfaceを作成
hello1 = sysfont.render("Hello, world!", False, (0,0,0))
hello2 = sysfont.render("Hello, world!", True, (0,0,0))
hello3 = sysfont.render("Hello, world!", True, (255,0,0), (255,255,0))
 
while True:
    screen.fill((0,0,255))
    
    # テキストを描画する
    screen.blit(hello1, (20,50))
    screen.blit(hello2, (20,150))
    screen.blit(hello3, (20,250))
    
    pygame.display.update()
    
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()

Fontオブジェクトの作成

Fontオブジェクトは、pygame.font.SysFont()で作成します。SysFont()にはフォント名とサイズを指定します。フォント名にNoneを与えるとデフォルトフォント(freesansbold.ttf)を使います。サンプルスクリプトでは、80ポイントのデフォルトフォントを作成しています。指定したフォントが見つからない場合は、デフォルトのフォントが設定されます。残念ながら日本語のフォント(MSゴシックなど)はそのまま使えないみたいです。

# フォントの作成
sysfont = pygame.font.SysFont(None, 80)

どのようなフォントが使えるかは、pygame.font.get_fonts()で調べられます。

print pygame.font.get_fonts()

ただMacやLinuxでは1つも見つけられません。このように使えるフォントはPCによって異なります。そういう場合は、TrueTypeフォントのttfファイルをスクリプトに添付することもできます。添付したフォントを使う場合は、SysFont()の代わりにpygame.font.Font()を使います。

# フォントの作成
myfont = pygame.font.Font("myfont.ttf", 16)

上記の添付フォントを用いて日本語を表示するサンプルはフォントファイルのロード(2009/1/8)です。

テキストのレンダリング

次にFont.render()使ってテキストをレンダリングします。

# テキストを描画したSurfaceを作成
hello1 = myfont.render("Hello, world!", False, (0,0,0))
hello2 = myfont.render("Hello, world!", True, (0,0,0))
hello3 = myfont.render("Hello, world!", True, (255,0,0), (255,255,0))

第1引数は描画したい文字列です。第2引数はアンチエイリアシングを使うかです。Trueにすると文字が滑らかになります。第3引数は文字の色です。第4引数は背景の色です。省略すると透明色になります。render()の戻り値はテキストを描画したSurfaceです。このSurfaceは画像のSurfaceとまったく同じです。つまり、この段階でテキストが画像になったってことです。

テキストの描画

最後にテキストが描画されたSurfaceをスクリーンに描画します。

# テキストを描画する
screen.blit(hello1, (20,50))
screen.blit(hello2, (20,150))
screen.blit(hello3, (20,250))

スクリーンに描画するには、イメージの描画と同じくSurface.blit()を使います。ここでは、画面を表すSurfaceであるscreenにテキストの Surface(hello1, hello2, hello3)を描画してます。blit()の第2引数には座標をタプルで指定します。この段階ではバックバッファに書き込んだだけなのでまだ画面に表示されません。最後に画面を更新するpygame.display.update()でフォントが画面に表示されます。

テキストの装飾

SysFont()の作成時にboldとitalicを指定すると太字、斜体になります。もしくはFontオブジェクトの Font.set_bold()、Font.set_italic()を使います。Font.set_underline()を使うとアンダーラインを引けます。

f:id:aidiary:20100605083444p:plain

# フォント作成時にboldとitalicを指定
sysfont = pygame.font.SysFont(None, 80, bold=True, italic=True)

# フォント作成後にbold, italic, underlineをセット
sysfont = pygame.font.SysFont(None, 80)
sysfont.set_bold(True)
sysfont.set_italic(True)
sysfont.set_underline(True)