RenPy中文空间

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 246|回复: 0

[旧版] 标签与控制流

 关闭 [复制链接]
发表于 2017-12-10 09:01:22 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 BuErShen 于 2017-12-10 09:00 编辑

标签与控制流

Label命令
Label命令允许您给脚本的某个程序点定义一个名称。它们是专门用来配合 jump或者 call命令使用的。在脚本中您可以使用这两个命令,而除此之外config对象也会用到标签。
[RenPy] 纯文本查看 复制代码
label sample1:
        "Here is 'sample1' label."

label sample2(a="default"):
        "Here is 'sample2' label."
        "a = [a]"

label命令可能含有与之相关联的区块。在这种情况下,当遇到label命令时脚本执行器便会控制该区块。当该区块结束时,脚本执行器将会执行该label命令的后下一条语句。

Lable有两种:全局和本地 lable。 全局 lable即在所有项目文件下共享的一个全局范围内的 lable,因此每个游戏内不能使用重复的全局 lable名称。 本地lable逻辑上作用于其声明的全局标签的范围内。
声明一个本地 lable,需要以..作为lable名的前缀。例如:
[RenPy] 纯文本查看 复制代码
label global_label:
        "Inside a global label.."
label .local_name:
        "..resides a local one."
        jump .local_name

本地lable可以直接在其声明的同一个全局标签中引用,或者使用由其全局和本地lable名所组成全名引用:
[RenPy] 纯文本查看 复制代码
label another_global:
    "Now lets jump inside local label located somewhere else."
    jump global_label.local_name

label命令也可以使用一些可选参数,这些参数将会按照PEP 3102的标准进行处理,但有两个例外:

  • 在被调用是才会初始化默认值的参数。
  • 作用域是动态而非静态的参数。

Jump命令
jump命令用于向指定的标签传递控制权。

如果 expression关键字存在,则计算其后的 expression,并将计算得到的字符串用作将要跳转到的语句的标签名称。如果expression参数不存在,则必须明确地给出要跳转的语句标签名称。

与call命令不同的是,jump命令不会将下一个语句推入栈中,因此跳转后将无法返回原来的地方。
[RenPy] 纯文本查看 复制代码
label loop_start:

        e "哦不,看来我们被困在了一个无限循环里。"

        jump loop_start

Call命令
call命令用于向指定的标签传递控制权。它会将下一个语句压入调用堆栈中,因此您可以使用return语句将控制返回到执行call之前的语句。

如果 expression关键字存在,则计算其后的 expression,并将计算得到的字符串用作将要调用的语句的标签名称。如果 expression参数不存在,则必须明确地给出要调用的语句标签名称。

如果给出了可选的from从句,它会在该call命令后立即插入一个标签,该标签的名称就是from从句的参数值。显式标签有助于确保使用返回堆栈保存的游戏,在加载时可以返回到正确的位置。
[RenPy] 纯文本查看 复制代码
e "首先,我们将调用一个subroutine."

call subroutine

call subroutine(2)

call expression "subroutine" pass (count=3)

# ...

label subroutine(count=1):

        e "我来这里 [count] 次(s)。"
        e "接下来,我们将从subroutine这个标签处返回。"

        return

call命令可以引用参数,详情可参考 PEP 3102。

当要使用具有参数列表的call表达式时,必须在表达式和参数列表之间插入pass关键字。否则,参数列表将被当做表达式的一部分处理,而不是call命令的一部分。

Return命令

return命令将 call栈顶部的语句弹出,并将控制权转移给它。如果 call堆栈为空,则执行 return命令时, 会重启Ren'Py并进入主菜单界面。

若给 return命令赋值一个简单表达式作为的参数,则该表达式所求出的值将被存在_return变量中。该变量可以动态地定位到作用域的各个位置。

特殊标签
以下是一些仅供Ren'Py内部使用的特殊标签:

start
默认情况下,游戏开始时Ren'Py会跳转到这个标签。

quit
如果该标签存在,当玩家退出游戏时,该标签会自动被调用。需要注意的是,如果在该标签内不会自动结束游戏的话(比如显示一些对话),若玩家继续试图退出游戏,将会再一次调用该标签。

after_load
如果该标签存在,将会在游戏读取后自动被调用。它可以用于游戏升级后的数据修复。

splashscreen
如果该标签存在,将会在游戏开始运行时被自动调用。此调用发生在主菜单界面出现前。

before_main_menu
如果该标签存在,将会在进入主菜单前被自动调用。偶尔需要配置主菜单界面的话(比如在背景上播放视频),您可以考虑使用该标签。

main_menu
如果该标签存在,游戏在进入主菜单界面时会调用该标签(而不是呼叫main_menu这个视屏)。如果在进入该标签后遇到了return命令,Ren'Py会从start标签处开始游戏。比如说,以下代码所实现的功能就是立即开始游戏而不显示主菜单。
[RenPy] 纯文本查看 复制代码
label main_menu:
        return


after_warp
如果该标签存在,将会在跳转到特定行之后、目标行命令被执行之前被调用。请参阅 Warping to a line

标签和控制流相关函数
renpy.call_in_new_context(label,?*args,?**kwargs)
该代码将创建一个新的语境,然后执行此标签的内容。在新的语境中,回滚是无效的, 并且保存/加载将在顶级语境中发生。

使用此函数可以在交互中与用户开始第二个交互。

renpy.get_all_labels()
返回所有在程序中定义的标签,包括内部库定义的标签。

renpy.get_return_stack()
返回一个列表赋给当前返回栈,返回栈是一个语句名称列表。

renpy.has_label(name)
若此name参数的值是一个标签的名称,返回True,否则返回False。

    name
    通常是用来检查标签是否存在的字符串。 它也可以表示一个不透明的元组,用于给出非标签语句的名称。

renpy.invoke_in_new_context(callable,?*args,?**kwargs)
此函数将创建一个新的语境,并调用指定的python函数。当函数返回或是抛出异常的时候,Ren'Py将移除新创建的语境,然后恢复当前的语境(调用指定函数前的语境)。

???语境维护显示的状态 (包括正在显示的screens屏幕和图像和音频系统)。当语境返回时, 两者都将恢复。

其他的位置参数和关键字参数都会被传给此可调用对象。

使用此函数创建的语境将无法运行renpy代码,因此一些改变renpy代码流的异常(比如由renpy.jump导致的异常)将导致该语境被终止,并交给高一级的语境来处理。如果您希望从函数内部运行renpy代码的话,您应该使用renpy.call_in_new_context来调用它。

renpy.jump_out_of_context(label)
这个函数将导致控制权离开当前的语境,然后在高一级的语境中转移给指定的标签。

renpy.seen_label(label)
若指定标签已经被执行过一次,返回 True,否则返回 False。这个函数可以用来解锁CG场景与音乐鉴赏。

renpy.set_return_stack(stack)
设置当前的返回栈。 返回栈是一个语句名称列表。
语句名称可以是字符串(用于标签语句)或者不透明的元组(对于非标签语句)。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2018-8-21 06:28 , Processed in 0.030117 second(s), 21 queries , File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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