快速入門 link

歡迎來到Ren’Py快速入門手冊。此手冊意在指導你如何從零起步, 過一系列簡單的步驟製作一個Ren’Py遊戲。我們通過製作一個簡單遊戲 The Question,來實現這一目標。

Ren’Py啟動器(launcher) link

在開始製作一個遊戲之前,你最好首先花點時間學習Ren’Py啟動器(launcher)的工作機制。 啟動器(launcher)允許你創造、管理、編輯和運行Ren’Py工程。

正式開始。 正式開始前,你會需要 下載 Ren’Py.

下載Ren’Py,然後解壓並運行。

  • 在Windows平台上,雙擊下載的可執行文件。它會自動解壓Ren’Py到一個名為 renpy-<version> 的文件夾。進入這個文件夾並運行 renpy.exe 。(在副檔名隱藏的情況下,renpy.exe文件可能名字是renpy)
  • 在Max OS X平台上,雙擊下載驅動器鏡像,將其掛載為一個驅動器。當驅動器打開後,將目錄命名為 renpy-<version> 並複製到其他任意地方。(複製到哪裡不重要,但不能是只讀驅動器。不要將renpy程序文件移動到其所有目錄之外的地方——不然在其他地方該程序無法工作)進入這個目錄並運行 renpy 程序。
  • 在Linux平台上,解tar包,進入 renpy-<version> 目錄,然後運行 renpy.sh

完成以上操作後,Ren’Py啟動器(launcher)應該正常運行了。

Ren’Py啟動器(launcher)已經被翻譯為多種語言。需要更改語言的話,選擇底部右側的“preferences”項,就可以更改語言了。

(譯者註:首次運行的啟動器界面預設使用英語。請進入“preferences”,將“Language”修改為“Simplified Chinese”,就能切換為簡體中文了。後續所有圖片和描述均以簡體中文界面為基礎。)

選擇和啟動一個工程。 你首先會看到遊戲“The Question”完成之後的樣子。進入Ren’Py啟動器(launcher),在彈出的第一個窗口選擇“The Question”。然後選擇“啟動工程”進入“The Question”。

通過同樣的操作,你可以進入Ren’Py示範demo,不過請選擇“教學”而不是“The Question”。

_images/launcher.png

Ren’Py啟動器主界面。

_images/project_name.png

給一個新工程命名。

_images/resolution.png

選擇工程解析度。

_images/color.png

選擇默認主題的強調顏色和背景顏色。

創建一個新工程。 在啟動器(launcher)界面選擇“創建新工程”創建一個新工程。

如果這是你第一次創建工程,Ren’Py可能會要求你選擇一個工程目錄。這個目錄(或者稱為文件夾)會被用於創建新的工程,並且會掃描已經存在的工程。目錄選擇窗口可能會彈出在Ren’Py主界面窗口後面,我們需要找到這個窗口。

然後,啟動器(launcher)會詢問工程名稱。由於“The Question”已經被占用了,你需要輸入一個不同的工程名稱,比如“My Question”,然後輸入回車確認。

之後,啟動器(launcher)會詢問工程解析度。考慮到遊戲(文件)大小和遊戲畫面質量,預設的1280x720解析度是個良好的折中方案。由於是入門示範,我們將選擇1280x720以匹配“The Question”遊戲的美術資源,點擊“繼續”。

啟動器(launcher)將繼續詢問顏色主題——新GUI(用戶圖形界面)的強調色和背景色。此時你選擇什麼顏色都不要緊,所以隨心所欲選擇,然後點擊“繼續”。

到了這一步,Ren’Py會處理一些(後台)工作,然後輸出一個簡單的遊戲模板。該模板使用預置的美術和文本資源,但是可以運行的,並且支持一些預置的特性,例如回滾、讀檔、存檔等。選擇“啟動工程”運行這個工程。

一個簡單遊戲 link

label start:

    "希爾維亞" "嗨!今天的課怎麼樣?"

    "我" "挺好的……"

    "我當然不會承認,上課的時候內容只是左耳進右耳出。"

    "我" "你現在要回家了嗎?要不要跟我一起走?"

    "希爾維亞" "當然!"

這是一個非常簡單的Ren’Py遊戲。它不包含任何圖片和音樂,但它展示了兩個角色之間的一次對話,以及一行旁白。

