十分钟写完第一个故事
新建项目 → 写几行正文 → 预览 → 加一个选项 → 记住读者做过什么 → 导出成网页,把整条链路走通一次。
这一篇把从空白到「读者能读到」的全过程走一遍。每一步都短,十分钟够用。不需要先读语法——需要的语法在用到的时候讲。
新建项目
打开编辑器,点启动页上的新建项目(也可以按 Ctrl+N),填一个作品名、选一个存放位置。编辑器会建一个同名文件夹,里面有三样东西:
| 文件 | 是什么 |
|---|---|
<作品名>.kiw |
作品清单:名字、版本、故事从哪个文件开始 |
main.kin |
故事正文。你主要在这里写 |
theme.css |
作品外观:底色、字体、字号、栏宽 |
左边是资源管理器,中间是编辑区,右边是实时预览——你改一个字,右边立刻跟着变。
写几行正文
打开 main.kin,把里面的内容换成:
=== 序章 ===
末班蒸汽船把你卸在雾港的栈桥上。
海雾很厚,只看得见十步之内。
栈桥尽头,锈锚酒馆的窗子透出一点橘色的光。
-> END
三条规则,就这些:
=== 序章 ===开了一个节点,名字随你起。故事从入口文件的开头开始跑;这里第一行就是节点,所以从它开始(第一个节点之前还能写东西,见下面「让故事记住」那一节)。- 中间每一行普通文字,就是读者会读到的一句正文。一行就是一段,不用写任何标记。
-> END表示故事到此结束。END是保留的目标,不需要你自己建这个节点。
点上面的「运行」看看效果——右边的预览区里,正文就是这样一行行流出来的。
加一个选项
只有正文的故事不叫互动小说。加两个选项:
=== 栈桥 ===
海雾很厚,栈桥尽头透出一点橘色的光。
* [推门进酒馆] -> 酒馆
* [先在码头上站一会儿] -> 码头
=== 酒馆 ===
门轴发出被海水泡胀的呻吟。屋里烟气很重。
-> END
=== 码头 ===
你听见远处有铁链拖过石板的声音,然后是长久的安静。
-> 栈桥
新出现的东西:
*开头的行是一个选项。方括号里的字是给读者点的按钮文字。-> 酒馆是跳转:读者选了这条,故事就跳到=== 酒馆 ===那个节点继续。- 「码头」那条最后
-> 栈桥,会跳回去——读者又能再选一次。
试着运行它,先点「先在码头上站一会儿」:回到栈桥后,那一条不见了,只剩「推门进酒馆」。
因为 * 是一次性选项,选过就消失。想让它每次都在,把 * 换成 +(粘性选项)。
让故事记住
粘性选项会一直在,但读者未必希望它一直在——去过一次码头之后,也许就该换个说法,或者干脆让它消失。这需要故事记住读者做过什么:
~ let seen_dock = false
-> 栈桥
=== 栈桥 ===
海雾很厚,栈桥尽头透出一点橘色的光。
* [推门进酒馆] -> 酒馆
+ {!seen_dock} [先在码头上站一会儿] -> 码头
=== 码头 ===
~ seen_dock = true
你听见远处有铁链拖过石板的声音,然后是长久的安静。
-> 栈桥
=== 酒馆 ===
{seen_dock ? "你带着码头上那阵铁链声推开了门。" : "门轴发出被海水泡胀的呻吟。"}
-> END
四处新写法:
~ let seen_dock = false——~开头的行是一条逻辑语句,读者看不到它。这里声明了一个变量。+ {!seen_dock}——+是粘性选项(选了也不消失),{...}是挂在它前面的条件:只有条件成立时才出现。去过码头后seen_dock变成true,这条就没了。~ seen_dock = true写在「码头」节点里,读者走到那儿时才执行。- 正文里的
{...}是插值:把大括号里的表达式求值,结果印进正文。这里用一个三元表达式按条件挑一句。
运行上面这段:先去码头再进酒馆,你会读到不一样的那一句。
别漏了第二行的
-> 栈桥。 入口文件里、第一个=== 节点 ===之前的内容叫开场,故事就从这里开始播放。开场执行到底如果没有跳转,故事当场就结束了——一个只放了变量声明、忘了跳出去的开场,运行起来是一片空白加「故事结束」。节点名可以用中文,变量名必须用 ASCII(字母、数字、下划线)。这条界线是有意的:一眼就能分出哪些是叙事内容、哪些是程序逻辑。
变量、条件、插值都是 JavaScript。
~ let x = 1、{x > 0}、{x + 1}全都按 JS 求值——不需要另学一套表达式语法。
在预览里走查
右边的预览区就是读者所见。写长了之后有两个开关很有用:
- 快进:打开后正文瞬间显示、停顿一律不等,点完一个选项直接到下一个决定点。调试分支时快很多。
- 返回上一步:撤销刚才那次选择,回到上一个决定点重选,不用从头再来。
编辑器底部会实时报语法与语义问题(跳转指向不存在的节点、变量名拼错等)。有错误时导出会被禁用——这是有意的,免得把跑不起来的作品发出去。
导出成网页
故事能跑之后,菜单 文件 → 导出独立网页…,选一个存放位置。
你会得到一个文件夹,里面是一个自包含的网页:把整个文件夹传到任意静态空间(对象存储、GitHub Pages、自己的服务器都行),读者打开就能读。不需要后端,也不需要读者装任何东西。
想给读者一个能离线读的版本,就用 文件 → 导出故事包(.kip)…,把生成的 .kip 发给他们,用 Kiny 阅读器或网页书库打开。
接下来
到这里你已经把整条链路走完了。往下按顺序读就行:
- 项目结构——
.kiw清单里有什么、多个.kin文件怎么组织、图片音频放哪 - 正文写作——分段、缩进、标点、加粗变色、句中停顿
- 节点与跳转——子节点、带参数的节点、动态跳转
也可以先照着自己的想法写下去,卡住了再回来查。