テキストの書式整形

Screendraw.text() メソッドはテキストの表示位置や書式をできる様々なオプションを備えています。以下はそのサンプルです

screen.draw.text("Text color", (50, 30), color="orange")
screen.draw.text("Font name and size", (20, 100), fontname="boogaloo", fontsize=60)
screen.draw.text("Positioned text", topright=(840, 20))
screen.draw.text("Allow me to demonstrate wrapped text.", (90, 210), width=180, lineheight=1.5)
screen.draw.text("Outlined text", (400, 70), owidth=1.5, ocolor=(255,255,0), color=(0,0,0))
screen.draw.text("Drop shadow", (640, 110), shadow=(2,2), scolor="#202020")
screen.draw.text("Color gradient", (540, 170), color="red", gcolor="purple")
screen.draw.text("Transparency", (700, 240), alpha=0.1)
screen.draw.text("Vertical text", midleft=(40, 440), angle=90)
screen.draw.text("All together now:\nCombining the above options",
    midbottom=(427,460), width=360, fontname="boogaloo", fontsize=48,
    color="#AAFF00", gcolor="#66AA00", owidth=1.5, ocolor="black", alpha=0.8)

基本的な使い方は簡単です。 screen.draw.text に表示したいテキストとその位置を指定するだけです。位置は2番目の引数として(テキストの左上隅の)座標で指定します。そのほか後述するキーワードを使った指定も可能です

screen.draw.text("hello world", (20, 100))

screen.draw.text には次のように様々なオプションのキーワード引数も指定できます。

フォント名とサイズ

フォントは fonts という名前のディレクトリからロードされます。これは images や sounds と同様の仕組みです。なおサポートしているフォントの形式は .ttf です。たとえばこのように指定します

screen.draw.text("hello world", (100, 100), fontname="Viga", fontsize=32)
  • fontname: 表示に使うフォント・ファイルの名前です。特に指定の無いときは、デフォルトでシステム・フォントを使用します。
  • fontsize: フォントのサイズをピクセル数で指定します。デフォルトは24ピクセルです。
  • antialias: アンチエイリアスを使用するかどうかの指定です。デフォルトは True で使用します。

色と背景色

screen.draw.text("hello world", (100, 100), color=(200, 200, 200), background="gray")

キーワード引数は次の通りです。

  • color: 文字の色を指定します。デフォルトは white です。
  • background: 文字の背景色を_指定します。デフォルトは None で「無し」です。

color (そのほか backgroundocolorscolor, gcolor なども)色は (赤, 緑, 青) のシーケンス、たとえば (255,127,0) のように指定します。そのほか "orange" のような pygame.Color オブジェクトのカラー名、 "#FF7F00" のような HTML の16進数文字列、または "0xFF7F00" のような16進数文字列を使っての指定も可能です。

background には None を指定することもでき、その場合背景は透明になります。pygame.font.Font.render とは違い、 screen.draw.text を呼び出すたびに背景色を指定するのは効率が良くありません。実際に必要な場合だけ背景色を指定するようにしてください。

色の透明度をアルファ値で指定する方法はサポートされていません(ただしアウトラインまたはドロップシャドウを持つ見えないテキストは例外です。これは後で解説します)。透明度についてはキーワード引数 alpha の項を読んでください。

位置指定

screen.draw.text("hello world", centery=50, right=300)
screen.draw.text("hello world", midtop=(400, 0))

使用できるキーワード引数は次の通りです。

top left bottom right
topleft bottomleft topright bottomright
midtop midleft midbottom midright
center centerx centery

位置指定のキーワード引数の使い方は pygame.Rect の位置指定プロパティと同様です。ボックスの横の位置と縦の位置に対応する2つの引数を指定するか、または両方の指定を単一の引数で渡します。

位置が過剰に指定されている(たとえば、 leftright の両方が指定されている)場合、余分な指定は(任意に、しかし決定論的に)無効にされます。「制約付きテキスト」については、後述の screen.draw.textbox を参照してください。

ワードラップ

screen.draw.text("splitting\nlines", (100, 100))
screen.draw.text("splitting lines", (100, 100), width=60)

キーワード引数は以下の通りです。

  • width: テキスト表示に使う最大幅をピクセル数で指定します。デフォルトは None です。
  • widthem: テキスト表示に使う最大幅をフォントの em で指定します。デフォルト None です。
  • lineheight: 行の間隔をフォントのデフォルトの行間を単位に指定します。 デフォルトは 1.0 です。

screen.draw.text は改行文字 \n で常に改行します。 widthwidthem が指定されている場合は、どの行もその幅を越えないように折り返そうとします。しかしすべての行のテキストが必ず指定された幅に収まるとは限りません。折り返しは空白文字のところでしかできないためです。ですから、空白を含まない長い単語があると、折り返せなくなってしまいます。アウトラインとドロップシャドウも考慮されないため、指定の幅を越えて表示される可能性があります。

スペースでの折り返しを抑制したいときはノーブレークスペース(\u00A0)を使っ てください。

テキスト・アライメント

screen.draw.text("hello\nworld", bottomright=(500, 400), align="left")

キーワード引数は以下の通りです。

  • align: 行がお互いに配置される水平位置を指定します。デフォルトは None です。

