繁體中文
English 简体中文 繁體中文
Methodox 首頁

入門

本頁面用三種方式製作同一個小遊戲。選擇適合你的一種即可;遊戲本身,以及你學到的有關指令碼語言的一切,都可以沿用到其他方式中。各個工具從哪裡取得,參見 安裝。

開始時你不需要任何美術素材。故事中提到但找不到的影像會以佔點陣圖繪製(角色為剪影,背景為漸層),而引擎會用主題的顏色自行繪製對話方塊和選單,因此故事從第一行起就可以遊玩。

故事

下面的每個版本都播放這個指令碼。將它儲存為 game.novella(UTF-8):

define config.title = "The Garden"

character q "Qinglan" color "#c0392b" image qinglan
default met_before = false

label start:
    scene bg garden with fade
    "Plum blossom, and nobody in the garden but one girl with a guqin."
    show qinglan smile at right with dissolve
    q "You came."
    menu:
        "I did.":
            q "Then sit with me a while."
        "I was passing.":
            $ met_before = true
            q annoyed "Of course you were."
    q "Listen, then."
    return

從頭讀起:define config.title 為遊戲命名;character 宣告一個說話者,其名字以紅色顯示,影像標記為 qinglan;default 為變數指定初始值。遊戲從 label start 開始。scene 清空舞臺並顯示背景 bg garden;單獨一行帶引號的文字是旁白;show 讓 Qinglan 出現在右側;q "..." 是她在說話;menu 提供兩個選項;q annoyed "..." 在她說話時把她的表情換成 qinglan annoyed,並且此後保持不變;在無處可返回時,return 會結束遊戲並回到主選單。

方式 1:指令碼資料夾

  1. 新建一個名為 The Garden 的資料夾,把 game.novella 放進去。

  2. 如果你有美術素材,就新增進來。影像按其路徑命名,因此下面這些檔案正好就是指令碼所要求的影像:

    The Garden/
      game.novella
      bg/garden.jpg                    -> bg garden
      sprites/qinglan/smile.png        -> qinglan smile
      sprites/qinglan/annoyed.png      -> qinglan annoyed
    

    名為 images、sprites 或 characters 的頂層資料夾不計入名稱,路徑的其餘部分成為一個個單詞,名稱一律小寫。

  3. 執行它:

    NovellaPlayer run "The Garden"
    

    主選單隨即開啟。點選 Start。

  4. 檢查它:NovellaPlayer lint "The Garden" 會列出故事引用了但並不存在的任何東西,例如沒有對應檔案的影像名稱。

編寫時,NovellaPlayer run "The Garden" --developer 會開啟開發者工具:Shift+R 重新載入指令碼並重新開始你所在的標籤,Shift+O 開啟一個主控台,在其中用 jump label_name 可以直接跳轉到某個標籤。

方式 2:C#

建立一個引用 Novella 專案的 .NET 10 主控台程式(參見 安裝),把方式 1 中的資料夾以 Assets 為名放在它旁邊,然後編寫:

using Novella;

NovellaGame game = new("The Garden", 1920, 1080);
game.AddAssetFolder("Assets");
game.LoadScriptsFromAssets();
game.Run();

AddAssetFolder 告訴遊戲它的檔案在哪裡,LoadScriptsFromAssets 按路徑順序載入其中的每個 .novella 檔案,Run 開啟視窗,並在玩家退出時返回。指令碼中的 define config.width 和 define config.height 會覆蓋這裡給出的解析度。

程式碼能做指令碼做不到的事。下面故事用 run 向程式請求一些東西:

    $ answer = "moon"
    run riddle answer
    if _return:
        q "Correct."
using Novella.Values;

game.RegisterCommand("riddle", arguments => Value.FromBoolean(arguments[0].AsText() == "moon"));

命令的結果會放入 _return。開發 完整介紹了 C# API,包括把遊戲寫成一個類。

不使用指令碼