如果想要嘗試,從啟動器(launcher)頂端選擇“My Question”工程,進入“編輯文件”並選擇“script.rpy”。如果這是你首次進入編輯模式,Ren’Py會詢問選用哪一款編輯器(我們向新人推薦Editra),並下載你選擇的那款。啟動器(launcher)會使用編輯器打開rpy腳本文件。

編輯器打開後,清除script.rpy裡所有內容。我們將從零開始,所以你不需要原來的那些內容。將上面案例複製到script.ry裡並保存文件。

現在萬事俱備,可以運行這個樣例了。回到啟動器(launcher)主界面,選擇“啟動工程”。Ren’Py會啟動運行。注意,不需要額外的工作量,Ren’Py就已經提供了可以讀檔和存檔以及改變配置項的菜單選項。當這些工作都完成時,點擊“啟動工程”,就可以玩這個樣例遊戲了。

這個樣例展示了一些常用的Ren’Py語句。

第一行是一個label語句。label語句常用於在程序中給某個腳本點命名。在這個例子中,我們創建了一個名為 start 的標籤。start標籤是特殊的,因為當用戶點擊主選單的“Start Game”時,Ren’Py腳本會從這個標籤開始運行。

其他行是say語句。say語句有兩種格式。一種格式是,一行單獨字串(雙引號開頭,雙引號結束,中間文字),用於表現主視角角色的陳述或者內心想法。另一種格式有兩個字串組成。常用於對話,第一個字串是說話角色名字,第二個字串是該角色正在說的話。

注意,所有say語句都要用4個空格(半形)縮進.這是因為say語句屬於同一個標籤語句下的語句塊(block)。在Ren’Py中,語句塊(block)必須相對於從屬的主語句縮進,並且同一個語句塊(block)的語句使用同樣的縮進量。

當文本自身包含雙引號時,需要使用反斜槓作為轉義符。例如


    "希爾維亞" "你有沒有聽過林肯著名的格言, \"網路無真相\"?"

當然這個簡單遊戲沒什麼可多看的,它只是一個示範如何在Ren’Py裡簡單構建框架的樣例。之後我們會添加一些圖片,不過首先,讓我們看看如何定義角色。

角色(character) link

在第一個樣例裡存在一個問題,每當角色說話時,你需要反覆輸入角色名字。在一個對話為主的遊戲中,這可能是很繁重的工作。還有,遊戲啟動後角色名字始終會以強調色顯示。為了解決這些問題,Ren’Py允許你在開頭就定義角色。這可以使你用一個短名關聯一個角色,並且能夠改變角色名字顯示的顏色。

define s = Character('希爾維亞', color="#c8ffc8")
define m = Character('我', color="#c8c8ff")

label start:

    s "嗨!今天的課怎麼樣?"

    m "挺好的……"

    "我當然不會承認,上課的時候內容只是左耳進右耳出。"

    s "你現在要回家了嗎?要不要跟我一起走?"

    m "當然!"

第一和第二行語句定義了角色。第一行定義一個短名為“s”,長名為“希爾維亞”的角色,名字顏色為淡綠色。(如同網頁裡常見的,這裡的顏色使用RGB的16進位制字元表示)

第二行創建一個短名為“m”,長名為“我”的角色,名字顏色為淡紅色。其他角色的定義可以使用“複製-黏貼”,修改角色的長名、短名和名字顏色。

我們也已經使用角色對象代替了角色名字字串。這會告訴Ren’Py使用我們定義的對應角色。

圖像(image) link

一個視覺小說如果沒有圖像的話就稱不上視覺小說了。在“The Question”裡還有另外一個場景。這也包含了一些語句展現角色圖像。如果你想嘗試的話,用這段內容完全覆蓋之前那個腳本。

define s = Character('希爾維亞', color="#c8ffc8")
define m = Character('我', color="#c8c8ff")

label start:

    scene bg meadow

    "不久之後,我們就抵達了牧場,也是我們兩人出生的地方"

    "我就是在這樣的風景環繞之中成長起來的。這裡的秋天格外秀美。"

    "童年時,我們經常在牧場裡玩耍,所以這裡滿滿充斥著回憶。"

    m "嗨……唔……"

    show sylvie green smile

    "她把臉轉向我,上面掛著微笑。她看起來興致高昂。我覺得自己剛才的緊張情緒已經消散。"

    "我得問問她!"

    m "嗯呣……你是否可以……"

    m "你是否可以做我的視覺小說畫師?"

    show sylvie green surprised

    "沉默。"

