inky for mac文字游戏引擎_编写自己的互动小说_inky下载


发表于: 2019-12-21 游戏一箩筐 mac

编写互动小说从未如此简单,因为我们有很多可用的创作工具。Inky这款软件可以编写属于自己的互动小说/文字冒险游戏。

Inky  是一个用来编辑 ink 语言的编辑器。虽然 ink 可以使用各种文本编辑器编辑,但是我还是比较推荐 Inky。它将很多功能集合在了一起,我们在 Inky 中可以自由的编写游戏叙事代码,而且可以随时进行测试和排错。同时通过 Inky 也可以做各种输出,比如 JSON 和 HTML 格式,让做出来的内容可以轻易在其它地方使用。我们今天做的尝试就是在 Inky 里面完成的。

 

一些基本内容

内容(Content)

最基本的内容,就是最直接的文本,比如:

                  
                    Hello
                  
                  
                    ,
                  
                  
                     world
                  
                  
                    !
                  
                  
                    您好!
                  
                

选择(Choices)

选择的用法也很简单,只要在选项前面加上  *  就可以了:

                  
                    你喜欢苹果还是橘子?
                  
                  
                    *
                  
                  
                    苹果
                  
                  
                    当然是苹果喽
                  
                  
                    *
                  
                  
                    橘子
                  
                  
                    那肯定是橘子
                  
                

运行它,就会看到一句对话,然后下面有两个选项,选择其中一个,程序就结束了。

后面为了便于理解,我们将问题前面加上数字标号,将选择用  >  表示,下面就是选择流程:

                  
                    你喜欢苹果还是橘子?
                  
                  
                    1
                  
                  
                    :
                  
                  
                    苹果
                  
                  
                    2
                  
                  
                    :
                  
                  
                    橘子
                  
                  
                    >
                  
                  
                    1
                  
                  
                    苹果
                  
                  
                    当然是苹果喽
                  
                

每一个选择下面还可以继续有选择,延伸下去,通过缩进和多个 *  号代表层级,像如下这样:

                  
                    你喜欢苹果还是橘子?
                  
                  
                    *
                  
                  
                    [苹果!]当然是苹果喽
                  
                  
                    那你要大的还是小的?
                  
                  
                    *
                  
                  
                    *
                  
                  
                    大的
                  
                  
                    很好,红的还是绿的?
                  
                  
                    *
                  
                  
                    *
                  
                  
                    *
                  
                  
                    红的
                  
                  
                    *
                  
                  
                    *
                  
                  
                    *
                  
                  
                    绿的
                  
                  
                    *
                  
                  
                    *
                  
                  
                    小的
                  
                  
                    *
                  
                  
                    橘子!
                  
                  
                    那肯定是橘子
                  
                

注意我们使用了一对中括号 [] ,它代表在显示对话的时候只显示中括号前面和里面的内容,后面的忽略,而在选择之后显示的时候,则忽略掉中括号里面的内容,实际操作一下就是这样:

                  
                    你喜欢苹果还是橘子?
                  
                  
                    1
                  
                  
                    :
                  
                  
                    苹果!
                  
                  
                    2
                  
                  
                    :
                  
                  
                    橘子!
                  
                  
                    >
                  
                  
                    1
                  
                  
                    当然是苹果喽
                  
                  
                    那你要大的还是小的?
                  
                  
                    1
                  
                  
                    :
                  
                  
                    大的
                  
                  
                    2
                  
                  
                    :
                  
                  
                    小的
                  
                  
                    >
                  
                  
                    1
                  
                  
                    很好,红的还是绿的?
                  
                  
                    1
                  
                  
                    :
                  
                  
                    红的
                  
                  
                    2
                  
                  
                    :
                  
                  
                    绿的
                  
                  
                    >
                  
                  
                    2
                  
                  
                    绿的
                  
                

这种嵌套的方式很直观,但是内容多的时候,或者分支较复杂的时候,还是力不从心的,因此,还有一个比较重要的功能叫做:节点(Knots)。

