跳转至

脚本标签

Ren'Py中所有的游戏流程代码都会分别写进数个脚本标签中。脚本标签类似于Python中的函数,用于跳转或调用。

label语句

我们使用 label 语句来定义一个脚本标签,然后是标签名,后面可紧跟一对小括号以添加参数,若没有参数则括号可以省略。参数的写法、作用域等与Python函数相似。

label sample_label(content):

    "[content]"

    return

call语句

call 语句用于让主控流程进入某一脚本标签中,并在执行完这次调用后,回到原本调用的位置。

call语句后面接一个标签名,表示让主控流程进入指定的脚本标签中。若指定的脚本标签要传入参数,则在标签名后紧跟一对小括号以传参。传参方式与Python函数传参方式完全相同。

label start:

    "游戏开始"

    call sample_label("HelloWorld!")

    "游戏结束"

    return


label sample_label(content):
    "[content]"
    return

jump语句

jump 语句用于让主控流程进入某一脚本标签中,并顺势执行下去。后面接一个标签名,表示让主控流程进入指定的脚本标签中

jump语句中指定的脚本标签不能传参。

但你可以给指定的脚本标签添加默认值参数:

label start:
    "游戏开始"

    jump sample_label

    "游戏结束"

    return

# 添加默认参数
label sample_label(content="HelloWorld!"):
    "[content]"
    return

return语句

return 语句标志着一段标签代码块的结束。后面还可接一个返回值,返回值储存在变量 _return 中。

label start:

    "游戏开始"

    call sample_label(8)

    "[_return]"

    return


label sample_label(content):
    $ content += 1
    return content

在上面的代码中,我们调用 sample_label 标签并传入参数整数8,随后 content 参数也就是整数8自增变成9,然后返回 start 标签并携带返回值 content,此时 content 的值储存在变量 _return 中,在对话框中输出 _return 的值显示为9。

Ren'Py特性:在一个脚本标签结束后如果没有添加return语句,且下面还有其它脚本标签,则主控流程将直接进入下面的脚本标签,一直到遇到return语句才结束。若下面所有的脚本标签都没有添加return语句则会一直进入到最后一个脚本标签才结束。另外这也可能会造成奇怪的错误。

笔者习惯将其称之为 标签穿透

任何脚本标签结束后都应添加return语句,不然将造成标签穿透。

Ren'Py脚本标签结束不加return语句就像java中switch case不加break。

label start:

    "游戏开始"

    call label_1

    "游戏结束"

    return

label label_1:
    "label 1"

label label_2:
    "label 2"

label label_3:
    "label 3"

可见,任何在脚本标签结束后不添加return语句的行为都是危险的!除非利它来达到一些特殊的效果。

特殊标签名

一些标签名有特殊的作用,如控制主控流程。常见的特殊标签名有以下这些:

  • start
  • 默认情况下,Ren'Py在游戏启动后会跳转至这个标签。

  • quit

  • 若该标签存在,当用户退出游戏时该标签内容会被调用。

  • after_load

  • 若该标签存在,当游戏读档后会调用这个标签内容。其可能被用于游戏内容更新后的数据修复。

  • splashscreen

  • 若该标签存在,游戏首次运行时,在主菜单出现前,该标签内容会被调用。

  • before_main_menu

  • 若该标签存在,在主菜单出现前,该标签内容会被调用。

全局与局部脚本标签

Ren'Py中共有两种脚本标签:全局脚本标签局部脚本标签。我们一般用的就是全局脚本标签。

全局脚本标签在所有脚本文件中通用,不能重名;而局部脚本标签则可以重名,但是需要关联一个全局脚本标签。

在定义局部脚本标签时,我们只需要在标签名前添加一个 . 即可,表示这是一个局部脚本标签而非全局脚本标签,它会与上面最近的一个全局脚本标签自动关联。

全局脚本标签与局部脚本标签有以下关系:

  1. 一个局部脚本标签只能关联一个全局脚本标签,而一个全局脚本标签可以关联多个局部脚本标签。
  2. 在一个全局脚本标签中可以直接访问与之关联的局部脚本标签,而想要访问其它全局脚本标签关联的局部脚本标签则需要使用 global.local 的形式来访问。
  3. 在一个局部脚本标签中可以直接访问与之关联同一个全局脚本标签的另一局部脚本标签,而想要访问其它全局脚本标签关联的局部脚本标签依然需要使用 global.local 的形式来访问。

它们的关系类似于类与属性 主仆 的关系。

label start:

  "这是全局脚本标签start,游戏从这里开始"

  call .local_label
  call global_label.local_label

  return

label .local_label:
  "这是局部脚本标签.local_label,关联start全局脚本标签"
  return

label global_label:
  "这是全局脚本标签global_label"
  call .local_label
  return

label .local_label:
  "这是局部脚本标签.local_label,关联global_label全局脚本标签"
  return

在上面的代码中,有 startglobel_label 全局脚本标签,其分别关联了一个 .local_label 局部脚本标签。