故事也可以用 C# 編寫。故事構建器寫出的標籤與上面的指令碼相同,因此該遊戲的存檔、讀檔和回滾與指令碼版完全一樣;此時 Assets 資料夾中只需要美術素材:

using Novella;
using Novella.Building;

NovellaGame game = new("The Garden", 1920, 1080);
game.AddAssetFolder("Assets");
game.WriteStory(story =>
{
    story.Character("q", "Qinglan", color: "#c0392b", image: "qinglan")
        .Default("met_before", false);
    story.Label("start", s => s
        .Scene("bg garden", with: "fade")
        .Narrate("Plum blossom, and nobody in the garden but one girl with a guqin.")
        .Show("qinglan smile", at: "right", with: "dissolve")
        .Say("q", "You came.")
        .Menu(m => m
            .Choice("I did.", c => c.Say("q", "Then sit with me a while."))
            .Choice("I was passing.", c => c.Set("met_before", true).Say("q", "Of course you were.", "annoyed")))
        .Say("q", "Listen, then.")
        .Return());
});
game.Run();

條件可以是 C# lambda,例如 .If(v => v.Flag("met_before"), ...),也可以是構建出來的、能讀回為指令碼的值。完整的構建器參見 開發。

方式 3:Divooka

作為過程(Routine 圖)

  1. 建立一個帶有 Routine 圖的文件。
  2. 開啟文件的資源庫(在 Divooka Compute 中為 Asset library 工具或 Ctrl+Shift+A),使用 Import files… 匯入 game.novella 和所有美術素材,並保持指令碼所依賴的資料夾名稱。
  3. 從 Novella 工具箱中,在執行路徑上依次串聯以下節點:
    1. Make Novella Game,標題為 The Garden,寬度為 1920,高度為 1080。
    2. Add Library Assets,連入遊戲。它的庫輸入由文件提供,因此不需要連線。
    3. Load Scripts From Assets,資料夾留空,以載入庫中的所有指令碼。
    4. Run。
  4. 執行該圖。遊戲會在自己的視窗中開啟。

執行中的 Hello Novella,此時還沒有任何美術素材

你也可以不匯入指令碼檔案,而是把指令碼輸入到 Load Script 節點中;或者完全不用指令碼,用 Define Character 和 Set Config 等節點來定義內容。

作為資料(Function 圖)

故事也可以完全不用指令碼,而寫成節點:

  1. 建立一個 Function 圖。
  2. 串聯 Start Sequence → Scene(bg garden,使用 fade)→ Show(qinglan smile,位於 right,使用 dissolve)→ Say(角色 q,文字 You came.)。
  3. 用名稱 start 和該序列建立 Make Label。
  4. Start Story → Add Label(該標籤)→ Add Character,由 Make Character(q、Qinglan、#c0392b、影像 qinglan)提供輸入。
  5. 用標題和故事建立 Make Game Definition。
  6. 選中 Make Game Definition 節點,在 Properties 面板中開啟它的 Custom Preview。遊戲會在視窗中執行,存檔儲存在記憶體中,開發者主控台處於開啟狀態。

鏈上的任何節點都可以預覽:序列以單標籤故事的形式播放,沒有 start 標籤的故事從其第一個標籤開始。條件和對變數的更改也是節點(If 搭配 Variable At Least,Apply Effect 搭配 Add To Variable);遊戲還可以用 Make Scene 寫成一個個場景,每個場景包含背景、音樂、臺詞以及故事接下來的去向。不使用自訂預覽時,這些值會以它們所對應的指令碼形式預覽,因此你可以讀到一串節點寫出了什麼。

在 Divooka 中使用 Novella 講解了每個節點、用 Events 圖編寫遊戲的方式,以及如何從 Flows 圖呼叫描述遊戲的 Function 圖。

下一步

  • 概念:故事、舞臺和檢查點是什麼。
  • 指令碼語言:指令碼能表達的一切。
  • 主題設定:字型、顏色,以及使用你自己美術素材的對話方塊。