緣起

其實很多內容在 雪凡與好朋友們的 Ren’Py 遊戲引擎初學心得提示 就有了,大概寫一些製作時的心得而已。

搭配renpy官網服用,妙不可言。

檔案目錄

初學要知道的在renpy中有三個區段。我稱之為init區段,label區段以及python區段。這三個區段的語法都略有不同。
而撰寫語法的檔案,只要在game目錄下新增.rpy檔即可,不管命名為何,renpy會預設載入game目錄下所有的.rpy檔作為renpy的語法輸入。

接下來就分別說明三個區段的差異之處。

init區段

新增一個.rpy檔,若無明確指定為label或python區段,那就可以視為init區段了。
init區段通常做為定義變數、圖片、screen之用,會在遊戲啟動的瞬間先行載入。
init區段可以透過下列語法來新增

1
2
3
init -1:
    define abc = character("abc")
    image def = "def"

init旁邊接的數字的意義為載入順序(若沒寫則為0),比如說,若有三個init區段

1
2
3
4
5
6
init 1:
    image a = "a"
init 2:
    image b = "b"
init 3:
    image c = "c"

雖然撰寫順序為由上往下,但由於數字大的先載入,所以renpy會先讀取image c,接下來是b,最後才為a。 如果有載入順序的要求的話(雖然我還沒遇過),可以嘗試看看這招。

label區段

此處為遊戲運行之腳本,對於玩過avg遊戲的人應該很熟悉,就是讓你可以點一點繼續向下看對話的地方。
可以運用show , call, with dissolve之類的語句來展現對話效果。
這裡列出兩個極為重要的保留(reserved) label

1
2
3
4
5
6
label start:
    a "Are u ok"
    b "I'm fine."

label splashscreen:
    "hello moto"

現在市面上遊戲開始的流程大致如下
(開啟遊戲) 遊戲廠商logo(或片頭動畫) => 遊戲主選單 => 進入遊戲主題

label start為預設的遊戲主題進入點,當你使用Start()這個函式時即會自動跳轉到start label所在的位置。
label splashscreen則可以作為遊戲廠商logo或片頭動畫之用,是進入遊戲主選單前要執行之語句。

其他重要的label可參照官網

另外,若無指定main_menu此label,則screen main_menu是預設的遊戲主選單畫面。

python區段

在撰寫renpy的時候應該多數人都會覺得自己是在寫renpy而非寫python,雖然語法相似,很多地方還是有不同XD
另外,renpy語法雖然已經夠強大,但有些時候還是得靠python才能做到一些renpy不支援的特效。於是renpy也支援在renpy中插入python語法。

最基本的插入法可看下列程式碼

1
2
3
4
5
6
$ x = "abc"
$ y = "def"

python:
    x = "abc"
    y = "def"

這兩種寫法都是同義的,如果你只想寫一行python,可以考慮使用 $ 符號,如果你想一次撰寫多行(例如function)可以用python:的方式來撰寫。
在label區段中,插入python code應該沒任何問題,不過在init區段的screen language當中,插入python的位置就要小心。

1
2
3
4
5
6
7
screen test:
    python:
        def func():
            pass
    frame:
        textbutton "abc":
            action Function(func)
1
2
3
4
5
6
7
screen test:
    frame:
        python:
            def func():
                pass
        textbutton "abc":
            action Function(func)

這兩個寫法只是將python code稍微移動一下而已,但是下面那個版本在renpy 6.98的版本會找不到func。可能跟renpy的載入順序有關。
所以我個人是建議使用若要在screen中使用python,最好在使用前的上一層結構就先行定義。
但,如果是使用 $ 符號,好像就沒有這個問題。

python區段也可以為init,在最初的時候就先行載入,而非等到程式執行到了才動態載入。語法如下

1
2
init 2 python:
	x = "abc"

同樣的init後面的數字為載入之優先權,若無指定則為0。