吹き出し link

Ren'Py は吹き出し(speech bubble) での台詞表示をサポートしていおり、吹き出しはインタラクティブに画面に配置出来ます。これは ADV スタイルのゲームで使用されるテキストボックスや NVL モードで使用されるフルスクリーンの台詞の代替を提供します。

ゲームで吹き出しを使用するには、キャラクターを画像タグと kind=buble で定義する必要があります。例

define e = Character(None, image="eileen", kind=bubble) # Eileen
define l = Character(None, image="lucy", kind=bubble)   # Lucy

名前(の表示)もサポートされていますが、一般的には話者は吹き出しの尻尾で示されるので名前は省略できます。

これらのキャラクターを使用して通常通りに台詞を書けます。

吹き出しを配置するには、 Shift + B を押して吹き出しエディターを表示します。吹き出しを持つ各キャラクター毎に、ボタンが2つあります。

area ボタンを押すとドラッグして吹き出しを置くエリアをグリッド上で選択できます。ドラッグが完了すると、吹き出しの位置が変わります。

properties ボタンを押すと、吹き出しに関連するプロパティーのセットを選択できます。デフォルトの吹き出しでは、さまざまなプロパティで吹き出しの尻尾の位置を制御します。

いったんキャラクター(または同じ画像タグのキャラクター群)に対する area や properties を変更するとそれらのプロパティーは再度変更されるか、次の scene ステートメントまで設定が維持されます。

area や properties が現在の台詞の行に設定されていると、対応するボタンがハイライトされます。その値が台詞の前の行またはデフォルトから継承されていると、ボタンは暗くなります。ボタンを右クリックすると現在の行にはその値を設定しないようにします。

吹き出しの維持 link

Ren'Pyでは、台詞の行間で吹き出しが保持されるモードをサポートしており、以前の吹き出しが画面から排除されるまで毎回吹き出しがポップアップします。このモードを有効にするには、吹き出しを持つにはキャラクターの retain プロパティーを True: に設定します

define e = Character(None, image="eileen", kind=bubble, retain=True)

そうすると、吹き出しがどんどん出てくるので、それぞれの吹き出しを個別に配置して各吹き出しが重ならないようにする必要があります。吹き出しエディターで "(clear retained bubbles)" ボタンを押すと、最新の台詞を除いた保持されている吹き出しがすべて画面から削除されます。

ヒント link

吹き出しはで翻訳システムで使用される識別子と同じものを使用しています。これらの識別子については 翻訳のヒント を参照してください。これらの識別子は以下の場合に代わる可能性があります :

  • 行のテキストの変更

  • 同じラベル内に同じテキストを持つ別の行が追加または削除される。

  • 行の前のラベルの追加や削除 (しかし、 hide 節のあるラベルの追加や削除は翻訳識別子を変更しません)

シーンを編集したなら、その部分を通してリプレイし、変更が吹き出し位置に影響しないか確認するとよいです。

Bubble スクリーン を編集して、吹き出しに transform を適用できます。

設定変数 link

吹き出しシステムは bubble 名前空間の変数と bubble スクリーン、およびそれに関連付けられたスタイルで制御されます。

bubble 名前空間には次の変数があります :

bubble.db_filename = "bubble.json" link

データベースファイルは game ディレクトリに配置されており、吹き出しの情報を格納しています。

bubble.clear_retain_statements = [ "call screen", "menu",  "say", "say-centered", "say-nvl", "scene", ] link

こちらは、保持されたバブルを自動的にクリアするステートメントのリストです。

bubble.cols = 24 link

水平方向での吹き出しの配置とサイズ決めに使用されるグリッドの細かさです。

bubble.default_area = (15, 1, 8, 5) link

他のエリアが指定されなければ吹き出しが配置されるデフォルトのエリアです。これは (x, y, w, h) の形式のタプルであり、各値はグリッドのセルの番号です。

bubble.expand_area = { ... } link

これはプロパティーのセット名から (left, top, right, bottom) のタプルへのマップです。このセットにあれば、その吹き出しのエリアは指定のピクセル数まで拡張されます。

これは吹き出しを制作者が膨らませたより大きくします。これにより尻尾を考慮せずに吹き出しを膨らませられ、テキスト自体もプロパティーセットが変更されたり尻尾が移動したときでもその場にとどまれます。

これはデフォルトでは次となります。

define bubble.expand_area = {
    "bottom_left" : (0, 0, 0, 22),
    "bottom_right" : (0, 0, 0, 22),
    "top_left" : (0, 22, 0, 0),
    "top_right" : (0, 22, 0, 0),
}
bubble.layer = "screens" link

保持されない吹き出しが配置されるレイヤー

bubble.properties = { ... } link

これらは area とは別に吹き出しをカスタマイズするために使用できるプロパティーです。これはプロパティーのセット名からプロパティーと値の辞書へのマップです。これらのプロパティーはキャラクターに与えられたものよりも優先され、 bubble スクリーンに渡されます。

これは Character() と同じ接頭辞システムを使用します。 window_ で始まるプロパティーは接頭辞を取り除かれて bubble スクリーン内の吹き出し自身である id "window" を持つ Displayable に渡されます。 what_ で始まるプロパティーは接頭辞が取り除かれ、 bubble スクリーン内の吹き出しのテキストである id "what" を持つ Displayable に渡されます。 who_ を持つプロパティーも同様に扱われてキャラクター名に渡されます。 show_ を持つプロパティーは bubble スクリーンへの引数として渡されます。

