この連載は、同人誌『PythonとPygameで作る レトロ風RPG 全コード』を一部抜粋して編集したものです。
同人誌本編には、ゲーム本体のソースコードや、各種のサンプルコード、Windowsで実行できるEXEファイルが付属しています。PDFで290ページの本になります。ぜひ、こちらもご購入ください。
(2024-03-28:ver1.0.4 に更新、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( 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
を作っておいた方が、描画の負担は少なくなります。ただ、それほど大量に文字描画をおこなわないなら、そこまで気にしなくてもよいでしょう。
文字描画には、もう1つの方法もあります。それは「Advanced stuff」の「freetype」を使う方法です。こちらの例も示します。
「freetype」の方が、描画の自由度が高いです。render()
メソッド以外にも、render_to()
メソッドがあり、Sureface
に直接描画できます。
「example_pygame/font2.py」を示します。
import pygameimport 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()
実行した画面です。
まずは『Pygame』の初期化処理です。
import pygameimport 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です。ここで文字を描画します。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 に更新)