界面中的所有圖像,都會顯示在同一個畫面上。這段腳本介紹了兩種新的語句。第6行的scene語句清除了所有圖像並顯示了一個背景圖像。從第16行至第26行的展示語句在背景上顯示了一個精靈(sprite), 並根據預設改變展示的精靈。

在Ren’Py中,每個圖像都有一個名稱。該名稱包含一個tag(譯者註:圖像標籤,與label腳本標籤不同),以及一個以上的可選屬性(attribute)。tag標籤和屬性名必須以字母開頭,包含字母、數字和下劃線。例如:

  • 第6行的scene語句中,tag標籤是“bg”,屬性是“meadow”。按照習慣,背景圖像應該使用的bg作為tag標籤。
  • 第16行的第一個show語句中,tag標籤是“sylvie”,屬性是“green”和“smile”。
  • 第26行的第二個show語句中,tag標籤是“sylvie”,屬性是“green”和“surprised”。

給定tag標籤時,每次只能展示一副圖像。當擁有同樣tag標籤的第二副圖像需要展示時,它會直接替換第一副圖像,如同在第26行裡發生的情況。

Ren’Py會在images目錄下搜尋圖像文件,可以通過啟動器(launcher)的“打開目錄”選項裡選擇“images”完成配置。Ren’Py能使用PNG或者WEBP文件作為角色美術資源,JPG、JPEG、PNG或者WEBP文件作為背景美術資源。文件的命名相當重要,Ren’py將使用除去副檔名後,強制字母變為小寫的檔案名來作為圖像名。

例如,images目錄下的這些文件,定義了下列圖像:

  • “bg meadow.jpg” -> bg meadow
  • “sylvie green smile.png” -> sylvie green smile
  • “sylvie green surprised.png” -> sylvie green surprised

因為檔案名會被轉換為小寫字母,所以下面這種方式也可行。

  • “Sylvie Green Surprised.png” -> sylvie green surprised

圖像可以被放在images目錄的子目錄(子文件夾)中。目錄名忽略,只使用檔案名定義圖像名。

hide語句。 Ren’Py也支持hide語句,可以用來隱藏圖像。

label leaving:

    s "我立刻去辦!"

    hide sylvie

    "..."

    m "我不是這個意思!"

實際上,你需要使用hide語句的情況非常少見。show語句能用在角色情感變化,而scene語句用在所有人離開的情況。當某個角色離開但場景不變化時,你才需要使用hide語句。

image語句。 有時候,製作者可能不想讓Ren’Py自動定義圖像。這時image語句就能派上用場。它應該出現在文件最頂層(不縮進,在label標籤前面),為圖像文件指定對應的圖像名稱。例如:

image logo = "renpy logo.png"
image eileen happy = "eileen_happy_blue_dress.png"

image語句於初始化階段就會運行,早於label標籤開始以及其他的遊戲腳本與玩家交互。

image語句也用於比較複雜的任務,但我們會在 其他地方 討論這部分。

轉場(transition) link

在上面的腳本中,圖像的切換十分生硬。由於切換地點或者角色的出場、離場很重要,Ren’Py支持圖像的各種轉場效果。

轉場切換用於顯示在最後一個交互(對話、菜單或來源於其他語句的轉場)發生後,到下一個scene、show或hide語句運行之間。

label start:

    scene bg meadow
    with fade

    "不久之後,我們就抵達了牧場,也是我們兩人出生的地方。"

    "我就是在這樣的風景環繞之中成長起來的。這裡的秋天格外秀美。"

    "童年時,我們經常在牧場裡玩耍,所以這裡滿滿充斥著回憶。"

    m "嗨……唔……"

    show sylvie green smile
    with dissolve

    "她把臉轉向我,上面掛著微笑。她看起來興致高昂。我覺得自己剛才的緊張情緒已經消散。"

    "我得問問她!"

    m "嗯呣……你是否可以……"

    m "你是否可以做我的視覺小說畫師?"