新規ゲームの screens.rpy は次を含みます

define bubble.frame = Frame("gui/bubble.png", 55, 55, 55, 95)

define bubble.properties = {
    "bottom_left" : {
        "window_background" : Transform(bubble.frame, xzoom=1, yzoom=1),
        "window_bottom_padding" : 27,
    },

    "bottom_right" : {
        "window_background" : Transform(bubble.frame, xzoom=-1, yzoom=1),
        "window_bottom_padding" : 27,
    },

    "top_left" : {
        "window_background" : Transform(bubble.frame, xzoom=1, yzoom=-1),
        "window_top_padding" : 27,
    },

    "top_right" : {
        "window_background" : Transform(bubble.frame, xzoom=-1, yzoom=-1),
        "window_top_padding" : 27,
    },
}

bubble.frame 変数は単に bubble.properties を簡単に定義するために使用されており、吹き出しの4つのスタイルのそれぞれに対して、吹き出しを反転して尻尾が正しい位置に来るようにするとともに、パディングを調整して尻尾のための余白を残しています。

bubble.properties_order = [ ] link

これは吹き出しエディターの表示サイクル順のプロパティーセット名のリストです。プロパティーセット名が指定されないと、プロパティーはアルファベット順のサイクルになります。

bubble.properties_callback = None link

None でなければ、これは画像タグを受け取り、その画像タグに使用されるべきプロパティー名のリストまたはタプルを、それらの名前を循環させる順序で返す関数でなければなりません。これは、 bubble.properties_order よりも優先され、キャラクターごとに bubble プロパティーのリストをカスタマイズするために使用できます。

bubble.retain_layer = "screens" link

保持される吹き出しが配置されるレイヤー

bubble.rows = 24 link

垂直方向での吹き出しの配置とサイズ決めに使用されるグリッドの細かさです。

Bubble スクリーン link

デフォルトの bubble スクリーンは screens.rpy にあり、デフォルトの say スクリーンに似ています。

screen bubble(who, what):
    style_prefix "bubble"

    window:
        id "window"

        if who is not None:

            window:
                id "namebox"
                style "bubble_namebox"

                text who:
                    id "who"

        text what:
            id "what"

say スクリーンとの違いは bubble_window, bubble_what, bubble_namebox, bubble_who を含むスタイルのセットを使用することです。これらのスタイルを直接カスタマイズするならば bubble.properties のすべてのプロパティーセットのプロパティーを設定しなくても良いです。

吹き出しにエフェクトを適用したければ、次のように表示と非表示の transform イベントを受け入れる transform を bubble screen に追加します。

screen bubble(who, what):
    style_prefix "bubble"

    window:
        id "window"

        at transform:
            on show:
                alpha 0.0
                linear .5 alpha 1.0

            on hide:
                linear .5 alpha 0.0

        if who is not None:

            window:
                id "namebox"
                style "bubble_namebox"

                text who:
                    id "who"

        text what:
            id "what"

吹き出しのサポートをゲームに追加する link

Ren'Py 8.1 のリリース前に作成されたゲームには吹き出しようのデフォルトスクリーンと設定がありません。これの修正に2ステップかかります。まず次をダウンロードしてください :

これらのファイルをあなたのゲームの game/gui ディレクトリーに配置し、次に screens.rpy の末尾に次を追加してください。

## Bubble screen ###############################################################
##
## The bubble screen is used to display dialogue to the player when using
## speech bubbles. The bubble screen takes the same parameters as the say
## screen, must create a displayable with the id of "what", and can create
## displayables with the "namebox", "who", and "window" ids.
##
## https://www.renpy.org/doc/html/bubble.html#bubble-screen

screen bubble(who, what):
    style_prefix "bubble"

    window:
        id "window"

        if who is not None:

            window:
                id "namebox"
                style "bubble_namebox"

                text who:
                    id "who"

        text what:
            id "what"

style bubble_window is empty
style bubble_namebox is empty
style bubble_who is default
style bubble_what is default

style bubble_window:
    xpadding 30
    top_padding 5
    bottom_padding 5

style bubble_namebox:
    xalign 0.5

style bubble_who:
    xalign 0.5
    textalign 0.5
    color "#000"

style bubble_what:
    align (0.5, 0.5)
    text_align 0.5
    layout "subtitle"
    color "#000"

define bubble.frame = Frame("gui/bubble.png", 55, 55, 55, 95)
define bubble.thoughtframe = Frame("gui/thoughtbubble.png", 55, 55, 55, 55)

define bubble.properties = {
    "bottom_left" : {
        "window_background" : Transform(bubble.frame, xzoom=1, yzoom=1),
        "window_bottom_padding" : 27,
    },

    "bottom_right" : {
        "window_background" : Transform(bubble.frame, xzoom=-1, yzoom=1),
        "window_bottom_padding" : 27,
    },

    "top_left" : {
        "window_background" : Transform(bubble.frame, xzoom=1, yzoom=-1),
        "window_top_padding" : 27,
    },

    "top_right" : {
        "window_background" : Transform(bubble.frame, xzoom=-1, yzoom=-1),
        "window_top_padding" : 27,
    },

    "thought" : {
        "window_background" : bubble.thoughtframe,
    }
}

define bubble.expand_area = {
    "bottom_left" : (0, 0, 0, 22),
    "bottom_right" : (0, 0, 0, 22),
    "top_left" : (0, 22, 0, 0),
    "top_right" : (0, 22, 0, 0),
    "thought" : (0, 0, 0, 0),
}