马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 BuErShen 于 2019-2-14 17:42 编辑
第五回:所以說語言是人類文明的瑰寶
感謝大家在凜凜寒冬中也不忘準時收看本節目。各位好,這裡是主持人雪凡。
「大家好,我是泰克斯 (text)。」
「啊,在下是音符。」
「我是絲蔻兒。」
「各位好,我們是概念少女們!」
「......說是這麼說,不過請允許我再次重申,我只是被拉來湊數的,性別什麼的應該很明顯才對。」
「確實看得出來,手術辛苦了呢,小泰。」
「......儘管有點想問妳在鬼扯些什麼,不過想想果然還是沒有介意的必要吧。」
「切!稍微變頑強了一點呢。」
「小泰、絲蔻兒,請別這樣......」
呃……看來今天的氣氛會很火熱呢。到底是哪個傻瓜請那兩個同時來上節目的啊?社長!社長在哪裡?
「何必介意這種小事呢,這只是我們展現愛的方式而已啊。」
確實能感覺到,一股歪曲過度的愛......
「我會努力不製造您困擾的。請快點開始吧。」
是、是嗎?說的也是。
回到正題吧。
本回要加以介紹的,是文字的特效與格式化。
在由 Ren'Py 驅動的遊戲世界中,創作者可在文字中插入許多特別的「標籤」,來控制文字顯示時的效果。這些效果包括字型改變,顯示速度或滑鼠點擊的細部控制,還有諸如插入連結、插入行內圖片的功能。就算要插入變數,並將變數加以格式化,那也沒有問題。
--在角色吼叫的時候,將字體驟然放大,那不是很棒嗎?
就讓我們研究看看這一切要如何進行吧。
在文字中插入變數
我們從比較抽象一點的地方開始,來聊聊變數吧。
當我們希望遊戲中的文字能隨變數動態變化時,我們可以用 if 語句。這在第三回時做過示範。
但說到底,if 語句本身,只適用在「數量有限的分歧」上面。當變數可能產生的結果太多--比方說,允許玩家自由輸入角色名字--時,企圖用 if 讓文字產生足夠多的分歧,可說是一件完全不可能的任務。
這種時候,我們不應該用 if。取而代之,我們應該要在文字中間,直接插入變數本身!
「想插入變數的話,請用方括號 ([])。以下由我示範,各位請看。」
[RenPy] 纯文本查看 复制代码 # 文字輸入示範
text "雖然有些無趣,但基本的手續還是要辦一下的。"
text "請告訴我你的名字,我得做個記錄才行。"
# 使用以下所示的 renpy.input() 語句,可讓玩家自由輸入文字
# 第一個參數是提示字,第二個參數是預設值
$ name = renpy.input("您的名字是……", "路人丙")
text "是[name]啊,很高興認識你。"
另一種常見的使用方法,用來減少打字與剪貼量:
[RenPy] 纯文本查看 复制代码 menu:
"難得這個時間有空,去哪裡打發好呢?"
"艦橋":
position = "艦橋"
"戰情室":
position = "CIC"
"輪機室":
position = "輪機室"
"啊,去[position]一趟好了。"
還可以用來顯示某些內部狀態......
[RenPy] 纯文本查看 复制代码 "現在的好感度是:[luka_relation]!"
只要巧妙使用,插入變數顯然能成為一項有力的法寶。
跳脫
或許各位會有疑問,以中括號作為標記,在字串中插入變數固然變得非常方便。不過如此一來,當想要在文字中顯示普通的方括號時,又要怎麼做呢?
比方說,以下想要顯示一個方括號......
[RenPy] 纯文本查看 复制代码 "聽我提起這個問題,愛爾想了想,將那本厚到無以復加的聖典取出。說真格的,這還是我第一次見到這本聖典發揮它原本該有的功能。"
el "我看看哦......啊,這裡是這樣寫的......[紅之章、第二節]:紅色的神明將在六輪奇月的照耀下降至地面,大地燃起審判的火焰。"
「這小劇場也寫太長了吧?」
不要吐嘈!只是不知不覺就......嗯!回到正題。
如果您直接打出以上台詞,那遊戲會立刻掛掉,因為遊戲引擎會在讀取上述第二句時,去找一個名叫「紅之章、第二節」的變數,但,當然找不到。而且我們也不是希望她輸出變數,而是希望它按照字面輸出,找到也沒用。
我們需要的是「跳脫」。
跳脫是程式設計中的一種常見概念,簡單說來,就是讓有特殊功能的字符(比如說 " 被用作為字串的邊界--所以您不可能直接在字串中打入這個字),消除他的特殊功能,恢復字面上的意思,才能正確地以「字面意義」在字串裡使用。
這種概念在很多程式語言中都有,不過作法各有不同。
此處讓方括號進行跳脫,需要用 [[ 取代 [,如下:
[RenPy] 纯文本查看 复制代码 el "我看看哦......啊,這裡是這樣寫的......[[紅之章、第二節]:紅色的神明將在六輪奇月的照耀下降至地面,大地燃起審判的火焰。"
如此一來,實際顯示時,[[ 就會被替換為 [ 正常顯示出來,也不會再去試圖讀取變數了。
插入變數的格式化
前述的中括弧內部,不光只能是個簡單的變數名,還可以包含 Python Format Specification Mini-Language 中的格式化描述符號。這能幫助各位輕鬆調節變數(通常是數字變數)的顯示方式,讓「同一個變數可以用不同的字串格式」顯示。
有點複雜?
說得更具體一點,可以讓一個數字在顯示時,改變顯示的位數究竟有幾位,或是前面補零、留空白等......諸如此類。
【變數格式化的限制】
音符:「那個......這邊提及的『變數格式化』,僅僅只影響『純文字字串』本身。至於替文字加上黑體斜體這類,「字串」本身沒有改變,只是讓「字體」變化的,那就不算在此處提及的變數格式化之處理範圍裡面。字體改變是文字標籤的任務,後面會提到。」
變數格式化的寫法,是在變數後方接上半形冒號,再於冒號後方接上「格式描述」。比方說下面這個例子......
[RenPy] 纯文本查看 复制代码 $ pi = 3.1415926535
"圓周率為:[pi:.2]"
中括號中的 pi 是變數,至於半形冒號後面的 ".2",那就是「格式描述」了!
以上例來說,".2" 這個格式描述,代表 pi 將顯示到小數點後兩位,一言以蔽之,[pi:.2] 將會被代換為 "3.14"......嗯,是大家很熟悉的數字呢。
變數格式化能用的格式,請參考這裡或這裡這兩份 Python 文件。不過以上兩份文件都很難讀,就連主持人我都讀得很頭疼,加上 Ren'Py 與 Python 之間還有些小小差異需要您自行轉譯(見 Ren'Py 官網這裡 【新注:中文文档参考这里:https://www.renpy.cn/doc/text.html#text-interpolation】)。故還是幫大家整理一下,列在下面。
請看以下範例:
[RenPy] 纯文本查看 复制代码 # 計算 CG 達成度
$ cg_total = 127
$ cg_get = 31
$ cg_complete = float(cg_get)/cg_total # 完成度
# 上面那行的 float() 函數,是用來將整數轉換成「可允許小數點存在」的「浮點數」用的。
# 因為程式本身設計,「整數除整數只能產生整數」,所以必須先把其中一項轉為浮點數,才能得出正確結果。
# 我知道這種設計很反人類啦,但各位看倌和我抱怨也沒用......
# 未格式化的顯示結果: 0.244094488189
"CG 完成度為:[cg_complete]唷!"
# 一堆小數點,這絕對不是您想要的......
# 「小數點加數字」:顯示小數點後指定的位數
"CG 完成度為:[cg_complete:.2]唷!" # 顯示: 0.24
# 「雙百分比符號」:顯示百分數
"CG 完成度為:[cg_complete:%%]唷!" # 顯示: 24%
"CG 完成度為:[cg_complete:.2%%]唷!" # 這裡和小數點合併使用,顯示: 24.41%
# ============================
# 武器攻擊力、武器防禦力
$ weapon_def = -15
$ weapon_att = 40
# 「+ 或"空白"」:控制正負號顯示
"白銀之杖:被聖光祝福過的強大牧師手杖,對抗妖魔效果一流,不過神光也會吸引怪物攻擊"
"攻擊力[weapon_att]點!防禦力[weapon_def]點!" # 兩數字分別顯示為:「40」、「-15」。如同此處示範,預設格式化的方式,是遇到負數才顯示負號。
"攻擊力[weapon_att:+]點!防禦力[weapon_def:+]點!" # 兩數字分別顯示為:「+40」、「-15」,正負號都會顯示。
"攻擊力[weapon_att: ]點!防禦力[weapon_def: ]點!" # 兩數字分別顯示為:「 40」、「-15」,正號不顯示但會留下空白空間。
# ============================
# 可用金錢
$ budget = 231500000
# 「,」:在大數中間加逗點
"銀庫裡目前還有[budget]元。請指示......" # 顯示「231500000」
"銀庫裡目前還有[budget:,]元。請指示......" # 顯示「231,500,000」
雖然還有更多格式字串可以用,包括將數字顯示成科學計數法(如 1.322*e+13)、自動補空白對齊(但受限於字型實際上對不齊,除非您使用等寬字)等等,但......在遊戲設計中大都派不上用場。因此介紹就先到此為止。
另外說明一下,前面介紹的格式字串大都可以混合使用,不過混合時有順序限制,這方面還請各位自行試試。或參考前述連結內的說明啦。
標籤
除了插入變數時所用的中括號以外,您還可在文字中插入兩兩成對的大括號「{}」,作為文字的格式標籤。透過由大括號構成的標籤,Ren'Py 遊戲引擎能為您輸入的文字,實現各種不同的格式與特效。
許多標籤都會兩兩成對,合作框住要處理的文字,給文字作註解。就像是下面這樣:
[RenPy] 纯文本查看 复制代码 "文字{標籤名}標籤效果作用的文字範圍{/標籤名}文字"
如果您有寫過 html 網頁原始碼的經驗,就會發現這和網頁標籤幾乎一模一樣!只是把角括號 () 給換成大括號 ({}) 而已--前面的大括號中放著完整的標籤名稱;至於後面的大括號......請注意標籤名稱前方,有一道正斜線 (/)。
除了將文字包裹起來的標籤以外,有些標籤是沒有尾部的,而是單獨一個就能產生效果,如暫停用的 {w} 標籤。另外還有些標籤可能要附加設定參數,如能提供連結功能的 {a} 標籤......
--不用著急,以下都會加以說明,這邊先留個印象就好。
標籤大括號的跳脫方式與變數類似,只要您用「{{」來表示左大括號那就沒問題了。
標籤速查
可用的標籤很多,細節見這裡:http://www.renpy.org/doc/html/text.html#styling-and-text-tags 【新注:中文文档参考这里:https://www.renpy.cn/doc/text.html#tag】。以下替大家做個快速導覽。
基本字體調整用這些標籤將文字包裹起來,就能實現效果。
舉例來說......
[RenPy] 纯文本查看 复制代码 "普通文字{b}這是黑體{/b}{i}這是斜體{/i}{s}這是劃掉{/s}{u}這是底線{/u}\n{b}{i}既黑又斜{/i}{/b}的混合效果也沒問題"
【字串中的 \n】
上面的範例中,字串中間出現了一個長相奇怪的 \n 符號。
這邊補充說明一下:在字串中間,\n 是換行的意思。
泰克斯:「在第二回的節目中,有多少提過對吧?-- Ren'Py 腳本中的故事,是以『邏輯行』為單位執行的。因此就算想要在字串中表達『換行』,你當然也不能真的按下鍵盤上的 return 按鈕--那會打破邏輯行!......而為了將『換行』納為『行』的一部份,\n 就被各種程式語言,廣泛地用來代表換行時的 return 按鈕......這樣說能理解嗎?」
音符:「小知識:\n 中的 n 其實是 "newline" 的意思唷。」
上例會顯示成下面這樣:
▲ 圖1:使用標籤後的顯示效果......請注意兩種不同的標籤是可以嵌合在一起的。
效果一目了然,沒什麼解釋的必要。我們繼續。
特殊字體調整
以下標籤同樣與字體呈現方式有關,也需要透過前後兩個標籤標明影響範圍才能使用;但除此之外,這些還有些別的參數需要指定。
- color:輸入 #f00 之類的色碼,控制文字顏色
- size:指定字體大小。可以用 =+10 來增大減小,也可以設為絕對值
- font:字型,輸入為檔名。
- k:字元間距。可以加大每個字之間的距離。
舉例來說......
[RenPy] 纯文本查看 复制代码 "普通文字{color=#f00}顯示紅色{/color}{color=#0f0}顯示綠色{/color}\n{size=30}這是30號字{/size}預設大小{size=-5}減5{size=+10}再加10{/size}{/size}\n文字預設{k=0}是沒有間距的{/k},{k=5}但可以增加間距{/k}"
會顯示成下面這樣:
▲ 圖2:特殊標籤設置後的效果。不含 font 示範。
以上沒有示範 font 效果......這是因為授權問題比較難搞。有興趣的話還請各位自行試試吧。
插入額外內容
有些標籤不僅能變更現有文字的格式,還會在字串中插入一些特別的內容。如下......
【a】替文字加上連結。
此處所說的連結,可以是超連結(點擊後會打開網頁瀏覽器),也可以是 Ren'Py 內部跳轉用 label,點擊就會跳轉到由指定 label 標誌好的橋段。忘記 label 是什麼的同學,快回去複習第三回!
範例:
[RenPy] 纯文本查看 复制代码 label start:
"歡迎參觀我們的{a=http://wfst.bolgspot.com}官網{/a},或是進行{a=help}導引段落{/a}"
return
label help:
"這裡是幫助"
▲ 圖3:連結效果。點擊「導引段落」會自動跳往 help 段落去。
【image】
您可以用 image 標籤,在文字中插入各式各樣的圖片,比方說流汗、愛心符號、驚慌等等的小圖示。
當然囉,在運用這項功能之前,您必須先將圖片準備好,比方說下面這張圖片。
【新注:原图白色透明,论坛无法显示,加了灰色背景,可在此下载
04.zip
(787 Bytes, 下载次数: 0)
|