RenPy中文空间

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 538|回复: 0

[旧版文档] 语言基础

 关闭 [复制链接]
发表于 2017-10-29 16:02:55 | 显示全部楼层 |阅读模式

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

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

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

语言基础
注意
此处为旧版文档,不再更新。

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




在我们开始讲解Ren'Py语言之前,我们必须先介绍Ren'Py脚本的结构。首先您得了解一个文件是怎么被分成很多个区块,每个区块是怎么被分成许多行,而每一行又是怎么被分解成组成命令的各个元素的。

文件
Ren'Py的游戏脚本是由游戏目录下所有的.rpy文件所组成的。Ren'Py会按照unicode编码顺序自动搜索所有的文件,并读取其中的内容作为游戏的脚本。

一般来说,把一个脚本分成多个文件与一个由大文件所组成的脚本并没有太大差别。您可以通过跳转或者调用另一个文件中的标签来完成在文件之间传输控件。所以具体怎么划分脚本实际上是无所谓的,有些人喜欢零碎的小文件(如一个事件一个文件,或一天一个文件),有些人喜欢一个完整的大文件。

为了加速启动,当游戏启动时Ren'Py会将 .rpy编译成 .rpyc 文件。当 .rpy 文件 被修改以后,下次启动Ren'Py时 .rpyc 文件也会被更新。但是当 .rpyc文件存在而相应的 .rpy文件却不存在时,系统将默认选择使用已存在的 .rpyc 文件。这样便可能会导致一个问题:若 .rpy 被已删除,但是 .rpyc 并没有,那么当启动Ren'Py的时候,看起来就像 .rpy 文件没有被删除一样。

根目录
根目录里包含了所有将与游戏一起发布的文件(也可能会有一些不会随游戏发布的文件)。例如,一些 ReadMe 之类的文件应该放在根目录下,随游戏一起发布。

游戏的根目录一般创建在Ren'Py的工作目录下,文件名与您创建的游戏名称相同。比如说,如果您的Ren'Py的工作目录是renpy-6.11.2,您的游戏名称是“HelloWorld”,那么该游戏的根目录就是renpy-6.11.2/HelloWorld。

游戏目录
所有游戏目录的文件名都是"game",其位于根目录之下。比如,如果您的根目录是renpy-6.17.3/whyyousodiao,那么您的游戏目录就是renpy-6.17.3/whyyousodiao/game。

但是,Ren'Py将以以下顺序搜索目录:

  • 对于exe文件,搜索将不包含文件扩展名。比如,如果游戏的exe文件是moonlight.exe,那么Ren'Py将会先在根目录下搜索叫做moonlight的文件夹。

  • 对于包含“_”的exe文件,搜索将不包含扩展名,并去除以“_”结尾的前缀。比如,如果exe文件的名字是moonlight_en.exe,Ren'Py将会搜索叫做en的文件夹。

  • 然后搜索名为“game”,“data”和“launcher”的目录。

如果是在启动器里启动游戏的话,那么启动程序只能识别“game”和“data”目录。

游戏目录包含所有游戏中将会使用的文件。Ren'Py会读取 .rpy.rpyc 及其包含的所有子目录文件,然后生成脚本。同时它也会读取 .rpa 压缩文件,作为游戏资源的一部分。如果在游戏中要读取一个文件,则要检索的文件路径是game文件夹的相对路径。(注意:修改config.serachpath可以改变这个设置)

注释
Ren'Py脚本中可以使用注释符。注释符用“#”表示,在#之后的一行文本都会被视为注释。但是,注释符不能出现在字符串的中(也就是说"123#456"表示的是一个字符串,这里的“#”不能表示注释符)。
[RenPy] 纯文本查看 复制代码
# 这是一个注释。
show black # 这也是个注释

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

Ren'Py会忽略所有注释的文本,就好像它们不存在于脚本中一样。

