Ren’Py で文字を中央表示する

Ren’Py で文字を中央表示するのはちょっと面倒です。
Ren’Py のレイアウトはスクリーンの定義とスタイルによります。ある程度のことはタグや設定から変更可能ですが、 Ren’Py 側で用意されていないレイアウトの変更をしたければそのどちらかに手を出す必要があります。

例えば文字を中央寄せするのはよくある演出です。デフォルトでも文字を中央表示する center, vcenter キャラクターが用意されていますが、これらはウィンドウを非表示にした上で文字を中央表示します。ウィンドウを表示したままで文字を中央表示するにはまずスクリーンを少し書き換える必要があります。

以下のように say スクリーン内に say_vbox スクリーン変数を追加し、デフォルト値を “say_vbox” にします。そのうえで say スクリーンの vbox に say_vbox スクリーン変数を渡します。


    screen say:

        default side_image = None
        default two_window = False
        #追加部分↓
        default say_vbox = "say_vbox"
        #追加部分↑

        if not two_window:

            window:
                id "window"

                has vbox:
                    #変更部分↓
                    #style "say_vbox"
                    style say_vbox
                    #変更部分↑

次に文字を中央表示するためのスタイル centered_say_vbox を定義します。

    style centered_say_vbox is say_vbox:
        xfill True
        yfill True

最後にウィンドウを表示したまま文字を中央寄せして表示するキャラクター centered2 を定義します。Character クラスでは “show_” を接頭辞に持つキーワード引数は接頭辞を取り除いてスクリーン変数としてスクリーンに渡されます。同様に “who_”, “what_” を接頭辞にもつキーワード引数も接頭辞を取り除いてそれぞれキャラクター名、台詞のスタイルになります。そのため以下のように定義すると vbox には centered_say_vbox スタイルが使用され、キャラクター名はウィンドウ左上端、台詞は中央表示になります。

 centered2 = Character("centered", kind=adv, who_pos=(0, 0), what_align=(.5, .5), show_say_vbox="centered_say_vbox")

これで centered2 が話す台詞はすべて中央表示になります。もしもっと簡単な方法があるという方は教えてくれると助かります。
say ステートメントからスクリーンに渡す変数ぐらい指定できるといいんですけどね。

v6.18 から if ステートメントでスタイルを渡せるようになりました。これでかなりコードがすっきりします。

    #v6.18 から引数推奨になりました。いままで通りのスクリーン宣言でも動作しますが、 default ステートメントのかわりにデフォルト引数を使うようにしましょう。
    #ここでは centered 引数を追加しました。
    screen say(who, what, side_image=None, two_window=False, centered=False):

        # 1ウィンドウ形式か2ウィンドウ形式か決めます。
        if not two_window:

            # 1ウィンドウ形式
            window:
                id "window"

                has vbox:
                    #if ステートメントでスタイルを変更します。
                    if centered:
                        style "say_vbox"
                        xfill True
                    else:
                        style "say_vbox"

                if who:
                    text who id "who"

                text what id "what"

        else:

            # 2ウィンドウ形式
            vbox:
                style "say_two_window_vbox"

                if who:
                    window:
                        style "say_who_window"

                        text who:
                            id "who"

                window:
                    id "window"

                    has vbox:
                        #if ステートメントでスタイルを変更します。
                        if centered:
                            style say_vbox
                            align (.5, .5)
                        else:
                            style say_vbox

                    text what id "what"

後は上述のように show_centered=True を引数に持つキャラクターを宣言しましょう。スタイルを定義する必要はありません。
NVL モードでもどうようにスクリーンとキャラクターを定義できます。

    # centered を引数に追加
    screen nvl(dialogue, items=None, centered=False):

        window:
            style "nvl_window"

            has vbox:
                # 中心表示用のスタイルを定義
                if centered:
                    style "nvl_vbox"
                    align (.5, .5)
                else:
                    style "nvl_vbox"

Pocket

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です