RenPy中文空间

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 95|回复: 0

编程语言基础(新)

 关闭 [复制链接]
发表于 2018-4-20 11:25:34 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 BuErShen 于 2018-5-4 12:47 编辑

编程语言基础(翻译:被诅咒的章鱼)

在我们详细介绍Ren’Py的编程语言之前,我们必须首先介绍一个Ren’Py脚本的结构。这包括:脚本文件如何切割为block(语句块),而block(语句块)是由多行脚本构成;各行脚本如何分割为element(基本元素),并构成statement(语句)。

文件
Ren’Py游戏脚本是由游戏目录下众多扩展名为 .rpy 的文件组成。Ren’Py会依次检查每一个文件(按照拉丁字母名排序),并把文件内容用作脚本。

总之,把一份脚本打散成多个文件,跟一份脚本保存在一个大文件中,两种方法是等效的。流程控制可以在文件之间通过调用label(标签)跳转。把一份脚本切分为多个文件跟个人风格有关——有些游戏制作者喜欢使用小文件(像一个事件一个文件,或者每一天一个文件),而其他制作者倾向于使用一个完整的大脚本文件。

为了提高加载速度,Ren’Py启动时会把 .rpy 文件编译为 .rpyc 文件。当一个 .rpy 文件发生变更时, .rpyc 只有在重启 Ren’Py 进程时才会更新。另外,如果一个 .rpyc 文件并没有对应的 .rpy 源文件,这个 .rpyc 文件依然会被使用。当 .rpy 文件已经删除而 .rpyc 文件没有删除的情况下,这可能会导致运行时出现问题。

基础目录

基础目录是包含构建该游戏所有文件的目录。(这可能也包含一些跟游戏无关的文件。)像README(须知)类文件应该放在基础目录中。

基础目录会被创建在 Ren’Py 目录下,以你游戏的名称命名。例如,如果你的 Ren’Py目录名为 renpy-6.11.2,游戏名为“HelloWorld”,你的基础目录就会是renpy-6.11.2/HelloWorld。

游戏目录

游戏目录很可能是在基础目录下一个名为“game”的目录。例如,如果你的基础目录是renpy-6.11.2/HelloWorld,你的游戏目录就会是renpy-6.11.2/HelloWorld/game。

Ren’Py会按以下顺序依次搜索所有目录:

  • 根据可执行文件名,去掉后缀名。比如,如果可执行文件被命名为moonlight.exe,Ren’Py将会寻找基础目录下名为“moonlight”的目录。
  • 根据可执行文件名,去掉后缀名,再去掉下划线“_”及其前缀。比如,如果可执行文件是moonlight_en.exe,Ren’Py会寻找名为“en”的目录。
  • 按照“game”、“data”、“launcher”的顺序。

launcher(启动器)只会识别“game”和“data”目录。

游戏目录包含了游戏内使用的所有文件。其自身及其所有子目录下,会被扫描出所有 .rpy 和 .rpyc 文件,并拼装组合成整个游戏的脚本。 .rpa 文件也会被扫描到,这些文件会被游戏自动使用。当游戏指定某个需要加载的文件路径时,文件路径会与游戏目录关联。(注意config.searchpath可以控制并修改这一点。)

comment(注释)