這裡的with語句決定了需要使用的轉場效果名。最常用的轉場效果是 dissolve (溶解)。 另一個有用的轉場效果是 fade (褪色),能讓界面褪為全黑,然後逐漸亮起成新的界面。

當在多個scene、show、hide語句之後有一個轉場效果,將對以上所有語句都有效。如果你寫成這樣:


    scene bg meadow
    show sylvie green smile
    with dissolve

“bg meadow”和“sylvie green smile”圖像會同時使用dissolve轉場。如果想要每次只讓其中之一使用dissolve轉場,你需要寫兩個轉場語句:


    scene bg meadow
    with dissolve
    show sylvie green smile
    with dissolve

場景meadow裡有第一個dissolve效果,而角色sylvie裡有第二個dissolve效果。如果你想要立刻展現meadow場景,然後使用轉場效果展現角色sylvie,你可以這樣寫:


    scene bg meadow
    with None
    show sylvie smile
    with dissolve

這裡的“None”被用於標識一個特殊轉場效果,對玩家來說主界面沒有產生任何特殊效果。

位置(position) link

圖像在展示時默認水平居中,圖像底部與界面底部相接。這樣設計通常對背景和單個角色沒問題,但當界面上需要展現1個以上角色時,重新調整圖像位置也是十分合理的。同樣,基於劇情需要,調整單一角色的圖像位置也可以理解。


     show sylvie green smile at right

為了重新調整圖像位置,需要在show語句中添加一個at分句。at分句指定了圖像的展示位置。Ren’Py中包含了多個域定義的位置關鍵字: left 表示界面左端, right 表示螢幕右端, center 表示水平居中(默認位置), truecenter 表示水平和垂直同時居中。

創作者可以自己定義位置關鍵字,甚至複雜的位置移動,不過那超過了本章“快速入門”的範疇。

音樂和音效 link

大多數Ren’Py遊戲都會播放背景音樂。音樂播放需要使用play music語句。play music語句將語句中指定的檔案名識別為一個音訊檔案並播放。Ren’Py跟識別音訊檔案名並在game目錄下尋找關聯文件。音訊檔案應該是opus、ogg vorbis或者mp3格式的文件。

舉例:


    play music "illurock.ogg"

更換音樂時,我們可以使用一個fadeout and fadein分句,fadeout and fadein分句用於舊音樂的淡出和新音樂的淡入。


    play music "illurock.ogg" fadeout 1.0 fadein 1.0

queue music語句表示,在當前音樂播放完畢後播放的音訊檔案。


    queue music "next_track.opus"

樂播放可以使用stop music語句停止,這個語句也可選用fadeout分句。


    stop music

音效可以使用play sound語句來播放。與音樂不同,音效不會循環播放。


    play sound "effect.ogg"

pause語句 link

pause語句可以讓整個Ren’Py進程暫停,直到出現滑鼠單擊事件。


    pause

如果pause語句中給定一個數字,就只會暫停數字對應的秒數。


    pause 3.0

結束遊戲 link

通過運行return語句,你可以結束遊戲,而不需要做其他任何事。在此之前,最好設置一些東西能夠提示遊戲已經結束,並且可能的話給用戶一個結局數字或者結局名稱。


    ".:. Good 結局。"

    return

這就是你製作一個動態小說(kinetic novel)所需要做的,動態小說是指沒有任何分支選項的遊戲。現在,我們將關注如何在遊戲中為用戶提供菜單。

使用default、Python和if語句支持flag(標識) link

上面那些語句已經足以用於製作某些遊戲,其他一些遊戲則需要保存數據及提取數據。例如,製作者需要遊戲記下玩家做出的一個選擇,先返回主線流程中,並在後面的流程中根據之前的選擇出現對應的遊戲變現,這是個合理的需求。這就是Ren’Py支持內嵌Python代碼的原因。

這一段,我們將示範如何存儲一個flag(標識),該flag(標識)包含了玩家做過的某個選擇。我們需要先初始化flag(標識),在label之前,使用default語句。

# 如果玩家決定將視覺小說比作一本圖書,則設置為True。
default book = False

label start:

    s "嗨!今天的課怎麼樣?"

名為“book”的flag(標識)被初始化為特殊值 False (請注意首字母大寫),表示該flag還未被設置。如果label “book”對應的路徑被選擇,我們將使用一個Python assignment(Python 賦值)語句將其設置為True。

