見出し画像

4-4 Pygameの文字描画

同人誌について

 この連載は、同人誌『PythonとPygameで作る レトロ風RPG 全コード』を一部抜粋して編集したものです。

 同人誌本編には、ゲーム本体のソースコードや、各種のサンプルコード、Windowsで実行できるEXEファイルが付属しています。PDFで288ページの本になります。ぜひ、こちらもご購入ください(2024-03-10:ver1.0.3 に更新)。


文字描画の例

 文字描画の例を示します。

 「example_pygame/font.py」を示します。

import pygame

def main():
    pygame.init()       # Pygameを初期化
    screen = pygame.display.set_mode((800, 600))    # 画面作成
    running = True      # 実行継続フラグ

    # システム フォント(存在しないときは pygame のデフォルト)
    sysfont = pygame.font.SysFont("", 160)

    # フォント読み込み
    p = "font/PixelMplus-20130602/PixelMplus12-Regular.ttf"
    myfont = pygame.font.Font(p, 100)

    # 文字列を描画した Surface 作成1(文字列、アンチエイリアス、色)
    col = pygame.Color(255, 255, 128)
    sysimage = sysfont.render("ABCdefあいう", True, col)
    myimage = myfont.render("ABCdefあいう", True, col)

    while running:
        pygame.display.update()     # 画面を更新
        screen.fill(pygame.Color(0, 0, 0))  # 画面を塗りつぶす
        for event in pygame.event.get():    # イベント
            if event.type == pygame.QUIT: running = False   # 終了

        screen.blit(sysimage, (100, 100))
        screen.blit(myimage, (100, 400))

        pygame.display.flip()   # 画面フリップ
    pygame.quit()

if __name__ == "__main__":
    main()

 実行した画面です。

文字描画

 まずは『Pygame』の初期化処理です。

import pygame

def main():
    pygame.init()       # Pygameを初期化
    screen = pygame.display.set_mode((800, 600))    # 画面作成
    running = True      # 実行継続フラグ

 続いて、フォントの初期化です。

    # システム フォント(存在しないときは pygame のデフォルト)
    sysfont = pygame.font.SysFont("", 160)

    # フォント読み込み
    p = "font/PixelMplus-20130602/PixelMplus12-Regular.ttf"
    myfont = pygame.font.Font(p, 100)

 文字列を描画した`Surface`の作成です。

    # 文字列を描画した Surface 作成1(文字列、アンチエイリアス、色)
    col = pygame.Color(255, 255, 128)
    sysimage = sysfont.render("ABCdefあいう", True, col)
    myimage = myfont.render("ABCdefあいう", True, col)

 『Pygame』の描画のループ処理です。

    while running:
        pygame.display.update()     # 画面を更新
        screen.fill(pygame.Color(0, 0, 0))  # 画面を塗りつぶす
        for event in pygame.event.get():    # イベント
            if event.type == pygame.QUIT: running = False   # 終了

        screen.blit(sysimage, (100, 100))
        screen.blit(myimage, (100, 400))

        pygame.display.flip()   # 画面フリップ
    pygame.quit()

フォントの読み込み

 フォントの読み込みには、システム フォントの読み込みと、パスを指定したフォントの読み込みの2種類があります。

 システム フォントの読み込みは、`pygame.font.SysFont()`でおこないます。第1引数はフォント名、第2引数はサイズ(フォントの高さ)です。第1引数が空文字のときは、デフォルトのフォントが使われます。デフォルトのフォントは、日本語を描画できません。

sysfont = pygame.font.SysFont("", 160)

 使用できるシステム フォントの一覧は`print(pygame.font.get_fonts())`で得られます。

 パスを指定したフォントの読み込みは、`pygame.font.Font()`でおこないます。第1引数はフォントのパス、第2引数はサイズ(フォントの高さ)です。引数が指定されない場合は、デフォルトのフォントが使用され、サイズは12になります。

p = "font/PixelMplus-20130602/PixelMplus12-Regular.ttf"
myfont = pygame.font.Font(p, 100)

文字の描画

 `Font`オブジェクトの`render()`メソッドで`Surface`オブジェクトを作ります。そして、作成した`Surface`オブジェクトを、`blit()`メソッドでスクリーンに描画します。

 `render()`メソッドの第1引数は描画する文字列、第2引数はアンチエイリアスの有無、第3引数は色です。文字列に改行コードを書いても、改行はされません。1行ずつ描画する必要があります。

