NarraLeaf
NarraLeaf Desktop

快速开始

使用 NarraLeaf 创建你的第一个桌面视觉小说

NarraLeaf 将主进程应用宿主、生成的渲染入口和 NarraLeaf-React 故事组合在一起。本指南会创建 CLI 所需的最小项目结构

创建项目

初始化项目

运行 CLI init 命令:

narraleaf init my-visual-novel
cd my-visual-novel

init 会调用最新的 NarraLeaf skeleton 包,并为你创建项目文件

启动开发服务器

运行本地开发命令:

narraleaf dev

dev 命令会监听主进程和渲染进程,启动 Electron,并在页面文件变化时请求渲染器刷新

最小项目文件

如果你手动搭建项目,NarraLeaf 期望如下结构:

package.json
narraleaf.config.js
App.tsx

主进程

通过 AppConfig 创建 Electron 应用宿主,并在 NarraLeaf ready 后启动主窗口

main/index.ts
import { AppConfig } from "narraleaf";

const app = new AppConfig({
    appErrorHandling: "restart",
}).create();

app.onReady(() => {
    void app.launchApp();
});

渲染应用

渲染应用需要导出 metadata.story 和一个壳组件。壳组件通过 children 接收生成的页面

renderer/App.tsx
import type { ReactNode } from "react";
import { Character, Scene, Story } from "narraleaf-react";

const story = new Story("第一个 NarraLeaf 故事");
const opening = new Scene("opening", {
    background: "#20232a",
});

const narrator = new Character("旁白");
opening.action([
    narrator.say("欢迎来到 NarraLeaf。"),
]);

story.entry(opening);

export const metadata = {
    story,
};

export default function App({ children }: { children: ReactNode }) {
    return <main>{children}</main>;
}

首页

使用 narraleaf/renderer 中的 hooks 访问应用壳

renderer/pages/index.tsx
import { useApp, useGamePlayback } from "narraleaf/renderer";

export default function HomePage() {
    const app = useApp();
    const { isPlaying } = useGamePlayback();

    return (
        <button onClick={() => void app.newGame()}>
            {isPlaying ? "Restart" : "Start"}
        </button>
    );
}

下一步

本页目录