RenPy中文空间

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 340|回复: 0

[旧版文档] 对话与旁白

 关闭 [复制链接]
发表于 2018-2-28 19:38:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
本帖最后由 BuErShen 于 2018-9-17 08:10 编辑

对话和旁白
注意
此处为旧版文档,不再更新。

查阅最新Ren’Py简体中文文档,请到下面网址(同步官方)
https://www.renpy.cn/doc/index.html




文字是视觉小说的基础,对于讲究剧情的游戏尤为重要。文字由对话与旁白组成。 (为了方便起见,我们把对话和旁白统称为对话,除非差别很大。)同样重要的是, 用户可以自定义对话的外观样式, 以适应他们的游戏。

在Ren'Py中,大多数对话都是使用say语句编写的。 对话的外观可以使用Character对象为每个角色进行自定义。

Say命令

Say命令用于对话和叙述。 由于它几乎总是Ren'Py脚本中最常用的语句,所以say语句的语法最小化了编写它的开销。 一些例子表述如下:
[RenPy] 纯文本查看 复制代码
    "这是旁白"

    "Eileen" "这是对话,并显示说话角色名字"

    e "这是也是对话,是使用Character对象的对话"

    "嘭!" with vpunch

say语句的第一种形式是一个字符串。 这种形式用于旁白文字,字符串里显示就是旁白内容。

第二种形式由两个字符串组成。 第一个字符串是显示当前说话角色的名字,第二个是角色说话的内容。

第三种形式是一个简单的表达式和一个字符串组成。 简单表达式一般是给出名字的字符串或Character对象。 是后一种情况的话,Character对象将会被用于控制对话的外观设置。

最后一种形式由一个字符串和一个过渡的with从句组成。 在示例中,会显示字符串里内容——“嘭!“,同时震动屏幕。

尽管say命令具体细节是由使用Character对象控制的,但say命令通常是在屏幕上显示对话,等待玩家点击,然后在屏幕上移除对话。

某些字符在Ren'Py有特殊的作用,所以不能用于对话字符串。 { 字符是一个文本标记的开始字符,[ 字符是一个文本替换的开始字符。 要在对话中使用它们,将它们写两次。可能还需要在引号前加上\反斜杠,防止它结束当前字符串。 例如:
[RenPy] 纯文本查看 复制代码
    "我举起的牌子写着, \"加100分!\""

定义Character对象
通过定义Character对象并在say语句中使用它,您可以自定义对话的外观(以及某种程度上的对话处理)。 Character对象的创建方式是使用define命令将一个Character对象赋值给一个变量。 例如:
[RenPy] 纯文本查看 复制代码
define e = Character("艾琳",
                     who_color="#c8ffc8")

定义完成后,这个Character对象就可以用say命令使用了:
[RenPy] 纯文本查看 复制代码
    e "你好,我是艾琳"

Character是一个python函数,有很多关键字参数。 这些关键字参数控制着角色的行为。

define语句会对提供的表达式求值,并赋值给指定的名称。 如果不在init初始区块内的话,define语句将自动以其在init初始区块内(默认优先度为0)运行。

Character(name, kind=adv, **args)
创建并返回一个Character对象,用于控制对话和旁白的视觉效果。

name
如果是个字符串,此字符串就是该角色的姓名。 当name值为None时,不会显示角色姓名,正如旁白。

kind
基于此参数的Character对象。 使用时,所有其他未提供的参数值将采用kind指定的Character对象的参数。可以用来创建一个Character对象模板,其他的Character对象可基于该模板进行调整。

关联图像 Character对象可以与一个图像标记相关联。 这将允许使用该角色的say命令显示一张与此标记相应的图像,还允许Ren'Py自动根据该角色说话内容显示相应的对话框头像。

image
该字符串用于指定与该Character对象关联的图像标记
语音标签 如果将语音标签分配给某个Character对象,则可以在设置界面内调整关联的语音文件音量或静音。

voice_tag
该字符串将与该Character对象关联的语音文件,在'voice'通道中静音或播放。
前缀与后缀 这些参数允许为Character对象的角色姓名以及所显示的对话内容添加前缀和后缀。 例如,为对话添加引号。

what_prefix
添加到对话内容之前的字符串。

what_suffix
添加到对话内容之后的字符串。

who_prefix
添加到角色姓名之前的字符串。

who_suffix
添加到角色姓名之后的字符串。

更改姓名的显示
这些选项有助于控制姓名的显示。

dynamic
如果为True,那么name应该是一个包含python表达式的字符串。 该字符串将在角色每次说话之前进行求值,并将获取值用作该角色的姓名。
交互控制 这些选项控制是否显示对话,是否发生交互以及显示时输入的模式。

condition
如果给出此参数,它应该是一个包含python表达式的字符串。 如果表达是False,那么对话就不会发生,就好像say命令不存在一样。

interact
默认值为True,在这种情况下,每当显示对话时都会进入交互。 如果为False,则不会发生交互,并且可以将其他元素添加到屏幕中。

