参考文档:
renpy官方文档:https://doc.renpy.cn/zh-CN/quickstart.html
前言:我为什么会使用Renpy引擎打造Nvl游戏?
二四年的暑假,我第一次接触到了来自型月社的《月姬:remake》,当时被里面的人物塑造和多分支剧情所打动,我没有想到一个ADV类游戏可以做出这么好的效果。
这是我以前从来没有体会过的事情,这可以说是打开了我的思路,相比传统的游戏方式,我觉得视觉小说类游戏,也就是Nvl类更合我的心意。
所以我决定尝试着制作一款Nvl游戏。
在制作Nvl游戏时,我们可以选择很多引擎,比如Unity,Krkr2,Renpy,Nscripter等等。它们各有优劣,考虑到视觉小说类型游戏使用Unity属于小题大做,Nscripter适合日文原生态开发,所以我把目光放到了Renpy上。
Ren’Py几乎支持所有视觉小说所应该具有的功能,包括分支故事、存储和加载游戏、回退到之前故事的存储点、多样性的场景转换等。Ren’Py拥有类似电影剧本的语法,并且能够允许高级用户编写Python代码来增加新的功能。除此之外,游戏引擎内附的出版工具能够为脚本加密以及压缩游戏素材以防止盗版。
利用Ren’Py结合剧本及Python,非常适合制作冒险游戏,也可以制作出模拟游戏、扑克游戏等类型游戏。Ren’Py也有一些电子角色扮演游戏框架的示例,但相对来说,制作RPG游戏会比较困难。而对比吉里吉里,它甚至支持3D加速的功能。
比较出名的DDLC(心跳文学部)也是使用Renpy引擎制作的。
Renpy是什么?
Ren’Py视觉小说引擎是一款开放源代码的自由软件引擎,用来创作透过电脑叙述故事的视觉小说。Ren’Py之名是Ren’ai与Python两词混合而成。Ren’ai为日文,意指“恋爱”,而Python是Ren’Py所使用的语言环境。
和其他流行的视觉小说引擎(例如NScripter)不同,Ren’Py是在英语文化圈中开发,所以较受英语用户的青睐。Ren’Py已经被证实吸引到英语同好;超过1500个游戏使用Ren’Py引擎,几乎全部使用英文。
使用Renpy开发Galgame是个相当不错的选择。
下载安装Renpy
Renpy官网提供完整的 Ren’Py 软件开发工具包,其中包含 Windows、Mac 和 Linux 平台开发 Ren’Py 游戏所需的一切。
在Windows平台上,双击下载的可执行文件。它会自动解压Ren’Py到一个名为 renpy-
在Max OS X平台上,双击下载驱动器镜像,将其挂载为一个驱动器。当驱动器打开后,将目录命名为 renpy-
在Linux平台上,解tar包,进入 renpy-
完成以上操作后,Ren’Py启动器(launcher)应该正常运行了。
Ren’Py启动器(launcher)已经被翻译为多种语言。需要更改语言的话,选择底部右侧的“preferences”项,就可以更改语言。
完成了上述操作后,我们只需要点击创建新工程就可以创建一个新游戏了。
Renpy的基本语法
label语句
label是脚本标签,label语句允许使用自定义的标签名声明一个程序点位。这些标签仅仅用来被调用或者跳转,可以使用在Ren’Py脚本、python函数及各类界面中。
label sample1:
"这是一个'sample1'脚本标签。"
label sample2(a="default"):
"这是一个'sample2'脚本标签。"
"a = [a]"
我们可以使用label来开始我们的游戏。我们需要创建一个名为 start 的标签。start标签是特殊的,因为当用户点击主菜单的“开始游戏”时,Ren’Py脚本会从这个标签开始运行。如下:
label start:
"爱丽丝" "嗨!你的博客做的怎么样了?"
"我" "还行吧……"
"爱丽丝" "你现在要回家了吗?要不要跟我一起走?"
"我" "当然!"
总共有两种脚本标签(label):global 和 local 。global标签在所有项目文件中都生效,所以每个游戏中都不能重复定义。 local标签可以同名,但需要与不同的global标签做关联。 需要声明一个local标签的话,要在标签名前缀一个英文句号“.”。
这里其实和全局变量和局部变量有一点像,global是全局生效的,下面是他们的写法:
label global_label:
"这在一个global脚本标签里。"
label .local_label:
".这里属于local脚本标签。"
jump .another_local
label .another_local:
"另一个local脚本标签"
jump .local_label
Say语句
say语句被用在对话和旁白场景中。由于在Ren’Py脚本中say语句出现如此之频繁,所以在编写say语句的语法是一个最小化后的语法结构。这是一些样例:
"这是一句旁白。"
"爱丽丝" "这是一句对话,用了完整的角色名。"
e "这是一句对话,使用了角色对象。"
"嘭!!" with vpunch
say语句的第一种形式是一个其自身组成的整个字符串。这种形式用于陈述,陈述内容就是字符串内容。
say语句的第二种形式是由两个字符串组成。第一个字符串是发言角色的名字,第二个字符串是该角色正在说的内容。
say语句的第三种形式是一个简单表达式后接一个字符串。简单表达式应该等同于一个角色名字或者一个角色(character)对象。在后面的例子中,角色对象被用于控制对话展现。
say语句的最后一种形式是一个字符串及with分句的一个转场(transition)效果。在上面的例子中,字符串会显示为对话内容,屏幕会同步抖动。
尽管say语句所处理对话的具体细节实际是由角色(character)对象所控制,say语句的通常用处是在界面上展现一个对话,直到用户点击鼠标后取消对话,并在界面上移除对话内容。
某些字符对Ren’Py有特殊含义,所以不能用在对话字符串中。左花括号 { 开启一个文本标签(tag),左方括号 [ 开启一个替换(substitution)。若需要在对话中使用这些字符,需要连续出现两次。而转移双引号则需要使用反斜杠符号,不然字符串会在那个引号处截断。
应用举例
"I walked past a sign saying, \"Let's give it 100%!\""
结语
好了,label和Say语句的介绍就粗略地过了一遍了。
爱丽丝会在之后的章节里讲解Renpy的其他语法和GUI的制作,敬请期待哦。