Ren’Py脚本文件可能会包含一些comment(注释)。每条注释都以记号(‘#’)开头,直到该行文本结束。不过有一种情况例外,comment(注释)不能用在某个字符串的一部分。
[RenPy] 纯文本查看 复制代码
# 这是一条注释。
show black # 这也是一条注释。

"# 这不是一条注释因为它是一个字符串的一部分。"

Ren’Py忽略注释, 所以脚本处理过程中会那段注释如同不存在。

logical lines(逻辑行)

一个脚本文件可以被切割为一些logical lines(逻辑行)。一条logical line(逻辑行)往往在文件中顶格起,换行结束,有一些例外:

  • 该行结尾是反斜杠(‘’)。
  • 该行包含几个开括号字符(‘(‘, ‘{‘, or ‘[‘),而该行没有匹配到对应的闭括号字符(‘)’, ‘}’, or ‘]’。
  • 一个包含换行的字符串中。

一个逻辑行结束后,下一行就是另一个逻辑行的开始。

Ren’Py编程语言中大多数语句都只由一个逻辑行,有一些语句则包含多行。
[RenPy] 纯文本查看 复制代码
"This is one logical line"

"Since this line contains a string, it continues
 even when the line ends."

$ a = [ "Because of parenthesis, this line also",
        "spans more than one line." ]

空的逻辑行会被忽略。

缩进和block(语句块)

缩进是我们指代Ren’Py语句每个逻辑行开头的空间。在Ren’Py中,缩进必须使用空格。

缩进被用来将一些语句分组形成block(语句块)。一个语句块是一组逻辑行,通常也是一组语句。将一个文件分割为语句块的原则是:

  • 一个语句块在文件开头被打开加载。
  • 在某个逻辑行使用了比上一行更多缩进量时,就表示开始了一个新语句块。
  • 在一个语句块中所有的逻辑行必须保持同样的缩进量。
  • 当一个逻辑行的缩进量比其他行更少,表示上一个语句块的结束。

对Ren’Py来说,缩进非常重要,甚至缩进量能引起语法或者逻辑错误。同时,缩进的使用表明了块结构,使我们不需要浏览整个脚本文件就能识别出块结构。
[RenPy] 纯文本查看 复制代码
"This statement, and the if statement that follows, is part of a block."

if True:

    "But this statement is part of a new block."

    "This is also part of that new block."

"This is part of the first block, again."


语句元素
Ren’Py语句由一些基本部分组成。

关键词

    关键词是一个英文单词,必须在游戏脚本中合法出现。关键词通常用于出现在语句和属性中。

    名字以一个下划线(_)开头的关键字仅限Ren’Py内部使用,除非文档另有说明。当一个关键词名字开头是两条下划线__但结尾没有两条下划线__,在使用时它会改变为特定文件版本号。

变量名

    变量名以一个字母或者下划线开头,之后跟随着0个或者若干个字母、数字或者下划线。出于我们的需求,在“U+00a0”和“U+fffd”之间的unicode字符都被认为是字母。

图片名

    图片名由一个或多个部分构成,以空格分隔。图片名的第一部分称作图片tag(标签)。图片名后面的部分都是图片的attribute(属性)。图片的各部分都是由字符、数字和下划线组成的字符串。

    例如,一个图片名为 mary beach night happy 。图片tag(标签)就是 mary ,而图片attribute就是 beach 、 night 和 happy 。

字符串

    字符串以一个引用字符(“、’或者`)开头,包含几串文字,并以同样的引用字符结尾。

    反斜杠(\)用于字符转义,一些特殊字符,比如%(需要写作\%)、[(需要写作\[)、{(需要写作\{)。它还用于包含下一行,此时使用\n串。

    在Ren’Py字符串中,连续多个空格会被压缩为一个空格字符,除非某个空格前面有一个反斜行。
[RenPy] 纯文本查看 复制代码
'Strings can\'t contain their delimiter, unless you escape it.'

简单表达式

    简单表达式就是一个Python表达式,用于在Ren’Py脚本中运行Python。一个简单表达式使用以下类型作开头:

  • 一个变量名。
  • 一个字符串。
  • 一个数字。
  • 圆括号中包含的任意表达式。

    其后可以接续任意数量的:

        变量名前的一个英文句号字符。
        圆括号内的Python表达式。

    举例,3, (3 + 4), foo.barfoo(42) 都是简单表达式。但 3 + 4 则不是“简单”表达式,因为该表达式是一个算式字符串且没有使用圆括号。

at列表
    at列表由一系列简单表达式组成,使用英文逗号字符分隔。

python表达式
    python表达式是指任意的、可能不包含分号的python表达式。这些表达式常用于if和while语句中,处理对应的情况。

通用语句语法
大多数Ren’Py语句使用通用的语法。而say语句是个例外,其使用开头的某个关键词标识say语句。如果语句中包含变量的话,会跟在该关键词后面。

变量后面会跟着一个或多个property(特性)。property(特性)可以使用任意顺序排列,每个属性均只会出现一次。一项property(特性)以一个关键词开头。对大多数的property(特性)来说,属性名字会跟之前出现的语法element(元素)之一保持一致。

若该语句包含一个block(语句块),那行语句会以冒号( : )结尾。否则的话,以换行结尾。
python表达式语法

Note
本段内容现在可以先跳过不看。当你觉得无法理解某个样例,或者你觉得需要理解更深层次的运行机制时,可以再返回来看本段内容。


Ren’Py的很多地方都会用到python表达式。例如,定义一个新角色就意味着调用charactre(角色)的函数。由于python表达式功能十分强大,只是用其很小部分就足以实现一个基本的Ren’Py游戏。

这是一个python表达式的概要。

整数(integer)
    整数是一个不带小数点的数字。 3 和 42 就都是整数。

浮点数(float)
    浮点数是一个带小数点的数字。 .5 、 7. 和 9.0 就都是浮点数。

字符串(string)
    python字符串以英文符号的双引号(“)或单引号(‘)开头,并使用同样的符号结尾。斜杠(\)被用来转义换行符,并可以使用特殊字符(\n)表示换行。与Ren’Py字符串不同,python字符串不能分多行。

True、False、None
    这是三个特殊的值。 True 表示真值, False 表示假值。 None 表示空值。

元组(tuple)
    元组(tuple)是一种容器,其元素(item)数量非常重要。例如,我们可以使用一个2维元组(也被称作pair)来装宽度和高度数据,或者使用一个4维元组(包含x、y、宽度和高端)来装一个三角形的数据。

    元组(tuple)开头有一个左括号 ( ,可以由0个或若干个逗号分隔的python表达式,并以一个右括号 ) 结束。比较特殊的是,只有一个元素(item)的元组中,元素后面必须带一个逗号。各种例子如下:
[RenPy] 纯文本查看 复制代码
()
(1,)
(1, "#555")
(32, 24, 200, 100)

列表(list)
    列表(list)是一种容器,用来装各种类型的数据。列表以 [ 开头,包含一系列逗号分隔的表达式,并以 ] 结束。举例如下:
[RenPy] 纯文本查看 复制代码
[ ]
[ 1 ]
[ 1, 2 ]
[ 1, 2, 3 ]

变量(variable)
    python表达式中允许使用变量。通过定义语句或者python语句产生的数值可以存放在变量中。变量以字母或者下划线开头,后接0个或若干个字母、数据或下划线。举例如下:
[RenPy] 纯文本查看 复制代码
name
love_love_points
trebuchet2_range

    以下划线“_”开头的变量是预留给Ren’Py专用,创作者不应使用。

域(field)访问
    python模块(module)和对象(object)都有域(field)的概念,可以在域(field)后接一个英文句号“.”和一个表达式(通常是一个变量),实现对域的访问。例如:
[RenPy] 纯文本查看 复制代码
config.screen_width

    实现了对config域中screen_width的访问。

调用
    python表达式可以调用一个函数并获得一个返回值。函数调用以一个表达式开头(通常是函数名),后面跟着一对圆括号,括号内有一系列参数。参数列表开头是个python表达式,也是位置参数。后面则是关键词参数,由参数名、等号和表达式组成。下面是一个例子:
[RenPy] 纯文本查看 复制代码
Character("Eileen", type=adv, color="#0f0")

    我们调用了Charactre函数。其给定了一个位置参数,也就是字符串”Eileen”。其给定了两个关键词参数: type 被赋值为 adv ,而 color 被复制为字符串“#0f0”。

    构造器是一类专门用于返回一个新对象的函数,且会被使用相同的方式调用。

阅读此份文档时,你可能会看到这样的函数声明:

Sample(name, delay, position=(0, 0), **properties)
这个样例函数并不真正在Ren’Py中使用,而只存在这份文档中。

这个函数:
  • 函数名为“Sample”
  • 有两个位置参数,分别是name和delay。真实情况下,这种参数应该在文档中剔除。
  • 有一个关键词参数 position,其默认值为(0, 0)。

由于函数结尾是**properties,这意味着其可以使用 风格特性 作为额外的关键词参数。其他的特殊形式结尾还有*args,表示其可以使用任意数量的位置参数,而**kwargs表示在文档中已详细描述过的位置参数。

Python的强大,远非我们这份文档所能完全展现。若希望学习python的更多细节,我们推荐Python入门教学,python.org 。由于我们认为对于Ren’Py来说,更深一层的python知识不是必要的,了解python语句和表达式通常就足够了。


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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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