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()
実行した画面です。
まずは『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ページに一部抜粋版を掲載しています。
技術系同人誌など まとめページ
この記事が気に入ったらサポートをしてみませんか?