节点(Knots)

节点是一整段的文字内容,他可以被其他的内容引用或者跳转。

前面我们所做的是一个无节点的示例,它会被主流程顺序执行。而如果采用了节点,正常执行的时候会跳过节点。

节点的使用方法也很简单:

                  
                    ===
                  
                  
                     fruit 
                  
                  
                    ===
                  
                  
                    你喜欢苹果还是橘子?
                  
                  
                    *
                  
                  
                    [苹果]当然是苹果喽
                  
                  
                    ->
                  
                  
                    DONE

                  
                  
                    *
                  
                  
                    橘子
                  
                  
                    那肯定是橘子
                  
                  
                    ->
                  
                  
                    DONE
                  
                

使用两个  ===  就可以创建节点,请注意新添加的  ->DONE  它代表这个分支的结束,也可以使用  ->END ,它代表整个对话结束。

跳转(Diverts)

使用  ->  指令后面加上节点名称,就可以跳到指定节点执行。

运行的话,会发现没有任何显示,因为节点需要调用,也就是使用如下跳转(Diverts)语句:

                  
                    ->
                  
                  
                     fruit
                  
                

现在整个儿看起来是这样:

                  
                    ->
                  
                  
                     fruit


                  
                  
                    ===
                  
                  
                     fruit 
                  
                  
                    ===
                  
                  
                    你喜欢苹果还是橘子?
                  
                  
                    *
                  
                  
                    [苹果]当然是苹果喽
                  
                  
                    ->
                  
                  
                    DONE

                  
                  
                    *
                  
                  
                    橘子
                  
                  
                    那肯定是橘子
                  
                  
                    ->
                  
                  
                    DONE
                  
                

上面这个就可以跑起来了,跟之前的尝试一致。

当需要对对话分支做处理的时候,使用节点是个不错的做法,它的使用也很简单,例如上面的例子,我们可能想回去重新选择,这时候使用节点就很合适。

了解了这几个特色,基本上就可以做一些简单的对话了。当然,ink 的语法还有很多,也很复杂,要想完整的使用它强大的功能,还有很多需要了解。下面我们做一个复杂一点的实战练习,还会涉及到更多基础内容。

让我们来尝试一下

好,现在利用我们学到的知识,来做一个复杂一点的实战练习。假设我们的团队现在站在一个地牢门口,那么到底是进入地牢,还是回去城镇补充给养,可能需要做出选择,下面就是基本的代码:

                  
                    ->
                  
                  
                     town


                  
                  
                    ===
                  
                  
                     town 
                  
                  
                    ===
                  
                  
                    你们站在城镇的门口
                  
                  
                    *
                  
                  
                    前往地牢[],让我们出发吧!
                  
                  
                    ->
                  
                  
                    dungeon
  

                  
                  
                    ===
                  
                  
                     dungeon 
                  
                  
                    ===
                  
                  
                    你们到了地牢门口
                  
                  
                    *
                  
                  
                    进入地牢
                  
                  
                    ->
                  
                  
                    enter_dungeon

                  
                  
                    *
                  
                  
                    返回城镇
                  
                  
                    ->
                  
                  
                    return_to_town_confirm


                  
                  
                    ===
                  
                  
                     return_to_town_confirm 
                  
                  
                    ===
                  
                  
                    确定返回城镇么?
                  
                  
                    *
                  
                  
                    是的
                  
                  
                    ->
                  
                  
                    END
                  
                  
                    *
                  
                  
                  
                    ->
                  
                  
                    dungeon


                  
                  
                    ===
                  
                  
                     enter_dungeon 
                  
                  
                    ===
                  
                  
                    你们进入地牢,开始探险
                  
                  
                    ->
                  
                  
                    END
                  
                

这段代码基本上实现了这个流程:

但是要注意,上面这段不是最终代码。首先我们确定“返回城镇”后,就结束了,另外还有一些其它问题我们可以运行一下看:

                  
                    你们站在城镇的门口
                  
                  
                    1
                  
                  
                    :
                  
                  
                    前往地牢
                  
                  
                    >
                  
                  
                    1
                  
                  
                    前往地牢,让我们出发吧!
                  
                  
                    你们到了地牢门口
                  
                  
                    1
                  
                  
                    :
                  
                  
                    进入地牢
                  
                  
                    2
                  
                  
                    :
                  
                  
                    返回城镇
                  
                  
                    >
                  
                  
                    2
                  
                  
                    返回城镇
                  
                  
                    确定返回城镇么?
                  
                  
                    1
                  
                  
                    :
                  
                  
                    是的
                  
                  
                    2
                  
                  
                    :
                  
                  
                  
                    >
                  
                  
                    2
                  
                  
                  
                    你们到了地牢门口
                  
                  
                    1
                  
                  
                    :
                  
                  
                    进入地牢
                  
                

我们会发现,第二次准备进入地牢的时候,“返回城镇”的选项不见了。

这是因为,对叙事来说,已经选择过一次的选项就不应该再出现了,所以系统默认的将访问过的选项隐藏了。但这并不是我们想要的,我们想要这两个选项一直存在,那么怎么办呢?ink 提供了  +  来表示可以一直使用的选项,它兼具  *  的功能,只是会一直显示。

经过修改过后的代码如下:

                  
                    ->
                  
                  
                     town


                  
                  
                    ===
                  
                  
                     town 
                  
                  
                    ===
                  
                  
                    你们站在城镇的门口
                  
                  
                    +
                  
                  
                    前往地牢[],让我们出发吧!
                  
                  
                    ->
                  
                  
                    dungeon
    

                  
                  
                    ===
                  
                  
                     dungeon 
                  
                  
                    ===
                  
                  
                    你们到了地牢门口
                  
                  
                    *
                  
                  
                    进入地牢
                  
                  
                    ->
                  
                  
                    enter_dungeon

                  
                  
                    +
                  
                  
                    返回城镇
                  
                  
                    ->
                  
                  
                    return_to_town_confirm


                  
                  
                    ===
                  
                  
                     return_to_town_confirm 
                  
                  
                    ===
                  
                  
                    确定返回城镇么?
                  
                  
                    +
                  
                  
                    是的
                  
                  
                    ->
                  
                  
                    town

                  
                  
                    +
                  
                  
                  
                    ->
                  
                  
                    dungeon


                  
                  
                    ===
                  
                  
                     enter_dungeon 
                  
                  
                    ===
                  
                  
                    你们进入地牢,开始探险
                  
                  
                    ->
                  
                  
                    END
                  
                

这是一个可以循环跑起来的流程了,您可以尝试跑一下。

完成:再加点料

我们现在可以“自由的“在城镇和地牢之间溜达了,在即将结束这一篇之前,我们再试着加点料,多了解一点关于变量的内容吧。

以下是我们要做的:

  • 加上玩家/团队名称
  • 限制犹豫不决的次数,如果多次返回城镇,就强制下地牢!

全局变量(Global Variables)

在 ink 中,我们可以轻易的使用  VAR  关键字来定义全局变量,使用的方法则是  {}

下面我们就定义两个变量试试:

                  
                    VAR player_name 
                  
                  
                    =
                  
                  
                    "PLAYER"
                  
                  
                    
VAR try_outs 
                  
                  
                    =
                  
                  
                    0
                  
                

其中  player_name  是玩家的名称,我们给一个默认值, try_outs  是尝试次数,我们可以在每次确认是否返回城镇的时候给它加  1 (通过使用  ~  来代表做运算),这样,如果返回超过两次,就强制玩家进入地牢。

修改过的完整代码如下:

                  
                    VAR player_name 
                  
                  
                    =
                  
                  
                    "PLAYER"
                  
                  
                    
