氣泡式台詞 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或默認樣式,按鈕顏色會被調暗。 滑鼠右鍵點擊按鈕會阻止當前那行台詞應用區域或特性的值。
Retained Bubbles link
Ren’Py supports a mode in which bubbles are retained between lines of dialogue, so they pop up one by one, until the previous bubbles are cleared from the screen. To enable this mode, set a bubble character’s retain property to True:
define e = Character(None, image="eileen", kind=bubble, retain=True)
Once that’s done, the bubbles will keep popping up. Each bubble will need to be placed individually, so bubbles don’t overlap. In the bubble editor, pressing the “(clear retained bubbles)” button will remove all of the retained bubbles from the screen, except for the most recent.
小建議 link
氣泡式對話使用多語言系統相同的標識符,詳見 多語言支持貼士。 在下列情況下,對應的標識符會發生改變:
該行台詞的文本修改。
同一腳本標籤(label)下新增或刪除了同樣內容的一行台詞。
該行台詞前新增或刪除了一個腳本標籤(label),但新增或刪除帶有
hide
從句的腳本標籤並不會更改多語言標識符。
如果創作者修改過某個場景的腳本,建議回看檢查以確保不會影響氣泡式對話的效果。
配置項 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_what
、bubble_namebox
和 bubble_who
。
這些樣式都可以直接在 bubble.properties
中訂製。
在遊戲中添加氣泡式對話 link
使用8.1版之前的Ren’Py創建的遊戲,預設的界面設置並不能使用台詞氣泡系統。 需要做兩步工作才能使用台詞氣泡系統。
第一步,下載下面兩個文件:
https://raw.githubusercontent.com/renpy/renpy/master/gui/game/gui/bubble.png
https://raw.githubusercontent.com/renpy/renpy/master/gui/game/gui/thoughtbubble.png
(譯者註:國內網路正常無法訪問以上兩個地址,請保存下面兩個圖片即可。)

bubble.png link

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),
}