col = pygame.Color(255, 255, 128)
sysimage = sysfont.render("ABCdefあいう", True, col)
myimage = myfont.render("ABCdefあいう", True, col)

screen.blit(sysimage, (100, 100))
screen.blit(myimage, (100, 400))

 タイトルやステータスなど、固定の文字列を描画するときは、事前に描画して`Surface`を作っておいた方が、描画の負担は少なくなります。ただ、それほど大量に文字描画をおこなわないなら、そこまで気にしなくてもよいでしょう。

文字描画の例2

 文字描画には、もう1つの方法もあります。それは「Advanced stuff」の「freetype」を使う方法です。こちらの例も示します。

 「freetype」の方が、描画の自由度が高いです。`render()`メソッド以外にも、`render_to()`メソッドがあり、`Sureface`に直接描画できます。

 「example_pygame/font2.py」を示します。

import pygame
import pygame.freetype as freetype

def main():
    pygame.init()       # Pygameを初期化
    screen = pygame.display.set_mode((800, 600))    # 画面作成
    running = True      # 実行継続フラグ

    # システム フォント(存在しないときは pygame のデフォルト)
    sysfont = freetype.SysFont("", 160)

    # フォント読み込み
    p = "font/PixelMplus-20130602/PixelMplus12-Regular.ttf"
    myfont = freetype.Font(p, 100)

    bgcol = pygame.Color(255, 255, 128)
    fgcol = pygame.Color(255, 128, 255)

    while running:
        pygame.display.update()     # 画面を更新
        screen.fill(pygame.Color(0, 0, 0))  # 画面を塗りつぶす
        for event in pygame.event.get():    # イベント
            if event.type == pygame.QUIT: running = False   # 終了

        sysfont.render_to(screen, (50, 50), "ABCdefあいう",
            bgcolor=bgcol, fgcolor=fgcol,
            style=freetype.STYLE_OBLIQUE, rotation=10, size=80)

        myfont.render_to(screen, (50, 300), "ABCdefあいう",
            fgcolor=fgcol,
            style=freetype.STYLE_OBLIQUE, rotation=-10, size=120)

        pygame.display.flip()   # 画面フリップ
    pygame.quit()

if __name__ == "__main__":
    main()

 実行した画面です。

文字描画2

 まずは『Pygame』の初期化処理です。

import pygame
import pygame.freetype as freetype

def main():
    pygame.init()       # Pygameを初期化
    screen = pygame.display.set_mode((800, 600))    # 画面作成
    running = True      # 実行継続フラグ

 インポート文で、`pygame.freetype`を`freetype`として読み込みます。

 続いて、フォントの初期化です。

    # システム フォント(存在しないときは pygame のデフォルト)
    sysfont = freetype.SysFont("", 160)

    # フォント読み込み
    p = "font/PixelMplus-20130602/PixelMplus12-Regular.ttf"
    myfont = freetype.Font(p, 100)

 色を作成します。

    bgcol = pygame.Color(255, 255, 128)
    fgcol = pygame.Color(255, 128, 255)

 『Pygame』の描画のループ処理1です。

    while running:
        pygame.display.update()     # 画面を更新
        screen.fill(pygame.Color(0, 0, 0))  # 画面を塗りつぶす
        for event in pygame.event.get():    # イベント
            if event.type == pygame.QUIT: running = False   # 終了

 『Pygame』の描画のループ処理2です。

        sysfont.render_to(screen, (50, 50), "ABCdefあいう",
            bgcolor=bgcol, fgcolor=fgcol,
            style=freetype.STYLE_OBLIQUE, rotation=10, size=80)

        myfont.render_to(screen, (50, 300), "ABCdefあいう",
            fgcolor=fgcol,
            style=freetype.STYLE_OBLIQUE, rotation=-10, size=120)

 ここで文字を描画します。`render_to()`メソッドを使えば、あらかじめ`Surface`を作る必要はないです。

 『Pygame』の描画のループ処理3です。

        pygame.display.flip()   # 画面フリップ
    pygame.quit()

同人誌について

 この連載は、同人誌『PythonとPygameで作る レトロ風RPG 全コード』を一部抜粋して編集したものです。

 同人誌本編には、ゲーム本体のソースコードや、各種のサンプルコード、Windowsで実行できるEXEファイルが付属しています。PDFで288ページの本になります。ぜひ、こちらもご購入ください(2024-03-10:ver1.0.3 に更新)。

 このnoteの記事と、Webページに一部抜粋版を掲載しています。

 技術系同人誌など まとめページ


この記事が気に入ったらサポートをしてみませんか?