VAR try_outs 
                  
                  
                    =
                  
                  
                    0
                  
                  
                    ->
                  
                  
                     town


                  
                  
                    ===
                  
                  
                     town 
                  
                  
                    ===
                  
                  
                    {
                  
                  
                     player_name 
                  
                  
                    }
                  
                  
                    站在城镇的门口
                  
                  
                    +
                  
                  
                    前往地牢[],让我们出发吧!
                  
                  
                    ->
                  
                  
                    dungeon
    

                  
                  
                    ===
                  
                  
                     dungeon 
                  
                  
                    ===
                  
                  
                    {
                  
                  
                     player_name 
                  
                  
                    }
                  
                  
                    到了地牢门口
                  
                  
                    *
                  
                  
                    进入地牢
                  
                  
                    ->
                  
                  
                    enter_dungeon

                  
                  
                    +
                  
                  
                    返回城镇
                  
                  
                    ->
                  
                  
                    return_to_town_confirm


                  
                  
                    ===
                  
                  
                     return_to_town_confirm 
                  
                  
                    ===
                  
                  
                    确定返回城镇么?
                  
                  
                    ~
                  
                  
                     try_outs
                  
                  
                    ++
                  
                  
                    +
                  
                  
                    {
                  
                  
                     try_outs 
                  
                  
                    <
                  
                  
                    3
                  
                  
                    }
                  
                  
                    是的
                  
                  
                    ->
                  
                  
                    town

                  
                  
                    +
                  
                  
                    {
                  
                  
                     try_outs 
                  
                  
                    <
                  
                  
                    3
                  
                  
                    }
                  
                  
                  
                    ->
                  
                  
                    dungeon

                  
                  
                    *
                  
                  
                    {
                  
                  
                     try_outs 
                  
                  
                    >=
                  
                  
                    3
                  
                  
                    }
                  
                  
                    想得美[,哼],你无论如何也得给我下去!
                  
                  
                    ->
                  
                  
                    enter_dungeon


                  
                  
                    ===
                  
                  
                     enter_dungeon 
                  
                  
                    ===
                  
                  
                    {
                  
                  
                     player_name 
                  
                  
                    }
                  
                  
                    进入地牢,开始探险
                  
                  
                    ->
                  
                  
                    END
                  
                

在返回超过两次后,再想返回就没有可选择余地了:

                  
                    ...
                  
                  
                    // 前面略
                  
                  
                    返回城镇
                  
                  
                    确定返回城镇么?
                  
                  
                    1
                  
                  
                    :
                  
                  
                    是的
                  
                  
                    2
                  
                  
                    :
                  
                  
                  
                    >
                  
                  
                    1
                  
                  
                    是的
                  
                  
                    
PLAYER 
                  
                  
                    站在城镇的门口
                  
                  
                    1
                  
                  
                    :
                  
                  
                    前往地牢
                  
                  
                    >
                  
                  
                    1
                  
                  
                    前往地牢,让我们出发吧!
                  
                  
                    
PLAYER 
                  
                  
                    到了地牢门口
                  
                  
                    1
                  
                  
                    :
                  
                  
                    进入地牢
                  
                  
                    2
                  
                  
                    :
                  
                  
                    返回城镇
                  
                  
                    >
                  
                  
                    2
                  
                  
                    返回城镇
                  
                  
                    确定返回城镇么?
                  
                  
                    1
                  
                  
                    :
                  
                  
                    想得美,哼
                  
                  
                    >
                  
                  
                    1
                  
                  
                    想得美,你无论如何也得给我下去!
                  
                  
                    
PLAYER 
                  
                  
                    进入地牢,开始探险
                  
                

这样,我们的 Demo 就完成了。实现方法有很多,我们只是稍微的尝试用全局变量处理了一下。


inky Mac版下载

下载地址

本文隐藏内容 登录 后查看

历史版本

生活不止苟且,还有我喜爱的海岸.