align は複数の行を表示する際の、お互いの行が配置される水平位置を決定します。指定できる値は文字列 "left", "center", または "right" です。数値を使って 0.0 (左寄せ) から 1.0 までの値を指定することもできます。さらに None も指定できます。

alignNone を指定した場合の水平位置は、他の引数の内容に左右されます。位置指定の引数(topleft, centerx など)、 anchor の設定に影響を受け、最終的なデフォルトは "left" となります。

通常はデフォルトの配置を使い、どうしてもバランスが悪く見えてしまうときにだけ align を使うことをお勧めします。

アウトライン(文字の縁取り)

screen.draw.text("hello world", (100, 100), owidth=1, ocolor="blue")

キーワード引数は以下の通りです。

  • owidth: 文字のアウトラインの太さを指定します。デフォルトは None です。
  • ocolor: アウトラインの色を指定します。デフォルトは "black" です。

owidth を指定すると文字にアウトラインが付きます。アウトライン処理はあまり細かに行われないため、文字サイズを大きくするとおそらく見た目が悪くなります。 owidth の値は 1.0 としたときにちょうどよく表示されるようになっています。フォントサイズを 24 で割った値がその単位です。

特別なケースとして、アウトラインを使用する際、 color に透明な値(たとえば (0,0,0,0)) を指定するとテキストが見えなくなり、文字の中が空になったアウトラインだけが表示されます(この機能は後述の gcolor との互換性はありません)。

ocolor に指定できる色の値は color と同じです。

ドロップシャドウ

screen.draw.text("hello world", (100, 100), shadow=(1.0,1.0), scolor="blue")

キーワード引数は以下の通りです。

  • shadow: ドロップシャドウを表示するオフセット座標 (x,y) を指定します。デフォルトは None です。
  • scolor: ドロップシャドウの色を指定します。デフォルトは "black" です。

shadow を指定すると文字にドロップシャドウが表示されます。引数にはオフセット座標の x と y の値をタプルで指定します。数値は正の値、負の値、0 の何れも使用可能です。たとえば shadow=(1.0,1.0) の場合、テキストの右下に影が付きますが、shadow=(0,-1.2) にすると、影はテキストの上に表示されます。

shadow の値は 1.0 としたときにちょうどよく表示されるようになっています。フォントサイズを 18 で割った値がその単位です。

特別なケースとして、ドロップシャドウを使用する際、 color に透明な値(たとえば (0,0,0,0)) を指定するとテキストが見えなくなり、影だけが表示されます(この機能は後述の gcolor との互換性はありません)。

scolor に指定できる色の値は color と同じです。

グラデーション

screen.draw.text("hello world", (100, 100), color="black", gcolor="green")

キーワード引数は以下の通りです。

  • gcolor: グラデーションを停止するときの色を指定します。デフォルトは None です。

テキストに垂直方向のグラデーションを付ける場合は gcolor を指定します。テキストの色は上端が color で下端が gcolor になります。グラデーションの停止位置と方向はハードコードされているため、変更することはできません。

アルファ値を使った透明度指定

screen.draw.text("hello world", (100, 100), alpha=0.5)

キーワード引数は以下の通りです。

  • alpha: 0 から 1 までのアルファ値を使って透明度を指定します。デフォルトは 1.0 です。

透明表示の際、キャッシュを使い値の再利用を最大化するため、alpha の値は丸められます。

アンカーを使った配置

screen.draw.text("hello world", (100, 100), anchor=(0.3,0.7))

キーワード引数は以下の通りです。

  • anchor: タプルの2つの要素でそれぞれ垂直と水平のアンカーを指定します。デフォルトは (0.0, 0.0) です。

位置指定のキーワード引数を指定しない場合、anchor を使ってテキストをどのように配置するか指定できます。anchor の2つの値にはそれぞれ 0.0 から 1.0 までの任意の値を指定できます。 anchor の値 (0,0) はデフォルトで、テキストの左上が座標の位置になります。値を (1,1) としたときは、テキストの右下が座標の位置になります。

回転

screen.draw.text("hello world", (100, 100), angle=10)

キーワード引数は以下の通りです。

  • angle: 時計回りの回転角度を指定します。デフォルトは 0 です。

回転させたときの Surface の位置指定は厄介です。回転したテキストを描画するとき、実際に指定した位置はアンカーとして固定され、テキストはその周りを回転することになります。たとえば、テキストの左上の座標を (100, 100) にして角度を 90 にした場合、実際には Surface の左下を (100, 100) にして描画されることになります。

これが分かりにくいようだったら、アンカーがテキストの中心に指定してみてください。アンカーをテキストの中心にすれば、いくら回転させても常にテキストの中心で変わることはありません。

回転させた Surface の描画の際は、キャッシュを使い値の再利用を最大化するため、angle の値は 3 の倍数に丸められます。

テキストのサイズ制限

screen.draw.textbox("hello world", (100, 100, 200, 50))

screen.draw.textbox には2つの引数を指定します。ひとつは描画するテキストで、もうひとつは pygame.Rect オジェクト、あるいは Rect と同じように x 座標、y 座標、幅、高さの値を要素に持つタプルで指定します。フォントのサイズは範囲内に収まる最大のものが自動的に選択されます。 fontsize と位置指定を除き、 screen.draw.textbox には screen.draw.text と同じキーワード引数が指定できます。