テキスト link

Ren'Py でテキストを表示する方法はいくつかあります。ユーザーにテキストを表示する方法としてまず考えられるのは saymenu ステートメントです。 text, textbutton, や label スクリーン言語ステートメントを使ってユーザーインタフェースにテキストを表示することもよくあります。これらやその他の関数は Text() displayable を作成し、これをスクリーンに表示します。

テキスト displayable の役割はユーザーにテキストを表示する工程を管理することです。テキスト displayable は以下の順序にそって処理されます:

  1. テキストを翻訳する。

  2. データをテキストに補完する。

  3. スタイルとテキストタグを使ってテキストの体裁を整える。

  4. 整えられたテキストをレイアウトする。

  5. テキストをスクリーンに描画する。

この章では Ren'Py のテキスト表示に焦点を当てます。

エスケープ文字 link

Ren'Py のテキスト表示を制御する文字が 3 つあります。クリエータはこれらの文字がエンジンに誤解釈されないよう気をつける必要があります。

\(バックスラッシュ)

バックスラッシュ文字は Ren'Py 、または Python の文字列を書くときの導入に使われます。よく使うエスケープコードは:

\" (バックスラッシュ-ダブルクォート)

ダブルクオートで囲まれた文字列にダブルクオートを含めます。

\' (バックスラッシュ-クォート)

シングルクオートで囲まれた文字列にシングルクオートを含めます。

\(バックスラッシュ-スペース)

Ren'Py の文字列にスペースを含めます。デフォルトの Ren'Py スクリプトのテキストでは、連続する空白は一つのスペース文字に折りたたまれます。

\n (バックスラッシュ-n)

テキストに改行文字を含めます。

\\ (バックスラッシュ-バックスラッシュ)

テキストにバックスラッシュ文字を含めます。

