跳转至

对话

文本剧情是视觉小说类游戏的根本,一切游戏形式都要建立在对话之上。Ren'Py为我们提供了简便快捷的say语句来方便演示对话。

say语句

say 语句一般有以下几种形式:

  1. 一个单一字符串,表示显示的内容。一般用作旁白。
  2. 由两个字符串组成,前面的字符串表示发言人的名字,后面的表示显示的内容。
  3. 表示显示的内容的字符串用三引号引起,方便显示长段文本。
  4. 由一个角色对象和一个字符串组成,角色对象控制发言展现的形式,字符串则是显示的内容。这种形式也是最为常用的。

有些say语句会在原有基础上加上一个 with 从句,后跟上一个转场来实现一些演出效果。

label start:

    "我很紧张"

    "我" "我喜欢你!"

    "希尔薇" "这是真的吗?!" with vpunch

    return

vpunch 是一个内置转场,可以达到让窗口抖动的效果。同时,Ren'Py还内置了很多如 vpunch 的转场,可以在官方文档中查看。

角色对象

我们一般使用 Character 函数构建一个角色对象。

define s = Character("Sylvie")

Character函数支持很多参数,常用的如下:

  • name

    • 角色的名字。如果该参数是一个字符串,则在对话中显示为角色名;如果为 None,则不显示名字,可用于旁白。
  • kind

    • 新建角色的基底角色类型。通常取值为 advnvl
      • adv:文本显示在对话框中。
      • nvl:文本显示在屏幕中间。
  • image

    • 与角色关联的图像标签名,类型为字符串。
  • who_color

    • 角色名的颜色,通常为一个表示颜色的十六进制数的字符串。
  • what_color

    • 对话文本的颜色,通常为一个表示颜色的十六进制数的字符串。
  • what_prefix

    • 在显示对话内容之前添加的前缀字符串。
  • what_suffix

    • 在显示对话内容之后添加的后缀字符串。
  • who_prefix

    • 在显示角色名字之前添加的前缀字符串。
  • who_suffix

    • 在显示角色名字之后添加的后缀字符串。
  • dynamic

    • 如果为 True,则角色名 name 应是一个包含 Python 表达式的字符串。该表达式会在每行对话执行前进行计算,计算结果将作为角色名。
  • condition

    • 如果给定,该参数应是一个包含 Python 表达式的字符串。如果表达式结果为 False,则对话不会发生,即 say 语句不会执行。
  • ctc

    • 用于“点击继续”提示的可展现部件。如果使用了其他特殊提示,则可能不会显示。

who 为前缀的参数表示人名的样式,以 what 为前缀的参数表示文本的样式。除了以上的样式参数,还支持更多样式,可查看官方文档

使用 who_stylewhat_style 的格式(style为样式名)即可作为参数传入Character函数。

define s = Character(
  "Sylvie",
  who_color="#FFA500",
  what_color="#FFE4E1",
  what_prefix="『",
  what_suffix="』",
)

label start:

  s "你好!"

  return

下面是一个nvl角色样例

define s = Character(
  "Sylvie",
  kind=nvl
)

label start:

  s """
  先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。

  然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。

  诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。
  """ 

  nvl clear

  return

由三引号引起来的文本,Ren'Py会根据内容中的空行自动分段。分段后的每一段内容,都会创建自身的say语句。

特殊文本样式

所有在Ren'Py中以字符串形式呈现的文本都可以使用特殊的样式,下面将介绍一些常用的特殊样式、使用方法以及注意事项。

转义符

如果你想在文本中呈现一些特殊字符需要转义来转义防止Ren'Py误解我们的意思。

