设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 5651|回复: 16
打印 上一主题 下一主题

[教程] (应该算完结?)基于inky的非线性剧情处理简易教程

[复制链接]

Lv1.梦旅人

梦石
0
星屑
213
在线时间
21 小时
注册时间
2022-3-1
帖子
10
跳转到指定楼层
1
发表于 2022-3-9 22:41:56 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 清和QingHe 于 2022-4-10 15:26 编辑

由于太懒了这个主题立项到现在都没有开始正式的写文章,所以不如先开题然后后续不断补充好啦
大概会一段一段的更新,时间不定,应该……会更完吧(

总之,这是写给你的简单的入门教程,希望你们喜欢!
对了对了,由于个人水平能力限制未免会出现错误,还请多多包涵!

评分

参与人数 4星屑 +10 +3 收起 理由
期miu + 1 精品文章
多啦A户 + 1 精品文章
死伤殆尽 + 10 塞糖
Arfies + 1 是inky,i了i了

查看全部评分

Lv3.寻梦者

梦石
0
星屑
2309
在线时间
123 小时
注册时间
2017-2-26
帖子
36
13
发表于 2022-9-27 09:09:16 | 只看该作者
这玩意儿和 QQ Bot 是绝配,加点投票系统之类的功能扔群里,会很有戏剧效果的。
RM水友群号   917854767  欢迎加入
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
5
星屑
3936
在线时间
698 小时
注册时间
2019-5-1
帖子
80
12
发表于 2022-3-22 02:10:19 | 只看该作者
清和QingHe 发表于 2022-3-21 23:49
好问题。
在我目前理解的范围之内,单纯的使用inky导出的web互动小说应该是没有办法读档的(至少在我阅读 ...

这里面还有个问题就是,假如产生的html5文件必须依赖于Chrome一类的外部浏览器打开,那么这些浏览器是不允许html5中嵌入的js脚本直接写入本地文件的,只能是点存档键然后下载到本地(?)玩家体验应该不会很好(
所以我还是觉得inky应当使用Electron一类自带渲染引擎的东西开发会比较好。
算了算了还是老老实实玩renpy去了(不是

点评

@guoxiaomi不过我想了下好像确实可以把存档写进local storage没错。  发表于 2022-3-22 08:23
@guoxiaomi 如果我没搞错,mv用的Qt WebEngine,属于自带内核了。如果是导出网页版的话,好像得部署本地服务器或者绕过第三方浏览器的安全机制才能运行  发表于 2022-3-22 08:16
mv就是h5+js没有问题,写入到local storage里就行  发表于 2022-3-22 05:06
if isinstance(I, Eggplant()):
    I.give(you, I.NUTRIENTS)
elif isinstance(I, Tomato()):
    I.give(you, I.ANTIOXIDANTS)
elif isinstance(I, TabbyCat()):
    while not you.ENJOYMENT:
        I.purr(you)
elif isinstance(I, TheOnlyGod()):
    I.EXISTENCE['proof'] = you
回复 支持 1 反对 0

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
213
在线时间
21 小时
注册时间
2022-3-1
帖子
10
11
 楼主| 发表于 2022-3-21 23:49:08 | 只看该作者
本帖最后由 清和QingHe 于 2022-3-21 23:50 编辑
breaakerq 发表于 2022-3-20 10:34
我其实老早就听说inky了,其实蛮有意思的,比较适合做做rougelike啥的。
但我就有一点很疑惑:
inky做的游 ...


好问题。
在我目前理解的范围之内,单纯的使用inky导出的web互动小说应该是没有办法读档的(至少在我阅读的文档中没有相关的标记词和函数能实现,如果有的话欢迎分享~)。所以读档需要外部代码添加来实现。
其次,由于ink本身存在“事件触发”,即“条件内容”操作(这一部分由于没有现有的例子,所以我仅仅是在九楼结尾提了一嘴,并没有展开细说)。所以理论上存档与读档实际上就是存储/读取“节点”实现的。所以在代码实现部分只需要保存节点就可以了。
当然,如果是要做AVG游戏的话,相关引擎也是有许多并且都有完整的故事树系统的,就没有必要一直去纠结inky原生存档读档的问题啦~
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
5
星屑
3936
在线时间
698 小时
注册时间
2019-5-1
帖子
80
10
发表于 2022-3-20 10:34:23 | 只看该作者
我其实老早就听说inky了,其实蛮有意思的,比较适合做做rougelike啥的。
但我就有一点很疑惑:
inky做的游戏咋存读档?
(就因为搞不明白这个,至今没法用inky做游戏)
if isinstance(I, Eggplant()):
    I.give(you, I.NUTRIENTS)
elif isinstance(I, Tomato()):
    I.give(you, I.ANTIOXIDANTS)
elif isinstance(I, TabbyCat()):
    while not you.ENJOYMENT:
        I.purr(you)
elif isinstance(I, TheOnlyGod()):
    I.EXISTENCE['proof'] = you
回复 支持 1 反对 0

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
213
在线时间
21 小时
注册时间
2022-3-1
帖子
10
9
 楼主| 发表于 2022-3-20 02:34:34 | 只看该作者
5. 选项与条件点,开启分与隐藏支剧情!

如果你看过上文,你应该已经学会如何按照线性故事框架进行写作了。华丽的故事不能失去多结局,就像西方不能失去耶路撒冷(大雾)。所以,如果想要出现多结局,就必然会在节点进行选择处做出分支选项,从而走向不同的分线。选项本身还分为两种,普通选项和一次性选项。
普通选项是需要和跳转结合在一起,构成分支跳转操作的。选项的结构为“+”和选项文本组合。但是一般选项文本后都会加上跳转从而组成完整的分支选择块。通常情况下,输入的选项文本都会作为后面文本的一部分出现在全文中。如果你想要一个不会出现文本的选项,那么可以将选项文本置于[方括号]中。这种形式一般用于表示动作或者一些无声的行为之中。在一些文本叙事中,无声行为或许比语言更具有表现力,
INK 代码复制
  1. 一念,前脚突然踏空。原本无垠的草地不见了,身体突然下坠,转眼周围便由碧青转为墨黑色。风如寒锋般划的脸颊刺痛,睁开双眼甚至都变得困难起来。
  2. 开……开玩笑的吧,日本轻小说都不敢这么写。
  3. 是梦吧,一定是梦吧。
  4. + [平静的审视四周]
  5. ->chapter2
  6. + [挣扎着试图醒来]
  7. -> end1


一次性选项构成很简单,如果你期望玩家对某一个选项只能点击一次,那么最简单的方式就是把选项的 + 改成 *。“一次性选项”大多数使用情况下是伪多选一情况,本质上还是限定玩家只能选择一个或者说出现许多无用选项。感觉说起来比较抽象,可以将下面的例子复制到inky中亲自查看一下效果。通过一次性选项,制造了“梅琳娜”和“暗月女王”两个伪选项,实际上只有“菈妮”为可选项。(个人主观,方便举例而已。拒绝带入。)
INK 代码复制
  1. 所以,你的选择是:
  2. -> example
  3. == example ==
  4. * [菈妮] ->happyending
  5. * [梅琳娜] ->example
  6. * [暗月女王] ->example
  7.  
  8. == happyending ==
  9. “来,走吧。我亲爱的王啊。”
  10.     -> END


相信有部分玩家玩的游戏存在多周目或者要求达成某些条件后才能够解锁部分剧情。在ink中同样可以体现,你需要的可能是“条件内容”操作。相关操作在“用 Inky 编写基于 Web 的互动小说”一文中有详细的例子,此处就不展开讲述了。条件内容主要用于当当前的剧情满足某些特定条件后,进而开启结局。如果可以用“选择”完成的条件满足,尽量不要使用“条件内容”。
(写到这里差不多基础教程就结束了,以后看情况补充好了。不说了,摸老头环去了.jpg)
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
213
在线时间
21 小时
注册时间
2022-3-1
帖子
10
8
 楼主| 发表于 2022-3-17 10:28:16 | 只看该作者

4.单、多行注释与TODO:思路整理与交流好帮手!
(关于我连贴被警告了这回事)

对于一个程序员来说,最喜欢的事情就是编程的时候不写注释,最讨厌的事情就是阅读不写注释的代码(尤其是命名不规则逻辑混乱的代码)。所以在教会你写非线性故事框架之前,让你明白注释的重要性、养成写注释的习惯是十分必要的。好记性不如烂笔头。一个好的注释不仅可以帮你记录思路和想法,同时也可以让其他阅读ink脚本的人明白你在写什么。在编程时,成百上千行的代码总是会让我第二天醒来因为不知道进度和思路而硬生生的重新读一遍,也让我被迫养成了写注释的习惯。所以在ink中也是同理。注释不会显示给玩家,只有故事编辑才能够看到。

在ink中,常用的注释标记分为两大种:TODO和注释。
“TODO”是ink提供的一种神奇的待办事项标记。其表示方法是输入“TODO:”后加入注释的文字.使用TODO标记包裹的文字会突出显示#BFFFF1的颜色。TODO标记的突出显示使得它非常方便用于记录待办事项。在写入TODO后,inky软件的中上方会标注出。点击会显示出所有的待办,点击任意一个待办可以直接跳转到相应的位置。
普通注释则是用来写简短或者长批注的。其表示方法是“//”或者用“/* */”注释包裹内容。相比于TODO标记用来表示待办,普通的注释标记用起来就相对自由许多——你可以用它去写任何你需要的注释。无论是大段大段的思路,主题构思,意象含义等等,都可以写在注释里防止自己忘记。
INK 代码复制
  1. == end1 ==
  2. “呼……——呼!”
  3. 深渊般的下坠感使白突然惊醒。一缕清阳轻轻打在她惺忪的睡脸上。紧紧攥住松软的被窝,令人安心的真实感。趴在床头的橘猫看见主人醒了,撒娇的喵喵叫着。一切与从前一样。
  4. 啪嗒。
  5. 手腕上月光石手链的红绳突然断裂,月光石摔落在地板上,发出闷重声响。
  6. TODO:手链->约定之物;月光石->幽静、柔和、预知;红线->命运之线;写作时记得体现。
  7. “似乎……做了一个很真实的梦,可是……到底梦到了什么呢……”
  8. ->END
  9. //指向end,表示“故事流从此处停止”

Snipaste_2022-03-17_10-26-47.png (76.66 KB, 下载次数: 17)

Snipaste_2022-03-17_10-26-47.png
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
213
在线时间
21 小时
注册时间
2022-3-1
帖子
10
7
 楼主| 发表于 2022-3-14 20:53:20 | 只看该作者
本帖最后由 清和QingHe 于 2022-3-14 20:54 编辑

3.创造一个线性的故事,起始、过程、结局!

在开始写作前,我们首先要明白两个基础的概念:跳转(divert)和节点(konts)。
故事总是由多个相互链接的部分组成的,在ink中我们称他们为“节点(konts)”。节点的命名规则的是在节点名称左右分别添加至少两个等号(==)作为标记。在inky中(任何支持ink脚本的编辑器中),会使用蓝色突出显示已识别的标记。节点下面的内容都属于本节点。需要注意的是,节点的名称需要为英文,中文是不可以的(所以学习英语是个必须的选项XD)。       
一个故事基本的发展至少需要“开端、发展、高潮、结局”四部分组成。那么如果没有想好的话,就将这四部分作为节点开始创作吧!或者你也可以按照篇章、分支点、选择、段落作为片段进行划分,一切都是随心所欲的。但是如果你是一个相对专业的剧情编辑者,那么请自行规范一种命名规则能够梳理和区分每个节点的内容,这点与写代码时对变量的命名规则是类似的。不然游戏开发者与剧情编辑总得有一个会疯掉。

刚刚我们谈论了每个片段的范围构成规则(节点),现在谈谈如何将节点联系在一起。我们使用一种叫“跳转”(divert)的标记进行链接。
"跳转"作为链接节点与节点之间的桥梁,对节点链接起着重要的作用。跳转的命名规则是“跳转箭头(->)”和“节点名称”构成,表示跳转到下一个节点。跳转本身是不会显示给玩家的。同时,每个片段的构成便会构成以节点名成开始,以跳转箭头结束这种结构。有了“节点”与“跳转”,便可以简单的写成一个线性叙事框架的故事了。
INK 代码复制
  1. == preface ==
  2. //节点为英文通过==包裹
  3.  

  4. “碧青的天空,若隐若现的白塔,无尽的街道。于无垠的草地上醒来,破碎的约定与回忆。颠倒而又虚幻的存在着的、关于我的另一个世界。”
  5. ->chapter1//这里是跳转


Snipaste_2022-03-14_20-52-50.png (3.62 KB, 下载次数: 16)

Snipaste_2022-03-14_20-52-50.png
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
213
在线时间
21 小时
注册时间
2022-3-1
帖子
10
6
 楼主| 发表于 2022-3-14 08:53:17 | 只看该作者

->ink简易教程

1.下载安装,初识界面!
写ink脚本,我们常常用编辑工具inky。开发者使它可以进行多端支持(Windows\Mac\Linux),你可以通过下面的链接进行下载和安装!
官方下载地址:https://github.com/inkle/inky/releases
如果你习惯使用vscode进行编辑的话,可以在vscode的拓展中找到ink插件使其支持ink语法!

好的,相信你一定下载并安装好了这个小小的软件。它的界面为全英文的并且不支持语言切换(该学英文了兄弟)。分界线将整个界面分为两部分——左边编辑,右边便可以实时加载更新结果。这对我们的编辑是很有用的,所见即所得。右上角的单箭头是后退,双箭头是重置预览的故事;inky编写的文件后缀为.ink,为我们提供了web、json、js文件三种导出形式(你可以从file中找到他们);如果感觉到字号有些小,可以通过同时按下Ctrl和+调整字号(你可以从view中找到他们);同时inky也支持修改主题——我想不会有人在深夜里还想盯着刺眼的白屏写作。通过View->Theme->Dark将界面调整为炫酷的黑色从而在夜里护眼式写作!

2.举个例子!
我将随手写的一个相对完整的小随笔放在了附件里,你可以进行下载查看。当然,如果你不愿意下载的话,ye可以将下面这段直接复制到编辑器的左边并仔细观察右边的变化:

INK 代码复制
  1. /*
  2. “白塔”这个意象实际上是作为写教程构思故事的时候突然蹦出来的字眼。既然作为教程,注定了这个故事的不完整性。但是我还是会尽量的将故事讲完整或者通过片段向你演示ink的用法。
  3. */
  4. ->preface
  5. //需要指向节点开启故事,我个人习惯开头为序章,你不妨将起始节点写为“start”
  6. == preface ==
  7. //节点为英文通过==包裹
  8.  

  9. “碧青的天空,若隐若现的白塔,无尽的街道。于无垠的草地上醒来,破碎的约定与回忆。颠倒而又虚幻的存在着的、关于我的另一个世界。”
  10. ->chapter1
  11.  
  12. == chapter1 ==
  13. 我这是……在哪里?
  14. 从浅草中起身。周围的环境是如此的陌生。远处的白塔若隐若现,古旧的塔身透漏着神秘的吸引力。
  15. “白……白……”
  16. 谁在呼唤我的名字?
  17.  
  18. 一念,前脚突然踏空。原本无垠的草地不见了,身体突然下坠,转眼周围便由碧青转为墨黑色。风如寒锋般划的脸颊刺痛,睁开双眼甚至都变得困难起来。
  19. 开……开玩笑的吧,日本轻小说都不敢这么写。
  20. 是梦吧,一定是梦吧。
  21. + [平静的审视四周]
  22. ->chapter2
  23. + [挣扎着试图醒来]
  24. -> end1
  25.  
  26. == chapter2 ==
  27.  
  28. ->END
  29.  
  30. == end1 ==
  31. “呼……——呼!”
  32. 深渊般的下坠感使白突然惊醒。一缕清阳轻轻打在她惺忪的睡脸上。紧紧攥住松软的被窝,令人安心的真实感。趴在床头的橘猫看见主人醒了,撒娇的喵喵叫着。一切与从前一样。
  33. 啪嗒。
  34. 手腕上月光石手链的红绳突然断裂,月光石摔落在地板上,发出闷重声响。
  35. TODO:手链->约定之物;月光石->幽静、柔和、预知;红线->命运之线;写作时记得体现。
  36. “似乎……做了一个很真实的梦,可是……到底梦到了什么呢……”
  37. ->END
  38. //指向end,表示“故事流从此处停止”


如果你没有接触过相关,可能会对非文字符号感到眼花缭乱和退缩,不要害怕,接下来我会依次讲解文中出现的符号。

白塔.zip

1.38 KB, 下载次数: 8

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
213
在线时间
21 小时
注册时间
2022-3-1
帖子
10
5
 楼主| 发表于 2022-3-11 18:14:12 | 只看该作者
本帖最后由 清和QingHe 于 2022-3-11 18:19 编辑

->inky适合的范围:


inky本身并非作为互动小说编辑器出身的,而是作为Unity的一个集成插件,后渐渐独立出来。相比于同类型的互动小说编辑来说,inky没有具象化的流程块(或者说是结构框架),一切是以文字与节点的形式展现出来的。当故事相对比较简单时,我们可以尝试用Twine类的图形化工具进行展示;但如果故事变得错综复杂,我们很难从一堆关系线中理清故事脉络,同时对故事的增添或者删改也成为一个问题。inky将故事模块节点化后,我们可以很容易的添加或者删除一个选项,一个剧情走向,或者一段小故事。ink作为一种标记性语言,相比于编程语言学习门槛极低,同时可用性又相对较高。所以对于使用Unity的游戏开发者来说,是一件不错的选择。
虽然感觉说了不是一遍了,这里再次重复,如果你想要流程图具象化的,twine完全能够胜任。目前的ink不支持显示流程图,因为其本身理念就是因为故事过于复杂,为了灵活处理故事逻辑解决流程图解决不了的问题。

呼,终于把该讲的废话都讲完了,之后就要开始讲ink的基本教程了233(我是绝对不会承认是因为最近打游戏和编剧情样本浪费调时间了的)
假定看到这篇教程的你没有任何编程经验,但是对电脑基础知识稍有了解(既然做游戏了多少得懂点文件下载删除安装叭)。放轻松,我会按照步骤一步步的教学如何写出简单的叙事框架,尽可能的充实基本内容。如果需要进阶的知识,欢迎随时访问官方文档或者中文文档。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-16 11:04

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表