[ (左角括弧)

左角括弧はテキストへ値の補完を導入するために使われます。テキストに左角括弧自体を含めるには二重にして、 [[ と書いてください。

{ (左波括弧)

左角括弧はテキストタグを導入するために使われます。テキストに左波括弧自体を含めるには二重にして、 {{ と書いてください。

データの補完 link

Ren'Py ではテキスト文字列が表示される前にデータを補完できます。例えば、プレイヤー名が playername 変数に保存されているとすると、台詞をこのように書けます:

g "Welcome to the Nekomimi Institute, [playername]!"

Ren'Py はグローバルスコープに保存されている変数を補完します。スクリーンでテキストウィジェットを使っているときは、Ren'Py はスクリーンのローカル変数も補完します。(テキスト displayable にスコープ引数を明示的に与えることで、これをオーバーライドできます。)

Ren'Py の補完は単なる変数に限りません。フィールドやタプルの要素も補完できます。ですから、以下のコードも書けます

g "My first name is [player.names[0]]."

数を表示するときにはフォーマット化コードを適用できます。このコードは、浮動小数点数を小数第 2 位まで表示します

$ percent = 100.0 * points / max_points
g "I like you [percent:.2] percent!"

Ren'Py の文字列補完は PEP 3101 文字列フォーマット化構文を引き継いでいます。Ren'Py では { をテキストタグに使うので、文字列フォーマット化に [ を使います。

Python でサポートされている !s や !r 変換フラグに加え、 Ren'Py は !q 変換フラグをサポートしています。 !q 変換フラグはテキストタグが適切にクォートされていることを保証し、表示する文字列を望まない形式の構造にしません。例えば

g "Don't pull a fast one on me, [playername!q]."

!t 変換フラグは補完した文字列を翻訳します。

if points > 5:
    $ mood = _("happy")
else:
    $ mood = _("annoyed")

g "I'm [mood!t] to see you."

スタイリングとテキストタグ link

Ren'Py でテキストにスタイル情報を与える方法は 2 つあります。1 つめはテキストのブロック全体に適用されるスタイルを使う方法です。詳細は スタイルシステム 、特に テキストスタイルプロパティー の節を参照してください。

2 つ目はテキストタグを使う方法です。テキストタグはテキストブロックの一部にスタイルを適用するのに向いています。行ごとに同じテキストタグを適用しているようなら、代わりにスタイルの使用を考えてください。

ここにテキストタグが 2 つあります。テキストタグには自動的に閉じるものと、閉じタグが必要なものがあります。複数の閉じタグが使われたときは、最後に開かれたものが最初に閉じられる順になります。Ren'Py は不適切なネストを却下します。例

# This line is correct.
"Plain {b}Bold {i}Bold-Italic{/i} Bold{/b} Plain"

# This line is incorrect, and will cause an error or incorrect
# behavior.
"Plain {b}Bold {i}Bold-Italic{/b} Italic{/i} Plain"

テキストタグには引数を取るものがあります。この場合、タグ名に等号 (=)、引数が続きます。引数には右波括弧文字 (}) を含められません。引数の意味は、テキストタグによって変わります。

全体のテキストタグ link

以下のタグはテキスト全体に適用されます:

a link

アンカータグは自身からその閉じタグまでの間にハイパーリンクを作成します。ハイパーリンクの働きは hyperlink_functions スタイルプロパティーで制御でき、デフォルトの処理は以下のように働きます。

  • 引数が jump: で始まるなら、残りの引数はジャンプ先のラベルです。

  • 引数が call: で始まるなら、残りの引数は呼び出し先のラベルです。通常、呼び出しは現在の Ren'Py ステートメントを終わらせます。

  • 引数が call_in_new_context: で始まるなら、残りの引数は( renpy.call_in_new_context() を使用して)新しいコンテキストで呼び出すラベルです

  • そうでなければ、引数はシステムのウェブブラウザで開かれるURLです。

引数にプロトコルセクションはなく、 config.hyperlink_protocol がそのために用意されています。 config.hyperlink_protocol が "jump" に設定されると、 {a=label} と {a=jump:label} は等しくなります。制作者は config.hyperlink_handlers を使って新しいプロトコルを定義できます。

label test:

    e "Why don't you visit {a=https://renpy.org}Ren'Py's home page{/a}?"

    e "Or {a=jump:more_text}here for more info{/a}."

    return

label more_text:

    e "In Hot Springs, Arkansas, there's a statue of Al Capone you can take a picture with."

    e "That's more info, but not the kind you wanted, is it?"

    return
alpha link

alpha テキストタグは自身と閉じたタグ間のテキストを指定の不透明度でレンダリングします。不透明度は 0.0から1.0までの値で、それぞれ完全な透明と不透明に対応します。値の接頭辞に+ または - があると、不透明度はその数だけ変更されます。値の接頭辞が * なら不透明度はその数で乗算されます。

"{alpha=0.1}This text is barely readable!{/alpha}"
"{alpha=-0.1}This text is 10 percent more transparent than the default.{/alpha}"
"{alpha=*0.5}This text is half as opaque as the default.{/alpha}"
b link

ボールドタグは自身からその閉じタグまでの間をボールドフォントでレンダリングします。:

"An example of {b}bold test{/b}."
color link

カラーテキストタグは自身からその閉じタグまでの間を指定された色でレンダリングします。色は #rgb, #rgba, #rrggbb, または #rrggbbaa の形式にしてください。:

"{color=#f00}Red{/color}, {color=#00ff00}Green{/color}, {color=#0000ffff}Blue{/color}"
cps link

秒あたり文字数タグは自身からその閉じタグまでの間のテキストにおける、テキスト表示の速度を設定します。引数がアスタリスクで始まっていたら、それが現在のテキスト速度に乗ぜられます。そうでなければ、テキストを表示する速度を秒あたりの文字数で与えます。

"{cps=20}Fixed Speed{/cps} {cps=*2}Double Speed{/cps}
font link

フォントタグは自身からその閉じタグまでの間を指定されたフォントでレンダリングします。引数は、使用するフォントのファイル名です。

"Try out the {font=mikachan.ttf}mikachan font{/font}."
i link

イタリックタグは自身からその閉じタグまでの間をイタリック体でレンダリングします。

"Visit the {i}leaning tower of Pisa{/i}."
image link

イメージタグはテキストに画像を挿入する自己終了タグです。画像はテキスト一行の高さであるべきです。引数は画像のファイル名または、image ステートメントで定義された画像でなければなりません。

g "Good to see you! {image=heart.png}"
k link

カーニングタグは自身からその閉じタグまでの間の文字のカーニングを調整します。これは浮動小数点数の引数を取り、それが各カーニングペアに加えられるカーニングのピクセル数を与えます。(負数にしてカーニングを減ずることもできます。)

"{k=-.5}Negative{/k} Normal {k=.5}Positive{/k}"
outlinecolor link

outlinecolor テキストタグは(影を含む)すべてのアウトラインを指定の色に変更します。色は #rgb, #rgba, #rrggbb, または #rrggbbaa の形式にしてください。:

"Let's have a {color=#00ff00}Green{/color} outline."
plain link

plain タグはテキストが bold, italics, underline, strikethrough でなくします。

"{b}This is bold. {plain}This is not.{/plain} This is bold.{/b}"
rb link

ルビ下部タグは自身からその閉じタグまでの間のテキストをルビをふる対象としてマークします。詳細は ルビテキスト の節をご覧ください。

rt link

ルビ上部タグは自身からその閉じタグまでの間のテキストをルビの内容としてマークします。詳細は ルビテキスト の節をご覧ください。

s link

打ち消し線タグは自身からその閉じタグまでの間のテキストに打ち消し線を引きます。

g "It's good {s}to see you{/s}."
size link

サイズタグは自身からその閉じタグまでの間のテキストの大きさを変更します。引数は整数で、+ か - を前置できます。引数が整数だけなら、その大きさに設定されます。そうでなければ、大きさが指定された分だけ増減されます。

"{size=+10}Bigger{/size} {size=-10}Smaller{/size} {size=24}24 px{/size}."
space link

スペースタグはテキストに水平スペースを挿入する自己終了タグです。引数として追加されるスペースのピクセル数を与える整数を取ります。

"Before the space.{space=30}After the space."
u link

下線タグは自身からその閉じタグまでの間のテキストに下線を引きます。

g "It's good to {u}see{/u} you."
vspace link

スペースタグはテキストの行間に水平スペースを挿入する自己終了タグです。引数として追加されるスペースのピクセル数を与える整数を取ります。

"Line 1{vspace=30}Line 2"
# link

# で始まるテキストタグは無視されますが、翻訳時に文字列を区別するために加えられます。

"New{#playlist}"

台詞のテキストタグ link

台詞にのみ適用されるテキストタグはです :

fast link

テキストの行内に fast タグがあると、遅いテキストモードであっても、その前にあるテキストがすべて瞬間表示されます。

g "Looks like they're{nw}"
show trebuchet
g "Looks like they're{fast} playing with their trebuchet again."
nw link

ノーウェイトタグは現在の行が最後まで表示されきった時点で台詞を自動的に消し去る自己終了タグです。

g "Looks like they're{nw}"
show trebuchet
g "Looks like they're{fast} playing with their trebuchet again."

no-wait タグはボイスまたはセルフボイスが完了するまで進行を待ちます。

p link

段落ポーズタグは自己終了タグです。これは現在の段落を終了し、ユーザーがクリックして読み進めるのを待ちます。引数を与えられると、その引数が数字として解釈され、それだけの時間が経過すると自動的に待機が終了します。

"Line 1{p}Line 2{p=1.0}Line 3"
w link

ウェイトタグはユーザーがクリックして読み進めるまで待機する自己完結タグです。引数を与えられると、その引数は数字と解釈され、待機はその秒数が経過後に自動的に終了します。

"Line 1{w} Line 1{w=1.0} Line 1"

Pythonを使用して :ref:` カスタムテキストタグ <custom-text-tags>` も定義出来ます。

スタイルテキストタグ link

Ren'Py はスタイルにアクセス出来るテキストタグもサポートしています。これらは、タグ名が空であるようなテキストタグです。この場合、引数はスタイルの名前として取られます。 例えば {=mystyle} タグは mystyle スタイルにアクセスします。

タグと対応する閉じタグとの間のテキストはそのスタイルで定義された以下のプロパティーを持ちます。

  • antialias
  • font
  • size
  • bold
  • italic
  • underline
  • strikethrough
  • color
  • black_color
  • kerning

英語以外の言語 link

Ren'Py のデフォルトフォントには、英語やその他多くの文字が含まれています。容量の都合から、中国語、日本語、朝鮮語などに必要な文字は含まれていません。あるプロジェクトでこれらの言語をサポートするためには、まずデフォルトのフォントを以下のようなコードを使って変更しなければなりません

これだけの設定で、Ren'Py は世界の殆どの言語をサポートするでしょう。しかし、朝鮮語は分かち書きをするかしないかを選べます。Ren'Py には朝鮮語の分かち書きをサポートする特別なモードがあり、このコードで有効にできます

define gui.language = "korean-with-spaces"

これは gui.rpy の "unicode" のデフォルトから変更可能です。

日本語には複数の改行方法があります。「 japanese-normal 」で始めて、改行の機会を増やす、または減らすために、それぞれ 「 japanese-loose 」または「 japanese-strict 」に移ることを勧めます。

define gui.language = "japanese-loose"

表意文字の言語には改行が多いです。高速だが不正確な改行アルゴリズムを有効にするには、このコードを使ってください

define gui.language = "greedy"

高速な改行アルゴリズムは、NVL モードのような莫大な量のテキストを表示するゲームでなければ必要有りません。

改行アルゴリズムは renpy.language_tailor() 関数を使用して更に設定出来ます。

縦書き link

vertical スタイルが適切に設定されていると、Ren'Py は縦書きテキストを生成します。そのテキストは上から下。右から左に書かれます。

縦書きテキストに作用する2つのテキストタグがあります。

horiz link

縦書きテキスト内に横書きテキストを含めます。

vert link

横書きテキスト内に縦書きテキストを含めます。(これは縦向きの回転を行いません。)

注釈

フォントが縦書きテキストの情報を含んでいない場合、Ren'Py は横書きテキストの情報から縦書き用の情報を生成しようとします。行間隔は Ren'Py のリリースごとに異なる可能性があります。

ルビテキスト link

ルビテキスト (ふりがな表記とも言います) は、文字や単語の上に小さなテキストを配置する方法です。貴方のゲームでルビテキストをサポートするためには必要な手順があります。 :

まずは、ルビテキストのスタイルを設定します。以下のスタイル変更が必要です:

  1. ルビテキストに十分な垂直スペースを残すために、 line_leading プロパティーを使います。

  2. 新しく名前をつけたスタイルを作ります。このスタイルの size などのプロパティーは、ルビテキストに合うように設定します。

  3. yoffset を設定し、ルビテキストがベースラインの上に来るようにします。

  4. テキストのスタイルの ruby_style フィールドを、新しく作成されたスタイルに設定します。

init python:
    style.default.line_leading = 12

    style.ruby_style = Style(style.default)
    style.ruby_style.size = 12
    style.ruby_style.yoffset = -20

    style.default.ruby_style = style.ruby_style

Ren'Py の設定が済めば、rt と rb を使ってルビテキストを使えます。rt タグは、文字がルビテキストとして表示されるようにマークします。ルビテキストの前に rb タグで囲まれたテキストがあると、ルビはその上で中央寄せされます。そうでなければ、直前の一文字の上で中央寄せされます。

e "Ruby can be used for furigana (東{rt}とう{/rt} 京{rt}きょう{/rt})."

e "It's also used for translations ({rb}東京{/rb}{rt}Tokyo{/rt})."

クリエータは、ルビテキストがテキストの境界を超えないようにしなければなりません。そのようなエラーが起こらないように、先頭や左右に文字間のスペースを開ける必要があるかもしれません。

フォント link

Ren'Py は Truetype/OpenType フォントと画像ベースのフォントをサポートしています。

Truetype や OpenType フォントは、フォントファイルの名前を与えることで指定できます。ファイルはゲームディレクトリーにあるか、アーカイブファイルのひとつでなければなりません。

Ren'Py は、複数のフォントを定義している Truetype コレクションもサポートしています。コレクションにアクセスするときは、0 ベースのフォントインデクス、アットマーク、そしてファイル名の順に使ってください。例えば、「 0@font.ttc 」がコレクションの最初のフォントなら、次は「 1@font.ttc 」、などとなります。

フォントの置き換え link

config.font_replacement_map 変数は、フォントを対応付けるのに使われます。フォントのファイル名、ボールド体、イタリック体の組合せが、同じような組合せに対応付けられます。これにより、自動的に生成されたイタリック体の代わりに適切なイタリック体にできます。

このようなマッピングによって Deja Vu Sans font のイタリック版を公式の斜体版に置き換えると (web で斜体版をダウンロードする必要があります。):

init python:
    config.font_replacement_map["DejaVuSans.ttf", False, True] = ("DejaVuSans-Oblique.ttf", False, False)

このマッピングでイタリックテキストの見た目が向上します。

画像ベースのフォント link

画像ベースのフォントは、以下の登録関数の何れかを呼び出すことで登録できます。画像ベースのフォントの登録には、名前、大きさ、ボールド体、イタリック体、下線付きを指定する必要があります。これらすべてのプロパティーが登録されたフォントに合致するとき、登録されたフォントが使われます。

BMFont は Ren'Py がサポートする三つの画像フォント中では最も完全なものなので、新しいプロジェクトでは推奨されます。 BMFont の使用例は以下の通りです :

init python:
    renpy.register_bmfont("bmfont", 22, filename="bmfont.fnt")

define ebf = Character('Eileen', what_font="bmfont", what_size=22)

label demo_bmfont:

    ebf "Finally, Ren'Py supports BMFonts."

フォントグループ link

マルチ言語のゲームを作成するとき、制作者が意図した雰囲気を保ちつつ、一つのフォントですべてのゲームが使用するシステムをカバーすることは多分不可能です。これをサポートするために、 Ren'Py はフォントグループをサポートして二つ以上のフォントから文字を受け取って一つのフォントに合成出来るようにします。

フォントグループを作成するためには、 FontGroup オブジェクトを作成し、その .add メソッドを一回以上呼び出してください。フォントグループはフォント名が使用可能ならどこでも使用できます。 add メソッドはユニコードの文字コードの最初と最後を引数にし、ある文字コードをカバーする最初の範囲が使用されます。

init python:
     style.default.font = FontGroup().add("english.ttf", 0x0020, 0x007f).add("japanese.ttf", 0x0000, 0xffff)

Text Displayables link

テキストは displayable としても使えます。これによりテキストに変換を適用し、画像であるかのように変換して画面上を移動させられます。

テキストユーソリティー関数 link

低速テキストについて link

Ren'Py では、クリエータやユーザーがテキストの表示を低速にできます。この場合、Ren'Py はテキストをテクスチャにレンダリングし、そのテクスチャからスクリーンに長方形をレンダリングします。

残念ながらこれにより、文字が重複するときにレンダリングが乱れることがあります。このレンダリングの乱れを最小限にするためには、 line_leading および line_spacing を十分大きくとり、行が重複しないようにしてください。最初の行の文字の下部が切り捨てられている、特に line_spacing が負であるなら、 line_overlap_split を増やすことも考えてください。

字詰めをしても水平方向の乱れ起こりえますが、この乱れはたった 1 フレームだけなのでそれほど深刻ではありません。

乱れはメニューやその他のユーザーインターフェースのテキストのような静的なテキストでは問題になりません。

テキストオーバーフローの記録 link

Ren'Py はテキストが許可されたエリアからあふれた場合に記録出来ます。テキストオーバーフローの記録を有効化するためには、次の手順が必要です。

  1. config.debug_text_overflow 変数を True にしましょう。

  2. xmaximumymaximum スタイルをテキストdisplayable かそれを囲むものに適切に設定しましょう。

  3. ゲームを起動します。

利用可能なエリアを超えてテキストが表示されると、 Ren'Py は text_overflow.txt ファイルにエラーを記録します。