PythonとPygameで作る レトロ風RPG 全コード

同人誌について

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

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

(2024-03-28:ver1.0.4 に更新、2024-03-10:ver1.0.3 に更新)


4-4 Pygameの文字描画

公開:2024-03-02、更新:2024-03-10

文字描画の例

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

 「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(
text, # 文字列
antialias, # アンチエイリアスの有無
color, # 文字色
background=None # 背景色
) -> Surface

 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.freetypefreetypeとして読み込みます。

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

# システム フォント(存在しないときは 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です。ここで文字を描画します。render_to()メソッドを使えば、あらかじめSurfaceを作る必要はないです。

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』の描画のループ処理3です。これまでの描画処理と同じです。

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

同人誌について

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

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

(2024-03-28:ver1.0.4 に更新、2024-03-10:ver1.0.3 に更新)

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


トップページに戻る
Cronus Crown(クロノス・クラウン)のトップページに戻る
(c)2002-2024 Cronus Crown (c)1997-2024 Masakazu Yanai
ご意見・お問い合わせはサイト情報 弊社への連絡までお願いします
個人情報の取り扱い、利用者情報の外部送信について