label book:

    $ book = True

    m "就像一種可以在電腦和主機上閱讀的互動式圖書。"

    jump marry

以美元標誌符“$”開頭那行文本會被識別為Python語句。assignment(賦值)語句將這裡的“book”判定為一個變數而不是一個值。Ren’Py已經支持一些其他包含Python代碼的辦法,例如多行的Python語句。我們將在本手冊的其他章節討論這點。 Ren’Py現在支持Python 2.7。不過我們還是強烈推薦寫可以同時在Python2和Python3兩個版本正常運行的Python語句。

需要檢查flag(標識)時,請使用if語句:

if book:

    "我們的第一個遊戲是基於希爾維亞的一個主意,但是後面我想實現一個自己設計的故事。"

如果結果為True,if語句下的腳本語句塊(block)將執行。相反,if語句下的腳本語句塊(block)將被跳過。if語句也可以包含一個else分句,當if結果為False時,將執行else分句中的腳本語句塊(block)。:

if book:

    "我們的第一個遊戲是基於希爾維亞的一個主意,但是後面我想實現一個自己設計的故事。"

else:

    "我們的第一個電視遊戲中,希爾維亞在腳本方面給了很多幫助。"

Python變數不僅僅可以是簡單的布爾值。變數也可以存儲玩家名字、分數或者其他一些想要記錄的事情。由於Ren’Py支持Python程式語言的所有功能,許多想法都可能實現。

發布你的遊戲 link

一旦你製作了一個遊戲,在你發布它之前還有一些事情需要完成。

檢查Ren’Py版本更新

基線的新版Ren’Py通常會修復bug和添加新特性。發布前,你需要在啟動器(launcher)中點擊“更新”,更新到最新版本的Ren’Py。你也可以手動下載新版本並查看版本更新列表,以上工作可以使用這個頁面 https://www.renpy.org/latest.html

少數情況下,Ren’Py版本升級變更後會要求你修改原來的遊戲腳本。 https://www.renpy.cn/forum.php/incompatible.html 頁面列出了這些變更明細。

檢查腳本
在啟動器(launcher)的前端頁面,選擇“生成分發版”。基於options.rpy文件中的訊息,啟動器(launcher)會建立一個或多個包含創作者所作遊戲的歸檔文件。
打包
在啟動器的首頁,選擇 “生成分發版”。基於 options.rpy 中所包含的訊息,啟動器將會建立一個或者更多個包含有遊戲文件的歸檔文件。
測試
lint代碼檢查工具不能替代完整的使用測試。在發布你的遊戲之前,你有責任進行檢查。可以考慮請求你的朋友們幫忙進行beta測試,測試者往往能發現你未能發現的問題。
發布

一旦遊戲完成並通過測試,你可以將生成的歸檔文件上傳到網路上,好讓別人能找到它們。(如果你沒有自己的網站,試試 https://itch.io 該站點裡有一大票視覺小說。) 恭喜,你已經完成了人生中的第一部視覺小說!

還有幾個地方可以發布遊戲訊息:

“The Question”的遊戲腳本 link

你可以在 這裡 查看完整的“The Question”遊戲腳本。

離開這裡之後我們可以去哪裡進一步學習? link

從零開始的快速入門只是Ren’Py功能的驚鴻一瞥。限於篇幅原因,我們省略了很多Ren’Py支持的特性,並儘可能地做出簡化——專注於“製作一部視覺小說”的最小功能特性集。

想要感受Ren’Py所有功能的話,請玩一些示範遊戲,可能的話通過網站 Ren’Py website 了解一些遊戲特性。你也可能會想要閱讀本手冊的其他內容,從GUI(用戶圖形界面)訂製嚮導開始吧。

除此之外,我們推薦你看看 Lemma Soft Forums 論壇的Ren’Py版塊,該版塊裡有三個子版塊,分別用於問答、各類庫的使用手冊以及可以用於二次開發的樣例。Lemma Soft Forums論壇是Ren’Py的交流中樞,我們非常歡迎新近入坑的創作者以及他們帶來的問題。

感謝你選擇Ren’Py視覺小說引擎。我們期待著您使用它創造出作品的那一天!