advance
默认值为True,在这种情况下,玩家可以点击推进对话,并且其他推进方式(如跳过和自动转发模式)也可以使用。 如果为False,则除非提供了替代方法(例如超链接跳转或screen),否则玩家将无法跳过说明语句。

mode
当该角色说话时给出进入模式的字符串。 更多详情,请参阅 模式

callback
当该角色说话时发生事件时调用的函数。 更多详情,请参阅 角色回调

等待继续标志 是一段剧情文字显示完毕后出现,用于提示玩家点击屏幕继续推进剧情。

ctc
用于等待继续标志的可显示对象,除非您有更详细的设置。

ctc_pause
当对话被{p}或者{w}暂停时,该可显示对象作为等待继续标志。

ctc_timedpause
当对话被{p=}或者{w=}文本标签暂停时,该可显示对象作为等待继续标志。 若为None,默认会使用ctc_pause的值。如若想使用ctc_pause而不是ctc_timedpause的话,请使用Null()作为参数值。

ctc_position
用于控制等待继续标志的位置。 若为 "nestled",该标志将会出现在文本最后一个字符的后面。若为"fixed", ,该标志会显示在屏幕上,但具体位置由其位置样式属性决定。。

视屏 对话的显示使用了一个视屏(screen)。 这些参数允许您选择该 视屏(screen),并向其提供参数。

screen
用于显示对话的视屏名称。

show_开头的关键字参数在去掉show_这个前缀后,作为参数传递给视屏(screen)对应的参数。 例如,show_myflag的值将成为视屏(screen)中myflag变量的值。 (默认情况下不使用myflag变量,但可以通过自定义视屏(screen)使用。)

由于历史原因,一个show变量由Ren'Py自己处理:

show_layer
如果有,这应该是一个字符串,给出图层的名称以显示“say” 视屏(screen)。

