氣泡式台詞 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_what
、bubble_namebox
和 bubble_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創建的遊戲,預設的界面設置並不能使用台詞氣泡系統。 需要做兩步工作才能使用台詞氣泡系統。
第一步,下載下面兩個文件:
https://raw.githubusercontent.com/renpy/renpy/master/gui/game/gui/bubble.png
https://raw.githubusercontent.com/renpy/renpy/master/gui/game/gui/thoughtbubble.png
(譯者註:國內網路正常無法訪問以上兩個地址,請保存下面兩個圖片即可。)
將以上兩張圖片放置在 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),
}