Pyxel 日本語の表示(1.9.13版の新機能)

Pyxel ビットマップフォントの表示

 Python向けレトロゲームエンジン Pyxel のバージョン1.9.13が3/22にリリースされ,サンプルにビットマップフォントを表示するコード例が追加されました。漢字を含むフォントが扱えます。


 Pyxelのバージョンアップを行ってから使ってみましょう。

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

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

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

サンプルコード

 任意のフォルダで「pyxel copy_examples」コマンドを実行してサンプルをコピーすると,以下のファイルが追加されています。
 pyxel_examples\
  13_bitmap_font.py ・・・使用例
  assets\
   umplus_j10r.bdf ・・・10ドットのフォントファイル(Unicode
   umplus_j12r.bdf ・・・12ドットのフォントファイル(Unicode

 Githubページ pyxel/python/pyxel/examples at main · kitao/pyxel · GitHub

 

ビットマップフォント

 ビットマップフォントは文字のデータをASCIIコードで定義したフォントデータで,ゲーム作成ではスコア用のフォントを独自のものにしたりするのに利用されるようです。(.bdfファイルをテキストエディタで開くと中を確認できます)
 富士通の文字資源管理システムのマニュアル内にファイルフォーマットの記載「D.6 BDF形式」がありました。
 itouh の部屋 の「itouh: BDFについて」ページに.bdf ファイルについて解説が記載されています。こちらのトップページからは.bdfファイルに含まれる文字をbmp画像ファイルに出力するツールなども取得できます。
 ・Public Domainになっている東雲フォントは文字コードが異なるため,そのままでは期待する文字が表示できません。
 

画像メモリへのアクセス機能

 サンプルコード 13_bitmap_font.py の中の pyxel.screen.data_ptr() が追加されたデータアクセス方法のようです。(ポインタというメモリのアドレスで直接データにアクセスできる仕組みが内部で働く)
 プログラムで実験をしてみます。

import pyxel
pyxel.init(32, 16,display_scale=10,capture_scale=10)

screen_ptr = pyxel.screen.data_ptr()

pyxel.cls(1)
for i in range(len(screen_ptr)):
    screen_ptr[i] = i % 16

pyxel.show()

実行結果
 
 xy座標ではなく横方向へ1つにつながったデータとして扱われているようです。

 

BDFRendererクラス

 サンプルコード 13_bitmap_font.py の中の BDFRenderer クラスの使い方を見てみます。
 (※2023-04-30 1.9.15版の 13_bitmap_font.py のコード例に記載を変更しました)

クラスのメソッド

class BDFRenderer:
    def __init__(self, bdf_filename):
    def draw_text(self, x, y, text, color=7, border_color=None, spacing=0):

呼び出し側

umplus10 = BDFRenderer("assets/umplus_j10r.bdf")
umplus12 = BDFRenderer("assets/umplus_j12r.bdf")

umplus10.draw_text(24, 8, "Pyxel♪", 8)
umplus12.draw_text(4, 98, "気軽に楽しく", 7, 5)
umplus12.draw_text(4, 113, "プログラミング!", 7, 5)

・BDFRenderer( .bdfファイルへのパス )
 ビットマップフォントのファイルを指定してインスタンスを作成しています。

・draw_text(self, x, y, text, color=7, border_color=None, spacing=0):
 テキストを表示するxy座標,テキスト,文字色,縁取りの色,文字の間隔が指定できます。
 border_colorを省略している「umplus10.draw_text(24, 8, "Pyxel♪", 8)」の書き方で縁取りなしで表示されます。


  

ビットマップフォントの表示

 BDFRendererクラスを font\bdfrenderer.py ファイルにしてテストプログラムから使用してみました。

 (追記)Githubにプログラム例を置きました。
 game/pyxel/bmpfont at main · benkyoubox/game · GitHub
 fonttest.py ・・・ fontフォルダに配置したサンプルのフォントを表示するプログラム
 main.py ・・・ Appクラスから利用する例
 font/bdfrenderer.py ・・・ BDFRendererクラス

 

01 サンプルのフォント

 umplus_j10r.bdf 漢字含む 7187文字でファイルサイズが1.09MB
 umplus_j12r.bdf 漢字含む 7187文字

fonttest01.py

import pyxel
from font.bdfrenderer import BDFRenderer
pyxel.init(256, 128,display_scale=2,capture_scale=2)
pyxel.load("walk.pyxres")

bdf1 = BDFRenderer("font/umplus_j10r.bdf")
bdf2 = BDFRenderer("font/umplus_j12r.bdf")

pyxel.cls(1)

str1 = "0123456789+-*/=\\"
str2 = "abcdefghijklmnopqrstuvwxyz"
str3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ'\"<>_"

pyxel.text(10,2,"umplus_j10r.bdf",11)
bdf1.draw_text(10, 10, str1, 7)
bdf1.draw_text(10, 20, str2, 7)
bdf1.draw_text(10, 30, str3, 7)

pyxel.text(10,50,"umplus_j12r.bdf",11)
bdf2.draw_text(10, 60, str1, 7)
bdf2.draw_text(10, 72, str2, 7)
bdf2.draw_text(10, 84, str3, 7)

pyxel.blt(10,104, 0, 0,0, 16,16,2)
pyxel.text(26,104,"Pyxel text.",7)
pyxel.show()

 <補足> ""で囲んだ文字列内で \ " をただの記号として扱うにはエスケープ文字\をつけて,\\ \" で指定します
実行結果
 
 

02 .bdfファイル追加

 Unicode Font from /efont/
 /efont/ The Electronic Font Open Laboratory. さんのUnicodeフォントを読み込ませて表示してみます。
 h10.bdf 半角英数字や記号など 2179文字でファイルサイズが244KB
 h12.bdf 半角英数字や記号など 2120文字

fonttest02.py 実行結果
 
 半角英数字だけ必要な場合はファイルサイズが小さいものを利用してもいいかもしれません。

 ファイルサイズが大きくなりますが14ドット以上の文字も表示できました。
 b14.bdf 漢字含む 31971文字でファイルサイズが4.77MB
 b16.bdf 漢字含む 24618文字
 b24.bdf 漢字含む 30641文字
fonttest03.py

import pyxel
from font.bdfrenderer import BDFRenderer
pyxel.init(512, 256,display_scale=2,capture_scale=2)
pyxel.load("walk.pyxres")

bdf1 = BDFRenderer("font/umplus_j10r.bdf")
bdf2 = BDFRenderer("font/umplus_j12r.bdf")
bdf3 = BDFRenderer("font/b14.bdf")
bdf4 = BDFRenderer("font/b16.bdf")
bdf5 = BDFRenderer("font/b24.bdf")

pyxel.cls(1)

str = "ABC123 かなカナ漢字ABC123"
bdf1.draw_text(10,   8, "10pt. " + str, 7)
bdf2.draw_text(10,  40, "12pt. " + str, 7)
bdf3.draw_text(10,  72, "14pt. " + str, 7)
bdf4.draw_text(10, 108, "16pt. " + str, 7)
bdf5.draw_text(10, 140, "24pt. " + str, 7)

pyxel.blt(10,180, 0, 0,0, 16,16,2)
pyxel.text(26,180,"Pyxel text.",7)
pyxel.show()

実行結果
 

 
国内向けのアドベンチャーゲームも作成しやすくなりますね。


※サンプル以外のフォントを読み込ませたときに,上下位置がずれる場合の対策記事
kinutani.hateblo.jp


 

関連記事

kinutani.hateblo.jp