氣泡式台詞 link

Ren’Py支持將對話以氣泡式台詞形式顯示。氣泡式台詞可以使用互動式設計,指定在界面上顯示的位置。 該功能可以是ADV模式遊戲下文本框或NVL模式下全螢幕對話框之外,一種新的對話表現形式。

To use speech bubbles your game, you’ll have to define Characters with an image tag, a kind of bubble. For example, 如果要在遊戲中使用氣泡式台詞,需要在定義角色對象是將類似改為 bubble。比如:

define e = Character(None, image="eileen", kind=bubble) # 艾琳
define l = Character(None, image="lucy", kind=bubble)   # 露西

可以把說話角色的名字顯示出來。不過一般說話角色會用氣泡的小尾巴來指示,所以就省略角色名了。

定義角色後可以按照正常流程編寫角色對話內容。

如果要修改氣泡位置,可以按shift+B,顯示氣泡式對話編輯器。 每個啟用對話框的角色,都會在編輯器中有兩個按鈕。

點擊area按鈕進入氣泡區域編輯模式。此時在螢幕內點擊滑鼠並拖拽後可以指定一個區域,鬆開滑鼠後氣泡就會顯示在該區域內。

點擊properties按鈕可以選擇氣泡式對話樣式。預設的樣式主要控制氣泡尾部的位置和朝向。

一旦修改了絕對某個角色(或具有相同圖像標籤的一組角色)的氣泡區域或特性後,對應特性將一直生效,除非再次修改或遇到下一個scene語句。

當前對話那行台詞的氣泡設置區域或特性時,對應的台詞會高亮顯示。如果台詞文本的樣式繼承自dialogue或默認樣式,按鈕顏色會被調暗。 滑鼠右鍵點擊按鈕會阻止當前那行台詞應用區域或特性的值。

保留氣泡 link

Ren’Py支持一種模式,可以讓氣泡在某些對話進行中保持存在。保留氣泡會挨個彈出,並在清理整個界面前始終顯示。 若要啟用該模式,只需要將角色的 retain 特性設置為True:

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

這樣設置後,氣泡會一直彈出。每個氣泡需要分別設置位置,讓氣泡間不會遮擋。 在氣泡編輯器中,點擊“(clear retained bubbles)”按鈕可以將界面氣泡清空,只保留最後一個彈出的氣泡。

小建議 link

氣泡式對話使用多語言系統相同的標識符,詳見 多語言支持貼士。 在下列情況下,對應的標識符會發生改變:

  • 該行台詞的文本修改。

  • 同一腳本標籤(label)下新增或刪除了同樣內容的一行台詞。

  • 該行台詞前新增或刪除了一個腳本標籤(label),但新增或刪除帶有 hide 從句的腳本標籤並不會更改多語言標識符。

如果創作者修改過某個場景的腳本,建議回看檢查以確保不會影響氣泡式對話的效果。

修改 bubble界面 界面可以在對話時氣泡上應用各種變換效果。

配置項 link

氣泡式對話系統的控制參數分布在 bubble 命名空間、bubble 界面定義和相關的樣式中。

bubble 命名空間包含下列配置項:

bubble.db_filename = "bubble.json" link

資料庫文件,儲存在game目錄下,包含氣泡式對話配置資訊。

bubble.cols = 24 link

更改氣泡位置時,用於定位的位置和大小的橫向分割數,即列數。

bubble.rows = 24 link

更改氣泡位置時,用於定位的位置和大小的縱向分割數,即行數。

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

台詞氣泡的默認區域。該值是一個(x, y, w, h)形式的元組,每個元素的單位都是坐標分割後的小方塊(cell)。

bubble.properties = { ... } link

這些特性(property)與氣泡區域無關,可用於訂製台詞氣泡的樣式。 該配置項可以將一個特性名稱的集合映射到一個樣式和值的字典。 字典中的特性值會覆蓋角色對象中原本的值,並最終應用和展現在 bubble 界面中。

該配置項中關於前綴的用法與 Character() 相同。 以 window_ 作為前綴的樣式將去掉這個前綴後傳入bubble界面中id為“window”的可視組件,即氣泡的本體。 以 what_ 作為前綴的樣式將去掉這個前綴後傳入bubble界面中id為“what”的可視組件,即氣泡上的文字。 以 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種氣泡樣式,值需要對圖片進行不同軸向的翻轉就能改變氣泡尾部的位置和朝向。 padding留白空間也是為了留給氣泡尾部。

bubble.properties_order = [ ] link

一個特性集合的名稱的列表,會被氣泡式台詞編輯器順序循環遍歷。 如果沒有指定某個樣式集合的名稱,其內部將會按拉丁字母順序遍歷以匹配對應特性。

bubble.properties_callback = None link

若不是None,該項應是一個函數,入參為一個圖像標籤(image tag),返回值是一個特性名稱列表或元組, 以列表或元組中的順序,最終應用到對應圖像標籤上。 該項的優先度高於 bubble.properties_order ,可以訂製角色台詞氣泡的各種樣式。

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界面 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界面可以使用自己的樣式集,包括``bubble_window``、bubble_whatbubble_nameboxbubble_who。 這些樣式都可以直接在 bubble.properties 中訂製。

If you’d like to apply effects to the speech bubble, you can do so by adding a transform to the bubble screen that accepts the show and hide transform events, like 如果創作者想要在對話氣泡上添加點效果,可以bubble界面中添加變化,比如響應show和hide事件:

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

使用8.1版之前的Ren’Py創建的遊戲,預設的界面設置並不能使用台詞氣泡系統。 需要做兩步工作才能使用台詞氣泡系統。

第一步,下載下面兩個文件:

(譯者註:國內網路正常無法訪問以上兩個地址,請保存下面兩個圖片即可。)

_images/bubble.png

bubble.png link

_images/thoughtbubble.png

thoughtbubble.png link

將以上兩張圖片放置在 game/gui 目錄下。

第二步,在screens.rpy文件結尾添加以下內容:

## 氣泡式對話界麵 ######################################################################
##
## 氣泡式對話界麵用於以對話氣泡的形式向玩家顯示對話。
## 氣泡式對話界麵的參數與 say 界面相同,必須創建一個 id 為 what 的可視組件,
## 並且可以創建 id 為 namebox、who 和 window 的可視組件。
##
## https://www.renpy.cn/doc/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),
}