在文本中,以下字符为转义以后的写法:

  • \ -> \\
  • ' -> \'
  • " -> \"
  • % -> \%%%
  • { -> {{
  • [ -> [[
  • -> 【【

如果你的字符串是以一对双引号表示的,那么如果你想在文本中显示双引号就需要使用转义符,如果你的字符串是以单引号表示,那么则反之。

label start:

    "\"你好。\""
    '\'我是......\''

    return

同时,还能使用 \n 来表示换行:

label start:

    "1\n2\n3\n4"

    return

内插字符

Ren'Py支持在文本中插入一个表达式并计算表达式的值,我们叫做内插字符。在Python中也有类似的字符串格式化用法。

我们使用一对方括号来修饰我们的表达式。

define s = Character("Sylvie")
default point = 1

label start:
    s "我的名字是[s.name]"
    "当前好感度为[point]"

    return

同时,内插字符还支持一些特殊转换标记。我们使用 ! 来表示后面的字符为特殊转换标记。下面是一些比较常用的转换标记:

  • !i 表示在字符串中进行二次插值
define s = Character("Sylvie")
default point = 1

label start:
    $ introduction = "名字为[s.name],好感度为[point]"
    s "[introduction!i]"

    return
  • !u 会强制把英文文本转换成大写。
  • !l 会强制把英文文本转换为小写。
  • !c 会强制把英文文本首字母转换为大写。

我们可以配合一起使用:

define s = Character("Sylvie")

label start:

    $ content = "hello WORLD!"

    # 使用顺序不分先后
    s "[content!lc]"

    return

文本标签

如果你使用过HTML,那么你一定对“标签”很熟悉!在Ren'Py中,我们采用文本标签来实现对文本的特殊效果。

文本标签由一对大括号和一个标签名以及相应参数组成,不同的标签名及参数有不同的效果。

所有文本标签都需要闭合,其中有些文本标签是自闭和的,而有些文本标签需要对应的闭合标签来闭合。标签闭合间的文本将会呈现特殊效果。一般来说,文本标签的格式为:

"{tag=arg}text{/tag}"

其中 tag 为标签名,arg 为参数值,{/tag} 为闭合标签。

还有一些格式为:

"text{tag=arg}"

让我们来看看有哪些常用的文本标签。

a

没错,正如其名,锚点标签的作用就是“传送”,能够引导玩家进入不同的地方。它拥有多个参数,下面来一一介绍:

  • jump

当入参为 jump 时,会进入其冒号后指定的脚本标签。

label start:
    "点{a=jump:dianwo}我{/a}进入"
    return

label dianwo:
    "已进入"
    return
  • call

当入参为 call 时,会调用其冒号后指定的脚本标签。

label start:
    "点{a=call:dianwo}我{/a}进入"
    "出来了"
    return

label dianwo:
    "已进入"
    return
  • show

当入参为 show 时,会显示其冒号后指定的界面,这里涉及到一个新的概念“界面”,我们不展开讨论。

  • URL

当入参部分是一个URL(或者说网站链接)时,会自动启动浏览器打开链接。

label start:
    "{a=https://www.bilibili.com/video/BV1uT4y1P7CX/}点我涩涩{/a}"
    return

alpha

alpha文本标签指定一个透明度,渲染范围为自身及其闭合标签内的文本。透明度是一个介于0.0和1.0之间的数值,分别对应完全透明和完全不透明。

label start:

    "{alpha=0.8}总觉得......{/alpha}"
    "{alpha=0.5}要消失了呢......{/alpha}"
    "{alpha=0.3}......{/alpha}"

    return

b

粗体标签,将自身及其闭合标签内的文本渲染为粗体。

i

斜体标签将自身及其闭合标签之间的文本渲染为斜体。

s

删除线标签在其自身及其闭合标签之间的文本上画一条删除线。

u

下划线标签在其自身及其闭合标签之间的文本添加下划线。

color

颜色文本标签将自身及其闭合标签内的文本渲染为特定的颜色值。颜色值使用 #rgb #rgba #rrggbb #rrggbbaa 格式之一。

cps

cps标签用于指定其闭合标签内的文本每秒钟显示的字符数,若带 *,则表示当前速度的倍数。

label start:
    "{cps=30}时间要开始加速了!{/cps}"
    return

font

字体标签将标签自身及其闭合区间之间的文本渲染为指定的字体。入参即使用的字体文件名或路径。

image

图片标签会在文本中内插一个图像。(可以用于插入表情包)

size

字号标签改变了其自己及其闭合标签内的文本字号。若参数为整数则表示文本大小,若为一个 * 加一个浮点数的形式则表示为当前文本大小的倍数大小。

fast

fast标签只能用于对话中(即say语句),改标签为自闭和标签,在该标签前面的文本内容会立即显示。

label start:
    "你说"
    "什么?!{fast}"
    return

nw

nw标签同样只能用于对话中(即say语句),是一个自闭合标签,该标签前的那行文本内容在显示一次后会立刻消失,显示下一句话。

label start:
    "什么东西?{nw}"
    "?可恶"
    return

若指定参数,则表示等待对应的秒数后再执行文本消失。

label start:
    "你好?{nw=2}"
    "怎么不说话呢?"
    return