逻辑行
脚本文件会被分解为一个个逻辑行。每一个逻辑行都是从文件某一行的行首开始,并且一般在该行的行尾结束,除非:

  • 这行的最后一个字符是反斜杠('\')。

  • 该行包含一个左括号字符 ('(', '{', or '['),它们分别未由相应右圆括号字符 (')', '}', 或 ']', 匹配)

  • 在行尾处有未结束的字符串的行。

当一个逻辑行结束后,下一个逻辑行从下一行的行首开始。

大部分的Ren'Py语言命令都只包含一个逻辑行,但是有些命令由多个逻辑行组成。
[RenPy] 纯文本查看 复制代码
" 这是一个逻辑行 "

"因为这是一个字符串,这一行会

继续下去就算遇到行尾。"

$ a = [ "因为括号没有闭合,这个逻辑行",

                "也超过了一行。" ]

空的逻辑行将会被忽略。

缩进和区块
缩进是我们给每逻辑行开始前用于对齐Ren'Py语句的空格所起的名称。Ren'Py脚本中,缩进必须用空格(不可用制表符Tab)。

缩进用来把命令划分成区块。一个区块包含数行代码,通常是一组命令集合。采用如下规则来划分区块:

  • 一个区块通常从某一行的行首开始。

  • 每当逻辑行缩进到先前的逻辑行时,就会产生一个新的区块。

  • 同一个区块内的所有逻辑行必须具有相同的缩进。

  • 当一个逻辑行遇到比块内其他行缩进量少时,该区块结束。

缩进在Ren'Py里十分重要,如果缩进不对,会导致语法和逻辑错误。同时,使用缩进来处理区块使得我们能够轻而易举地看出脚本的结构。
[RenPy] 纯文本查看 复制代码
"这个命令,以及接下来的if命令,属于同一个区块。"

if True:

    "但是这个命令就属于新区块了。"

    "这行也属于新区块。"

"这一行又属于第一个区块了。"


命令的组成部分

Ren'Py的命令由以下一些基本的部分组成。

关键字
关键字是必须出现在源码中的词语。它们用于声明一条命令或者一个属性。

除非有特别声明,否则所有以单个下划线(_)开头的名称,都是仅供Ren'Py内部使用的保留字。当一个名称以 __ 开头但是没有以 __ 结尾时,它仅在该文件范围内有效。

名称
名称都是以字母或者下划线开头,后面可以什么都没有或者接任意的字母、数字和下划线。在Ren'Py中,U+00a0和U+fffd之间的unicode字符都会被认为是字母。

图像名称
一个图像名称由一个或多个名称组成,用空格分开。图像名称的第一个部分被称为图像标签,之后的部分被称为图像属性。

比如说,看看这个图像名称吧。mary beach night happy。图像标签是mary,图像属性是 nightbeach,和 happy

字符串
字符串由引号开始(`,'或者"之一),以相同的引号结束。

反斜杠 (\)用作转义字符,特殊字符例如%(应该写作\%),[(应该写作\[),{(应该写作\{)。同时其也可以用来引入新的一行。

在Ren'Py字符串中,连续的空格会被处理成一个空格字符,除非空格之前有个反斜杠(转义符)。
[RenPy] 纯文本查看 复制代码
'字符串不能包含他们的\'结束引号,除非您使用转义符。'


简单表达式
简单表达式是一条Python表达式,用于在某些脚本里使用Python。一个简单表达式可由以下部分开头:

  • 一个名称

  • 一个字符串

  • 一个数字

  • 任何在括号内的Python语句

其后也可以接着任意数量的以下部分:

  • 一个点(.)后接着一个名称

  • 一个括号内的Python表达式

举个例子,3, (3 + 4), foo.bar, 和 foo(42) 都是简单表达式,但3 + 4 不是,因为上一个表达式在字符串"3"的末尾处就结束了。

at表
一个at表是一个由简单表达式构成的列表,由逗号分隔。

Python表达式
Python表达式指的是任何不含分号的python表达式。用于在if和while命令中作为判断条件。

一般命令语法
大部分Ren'Py命令使用同一套语法。除了say命令以外,它们都由一个关键字作为开头。关键字后面跟着参数(如果这个命令需要有参数输入的话)。

参数后面会跟着一条或者数条属性。属性可以按照任意的顺序给出,只要任何属性只出现一次。对于大部分属性来说,它的值将会是上面列出的语法元素中的一种。

如果命令带一个区块,那么这一行将以冒号(:)结尾。否则,该命令到行尾时就结束了。

Python表达式语法

注意:
目前并无必要完整阅读该部分。您可以考虑先跳过该部分,直到遇到无法看懂的例子,或者想了解到底是怎么一回事的时候,再回来仔细阅读这部分。


Ren'Py的许多部分需要使用python表达式。比如说,定义一个角色将会用到Character函数。虽然Python表达式十分强大,但对于一个简单的Ren'Py游戏来说只需要用到它的一部分。

以下均是python表达式。

整数
整数指的是不包含小数点的数字。 3 和 42 是整数。

浮点数
浮点数指的是含有小数点的数字。 5, 7.和 9.0 都是浮点数。

字符串
python字符串由"或者'(单引和双引号)开始,以相同的引号结束。反斜杠用于转义,以及引入新的一行。与Ren'Py中的字符串不同的是,python字符串不能跨行。

True, False, None
这是三个特别的值。True是“真”值, False 是"假”值, None 表示“无”。

元组
元组用来表示一些元素数量很重要的集合。比如,一个二元元组(又被称为数对)可以用来表示宽和高,一个4元数组可以用来表示一个矩形。

元组以左括号(作为开头,以右括号)结束,由0个或者多个逗号分隔开的python表达式所组成。一个特例是,一元元组必须在它唯一的一个元素后加一个逗号。比如:
  1. ()
  2. (1,)
  3. (1, "#555")
  4. (32, 24, 200, 100)
复制代码

列表
列表相当于可修改的元组。列表以左中括号[作为开头,以右中括号]结束,由一系列由逗号分隔开的值所组成。比如:
  1. [ ]
  2. [ 1 ]
  3. [ 1, 2 ]
  4. [ 1, 2, 3 ]
复制代码

变量
Python表达式可以使用变量。变量的值由define命令或者python表达式确定。变量可以以字母或者下划线作为开头,后面跟着0个或多个字母、数字或者下划线(和名称的规则一致)。比如:
[RenPy] 纯文本查看 复制代码
name
love_love_points
trebuchet2_range

以下划线作为开头的变量是仅供Ren'Py内部使用的保留字,在写脚本的时候要多加注意。

域通道
Python模块和对象都拥有域(fields)的概念,可以使用由.和域名组成的表达式来访问对象的域通道。如:
[RenPy] 纯文本查看 复制代码
config.screen_width

是一个域通道,由一个变量(config)和后面的域名组成。

调用
Python表达式可以调用一个由返回值的函数。它们由一个表达式(通常是一个变量)开头,然后是一个左括号,一些由逗号分隔的参数,一个右括号。参数由位置参数和关键字参数组成。位置参数就是python表达式,关键字参数的格式是“关键字=值”。如:
[RenPy] 纯文本查看 复制代码
Character("Eileen", type=adv, color="#0f0")

这里我们调用了Character这个函数。定义了一个位置参数,字符串"Eileen",以及两个关键字参数: type 是变量 adv 的值;以及字符串"#0f0",它是变量 color 的值。

构造器函数是一种会返回一个对象的函数,调用方法和普通的函数一样。

当阅读本文档时,您可能会遇到下面这样的函数介绍:

Sample(name, delay, position=(0, 0), **properties)
这个函数只是一个例子,实际上在Ren'Py中并没有用到。

对于这个函数:

  • 其名字是"Sample"

  • 有两个位置函数,一个叫做“name”,一个叫做“delay”。在现实中,这些参数的类型会函数文档中有明确的定义。

  • 有一个关键字参数postition,其默认值是(0,0)。

因为这个函数以“**properties”结尾,这意味着它还可以定义样式属性作为其另一个关键字参数。其他特殊的参数名如“**args”,它意味着它可以定义任意数量的位置参数,另外还有“**kwargs”,它意味着可以定义任意在文档描述的关键字参数。

Python的功能远不止我们在这里所展示的这些。如果想了解更多关于Python的知识,我们推荐您学习以下Python教程:python.org 。虽然我们的意思并不是使用Ren'Py的前提条件是需要精通Python,但是多了解一些基础的Python命令和表达式是非常有帮助的。

—————————————————————————— 尾线 ——————————————————————————

上一篇:GUI定制指南                    下一篇:标签和控制流程

--------------------------
有任何意见与反馈
欢迎在 此处 交流
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2018-10-16 11:23 , Processed in 0.030437 second(s), 21 queries , File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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