文本和窗口样式who_what_和window_` 开始的参数,去掉这些前缀后,将会用于调整角色姓名,对话内容,以及包含两者的窗口的样式属性。

例如,如果一个Character对象有关键字参数 who_color="#c8ffc8",它的姓名将会变成绿色。window_background="frame.png"这样的参数将会改变现实该角色对话窗口的背景。

角色姓名,对话内容和窗口的样式属性也能通过who_style, what_style, 和 window_style参数来设置。

应用于角色名称,口语文本和窗口的样式也可以通过这种方式设置,分别使用who_style,what_style和window_style参数。

设置config.character_id_prefixes也可以对其他Displayables(可显示对象)进行样式配置。 例如,当使用默认的GUI时,使用以namebox_为前缀的样式来设置角色姓名。

带Image属性的say命令

当一个Character对象带有关联图像标签的时候,涉及该角色say命令会在角色姓名和第二个字符串之间可以插入图像属性。

在这种情况下,若当前该标签的图像正被显示在屏幕上,则Ren'Py会自动执行一条含该角色标签以及对应属性图像的show命令。若该标签的图像没有出现在屏幕上,Ren'Py会将图像属性用于显示对话框头像图片,但是并不会执行这show命令。

示例:
[RenPy] 纯文本查看 复制代码
define e = Character("艾琳", image="eileen")

label start:

    show eileen mad
    e "你让我有些失望。"

    e happy "不过现在不重要了。"

相当于:
[RenPy] 纯文本查看 复制代码
define e = Character("艾琳")

label start:

    show eileen mad
    e "你让我有些失望。"

    show eileen happy
    e "不过现在不重要了。"

若希望以此法改变图像时有一个转场效果,可以将 config.say_attribute_transition设定为您想要的转场效果。

Character对象示例
下面是一些Character对象的示例:
[RenPy] 纯文本查看 复制代码
# 此Character对象的对话都在一对半角括号内。
define e = Character("艾琳", what_prefix='(', what_suffix=')')

# 此Character对象的角色姓名由变量(player_name)决定。
define p = Character("player_name", dynamic=True)

特殊的Character对象
有些Character对象是预定义的,会在特定场合下被自动使用。若自己重新定义这些角色将会被改变Ren'Py的某些行为。但如果是无意中使用,则可能会造成一些意料之外的问题。

adv
Character使用的默认字符种类。 此Character对象只会在屏幕上显示一行对话。

nvl
在NVL模式中显示对话的Character对象,会在屏幕上显示多行对话。

narrator
用于显示叙述的Character对象,在没有角色姓名的say命令中使用。

name_only
在角色名称为字符串的Character对象的对话。Ren'Py会复制一份该对象,将其名称设为接收到的字符串,然后使用新建的Character对象来显示此对话。

centered
该Character对象的对话将显示在屏幕的正中央,与对话窗口的位置无关

vcentered
该Character对象的对话将垂直地显示在屏幕的正中央,与对话窗口的位置无关。

extend
用于延续前一个角色的对话的Character对象 ,由对话的最后一行,"{fast}"以及给出的扩展对话组成。这就可以在对话的过程中改变屏幕的内容。
Extend在小说模式下也会正常地工作。

示例:
[RenPy] 纯文本查看 复制代码
# 显示第一行对话,等待点击,改变表情,并显示其余的内容。

show eileen concerned
e "有时候,我感到难过。"
show eileen happy
extend " 但我通常很快就会克服它!"

# 以下脚本代码效果类似,唯一的不同在于第一行结束后没有等待点击。
# 只有在玩家没有把文字速度设得很高的时候才有区别。

show eileen concerned
e "有时候,我感到很难过。{nw}"
show eileen happy
extend " 但我通常很快就会克服它!"

对话窗口管理

Ren'Py包括几个允许管理对话窗口的语句。 由于对话窗口总是在对话期间显示,所以这些语句控制非对话交互期间窗口的存在或不存在。.

window show
窗口显示语句会显示窗口。 它将一个可选的转换作为参数,用于显示窗口。 如果省略转换,则使用config.window_show_transition

window hide
窗口隐藏语句导致窗口被隐藏。 它将一个可选的转换作为参数,用于隐藏窗口。 如果省略转换,则使用config.window_hide_transition

window auto
这可以自动管理窗口。 该窗口显示在config.window_auto_show中列出的语句之前 - 默认情况下,声明语句。 该窗口在config.window_auto_hide中列出的语句之前隐藏 - 默认情况下为场景(scene)和调用屏幕(call screen)语句。 (只考虑语句,而不是语句等价函数。)

窗口自动(window auto)语句分别使用config.window_show_transitionconfig.window_hide_transition来显示和隐藏窗口。 窗口自动(window auto)被窗口显示(window show)或窗口隐藏(window hide)取消。

示例:
[RenPy] 纯文本查看 复制代码
window show  # 显示具有默认转换的窗口(如果有的话)。
pause             # 该窗口在暂停期间显示。
window hide    # 隐藏窗口。
pause             # 该窗口在暂停期间被隐藏。

window show dissolve   # 显示解散的窗口。
pause                          # 该窗口在暂停期间显示。
window hide dissolve    # 用溶解隐藏窗口。
pause                         # 该窗口在暂停期间被隐藏。

window auto

"The window is automatically shown before this line of dialogue."
pause                # 该窗口在暂停期间显示。

scene bg washington  # 窗口在场景改变之前被隐藏。
with dissolve

对话窗口管理命令受设置中的“显示空窗口”的设定值的影响,具体见 Preference()。若此设定在设置被禁用,则上述语句无效。

Say参数

其他参数可以通过在say语句后面的括号中将它们传递给say语句。 例如,这样写:
[RenPy] 纯文本查看 复制代码
    e "你好, 世界。" (what_color="#8c8")

如果不是None的话,Say语句的参数首先由 var:config.say_arguments_callback处理, 如果有,相应的参数就会被传递给角色,如同它们已被character对象定义过。 所以,上面示例中的对话将显示绿色文字。

Python写法
注意:
建议您先阅读 Python 语句相关内容, 这样才有助于对以下内容的理解。

当say命令的第一个参数存在并且为表达式时,say命令就会执行该表达式,并将该表达式当作第一个参数,之后再赋值一个interact为True默认参数。
例如:
[RenPy] 纯文本查看 复制代码
e "你好, 世界。"

相当于:
[RenPy] 纯文本查看 复制代码
$ e("你好, 世界。", interact=True)

say语句会先在已命名的存储区域搜索character对象,如果没有检索到,才会去默认存储区搜索character对象。如果您想在默认存储中使用与变量名称相同的character对象,可通过以下方式定义:
[RenPy] 纯文本查看 复制代码
define character.e = Character("艾琳")

这个character可以和默认存储中的变量一起使用:
[RenPy] 纯文本查看 复制代码
label start:

    # 这是一个糟糕的变量名。
    e = 100

    e "我们的初始能量是 [e] 单位。"

对于带有参数的say语句,可视为将该参数传递给相应的函数。例如:
e "你好,世界。" (what_size=32)
相当于:
e("你好,世界。", interact=True, what_size=32)
当e是一个字符时,上面的语句将进一步等同于:
[RenPy] 纯文本查看 复制代码
Character(kind=e, what_size=32)(" 你好,世界。", interact=True)

但是可以使用var:config.say_arguments_callback或者用e包装一个character对象来做不同的事情。

窗口管理通过设置_window和_window_auto变量并使用以下两个函数来执行:

_window_hide(trans=False)
Python中与相当于 "window hide"语句。

Trans
如果为False,则使用默认的窗口隐藏转场效果(Transition)。 如果为None,则不使用转场效果。 否则,使用指定的转场效果。

_window_show(trans=False)

Python中与相当于“windows show” 语句。

trans
如果为False,则使用默认的窗口显示转场效果(Transition)。 如果为None,则不使用转场效果。 否则,使用指定的转场效果。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|RenPy中文空间 ( 苏ICP备17067825号 | 苏公网安备 32092302000068号 )

GMT+8, 2018-12-19 07:46 , Processed in 0.032651 second(s), 21 queries , File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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