Pyxel 日本語を表示する text()でフォント指定

<2026-03-22 追記>
 Pyxel 2.6版からtext()のフォント指定で,.ttfファイルも指定できるようになりました。
詳しくはサンプルプログラム 13_custom_font.py を参照してください。

 

Pyxel 日本語テキストの表示方法(2.2.1版からの機能)

 Python向けレトロゲームエンジン Pyxel のバージョン2.2.1(2024-09-01リリース)で,pyxel.text() でビットマップフォントを指定できるようになりました。
 日本語の文字を含むビットマップフォントを使用することで,ゲーム画面にかなや漢字を表示できます。

Windows環境でのPyxelのバージョンアップ

 ※Pyxelのバージョンが古い場合は,バージョンアップが必要です。

  1. Windowsのコマンドプロンプトを起動
    <コマンドプロンプトの起動方法>
    Windowsの検索ウィンドウ(スタートボタン横の虫眼鏡)にcmdを入力して,検索結果から「コマンドプロンプト」を選択

  2.  
  3. コマンドプロンプトに「pip install -U pyxel」を入力
    ※-Uのオプション指定によりアップグレードされます

 

ビットマップフォントの準備

 漢字などを表示するには,文字の画像データ「BDFファイル(ビットマップフォントのファイル)」が必要です。
 任意のフォルダで「pyxel copy_examples」コマンドを実行してサンプルをコピーして,pyxel_examples\assetsフォルダ内の .bdf のファイルを自分のプログラムのフォルダにコピーします。

 pyxel_examples フォルダ
  13_bitmap_font.py ・・・使用例+文字縁取り処理
  assets フォルダ
   umplus_j10r.bdf ・・・10ドットのフォントファイル(Unicode)
   umplus_j12r.bdf ・・・12ドットのフォントファイル(Unicode)

 

コードの例

 umplus_j10r.bdf を Pythonのプログラムファイルと同じフォルダに配置した例です。

 gamedev フォルダ ・・・ Pyxelのゲームを作るフォルダ(フォルダ名は例)
  fonttest.py   ・・・ Pythonのプログラムファイル(ファイル名は例)
  umplus_j10r.bdf ・・・ ビットマップフォントのファイル

<fonttest.py のコードの内容>

import pyxel

pyxel.init(128, 128)

# ビットマップフォントの読み込み
font = pyxel.Font("umplus_j10r.bdf")

# フォントを指定してテキスト表示
pyxel.text(10,10,"日本語の表示",7,font)

pyxel.show()

・pyxel.Font( filename )
 ビットマップフォントのファイルパスを指定して,Fontクラスを作成します。
・pyxel.text( x, y, s, col, font )
 引数の最後に,Fontクラスを格納した変数を指定します。

実行結果

 

文字列の表示サイズ取得

 Fontクラスの text_width() を使うと,文字列表示時の横幅を取得できます。

import pyxel

pyxel.init(128, 128)

# ビットマップフォントの読み込み
font = pyxel.Font("umplus_j10r.bdf")

# 表示する文字列の横幅を取得
msg = "あいうえおabcdefg"
w = font.text_width(msg)

# 文字列の背面に矩形を表示
pyxel.rect(10,10,w,10,3)

# フォントを指定してテキスト表示
pyxel.text(10,10,msg,7,font)

pyxel.show()

・Fontクラス.text_width( s )
 引数 s で指定した文字列の表示幅を返します。

実行結果

 

ゲームプログラムへの組み込み例

 Fontクラスの作成(ビットマップフォントの読み込み)は初期処理で行います。
 最初のPyxel紹介記事でのプログラムに,日本語表示を組み込むコードの例を示します。(コメントのある行が追加箇所)

import pyxel

pyxel.init(80,64)
pyxel.load("mygame.pyxres")
font = pyxel.Font("umplus_j10r.bdf") # フォントの読み込みは初期処理で行う

x = 0
y = 0
status = 0
def update():
    global x,y,status
    x = pyxel.mouse_x
    y = pyxel.mouse_y
    if x == 5 and y == 5:
        status = 1
    else:
        status = 0
        
    return

def draw():
    pyxel.cls(1)
    pyxel.blt( 5,5, 0, 8,0, 8,8,11)
    pyxel.blt( x,y, 0, 8,0, 8,8, 0)

    if status == 1:
        pyxel.text(20,7,"Hello world!",7)
        pyxel.text(5,30,"日本語を表示!",10,font) # フォント指定のテキスト表示
    
    return

pyxel.run(update,draw)

実行結果

 

参考

公式サンプルへのリンク

 複数のフォントファイル指定や,文字の縁取り処理の例など 
 https://github.com/kitao/pyxel/blob/main/python/pyxel/examples/13_bitmap_font.py
 13_custom_font.py

 Fontクラス
 pyxel/python/pyxel/__init__.pyi at main · kitao/pyxel · GitHub

# Font class
class Font:
    def __init__(filename: str) -> None: ...
    def text_width(s: str) -> None: ...

:

# Image class
class Image:
 :
    def text(
        self, x: float, y: float, s: str, col: int, font: Optional[Font]
    ) -> None: ...

 

ビットマップフォント公開サイト

Little Limit
 Little Limit さんのビットマップフォント(トップメニュー > font)
 8×8ドット日本語フォント「美咲フォント」JIS 第一・第二水準をサポート
 8×12ドット日本語フォント「k8x12」JIS 第一・第二水準をサポート
 12×8ドット日本語フォント「k12x8」JIS 第一水準の文字とその他の記号
 ※ 各ページのダウンロードの「X11 BDF形式」のリンクから入手可

Unicode Font from /efont/
 /efont/ The Electronic Font Open Laboratory. さんのUnicodeフォント
 h10.bdf 半角英数字や記号など 2179文字でファイルサイズが244KB
 h12.bdf 半角英数字や記号など 2120文字
 b14.bdf 漢字含む 31971文字でファイルサイズが4.77MB
 b16.bdf 漢字含む 24618文字
 b24.bdf 漢字含む 30641文字
 

関連記事

kinutani.hateblo.jp