This page is out of date

You've reached a page on the Ren'Py wiki. Due to massive spam, the wiki hasn't been updated in over 5 years, and much of the information here is very out of date. We've kept it because some of it is of historic interest, but all the information relevant to modern versions of Ren'Py has been moved elsewhere.

Some places to look are:

Please do not create new links to this page.


文本(Text)

这一部分讲述Ren'Py中的文本概念。 首先讲讲插值(interpolation)功能,在say和menu语句中会用到这项功能,它的作用就是用值来代替文本。 接下来就是文本标签,它用来改变文本的样式。 最后来讲Ren'Py怎样处理字体。

插值(Interpolation)

Say和menu语句都支持插值。 这些语句在所有储存内容中都支持python字串的插值。 语句所使用的字符串支持`%(variable)s`这种形式的转义符(conversion)。在这里,variable是变量名,而s则是转义符。 用的上的转义符有这几个:s,插值为字符串;d,插值为整数;f,插值为浮点。 转义符也可以包括字母,用来修改怎样转换字符串。 关于转义符更多的信息参见这里。Python string formatting operations reference

在支持插值的字符串中,如果要显示百分号%,必须打两个,像这样%%,以防止它们被解析为插值。

$ name = 'Samantha'
$ age = 19
$ withyou = 110
"girl" "我叫 %(name)s, 我今年 %(age)d 岁。 对你的好感为 %(withyou)d%%"

当插值不被支持时,该效果就以将字符串格式化为和调用globals()函数相反的结果而结束。

ui.text("%(name)s's Vital Statistics" % globals())

插值之后跟着就是文本标签进程(Text tag processing),所以要务必确保插值没有以文本标签打头。

文本标签(Text Tags)

Ren'Py中显示的文本支持文本标签(text tag)。 尽管样式(styles)是应用到整个文本,不过显示在屏幕上的部分都是可以自定义的。 由于文本标签是文本显示体(Text displayable)的一部分,所以只要是在屏幕上显示的字符串都可使用。 不过,有一部分文本标签只在适当的上下文中才有效果。

文本标签的使用要尽量低调。 如果你在游戏的每一句台词都用上文本标签,那显然就滥用了。 Investigate text styles as a possible alternative to text tags.

文本标签必须在大括号之间{}。 跟在左括号之后的是标签名称。 名称之后可能会带一个用等号=分隔的参数。 有些标签需要参数,而有些则不。 注意:文本标签对大小写和空格敏感。

有些标签需要相应的结束标签。 结束标签是指以斜线/开始的文本标签。 结束标签的位置要注意一下: "{b}{i}这样是正确的。{/i}{/b}",而"{b}{i}这样是错误的。{/b}{/i}". 不正确的位置为导致不正确的显示。 在标签和结束标签之间的文本称为封装文本(enclosed text)。 在字符串中,所有的标签都必须是封闭的。

要在文本中显示大括号则必须打两个,像这样{{。

Ren'Py支持如下的文本标签:

当点击一个超链接时,含有超链接参数的文本将调用在中定义的callback函数。 这时,缺省的超链接处理器(hyperlink handler)将参数解析成标签,然后在一个新的上下文中调用这个标签。 在需要说明一个不常见的术语时,这是不错的方法。 通常而言,超链接不应该作为一控制流工具,因为当你点击时它会把控制权传递给一个新的上下文。 如果玩家在新的上下文中存盘,当取盘时游戏会从前面的超链接那里开始。

init:
    $ definition = Character(None, window_yfill=True, window_xmargin=20, 
                             window_ymargin=20, window_background=Solid((0, 0, 0, 192)))

label start:

    "一个教你如何制作游戏的游戏?这不是有点{a=define_quine}Quine{/a}吗?"

    # ...

label define_quine:

    definition "Quine:\n\n一种将其本身当做输出的程序。"

    return

下面的例子是一个使用了很多文本标签的说语句。 在是一个高品质的游戏中不推荐使用这么多文本标签。

"使用这些文本标签,我们能让文本{size=+12}变大{/size}或是
{size=-8}变小{/size}。它可以是{b}粗体{/b},{i}斜体{/i},
或是{u}带下划线{/u}。我们还能改变文本的{color=#f88}颜色{/color}。"

字体和S字体(Fonts and SFonts)

试图以字体名称,粗体、斜体、带下划线与否及大小等信息来查找合适的字体。 这些信息由显示体的样式属性(style properties)提供,而且可以文本标签(text tag)修改。 Ren'Py用下面的运算法则将这些转化和一个个的字。

在中查找(名称,粗体,斜体)三元组。 如果存在,将建立一个对应名称,粗体,斜体的三元组映射。 这种查找不会递归(recursive),所以只查找一次。 该查找允许使用指定的粗体或斜体形态。

加载的True Type字体会自动调整大小及下划线以适合需要。 如果你没有提供粗体和斜体的字体映射,程序会在必要时自动加粗或倾斜。

为了得到最好的效果,字体应该选用True Type,并且放置于game目录之下。 这样的话就确保能在玩家的系统上正确地显示字体。

S字体(SFonts)

Ren'Py可以像使用True Type字体一样用S字体来渲染文本。 S字体是一个图像文件,通常是PNG格式,上面是字体的图像。 Ren'Py可以运行任何一个支持统一码字符集(unicode character set)和间距(kerning)的S字体。

S字体有优势也有劣势。 优势之一是S字体基于位图,这意味着可以轻松地的创建自定义字体及找到免费的样例。(相对而言,高质量的True Type字体基本上都不允许再发布。) 同时,因为S字体是图像,它可以应用Ren'Py不支持的效果。 S字体不利的一面在于Ren'Py不会渲染它们,只是简单地将它们复制。 基于此,你需要提供给Ren'Py其他的图片,如果你的字体需要放缩,粗体,斜体或下划线效果。 Ren'Py会对S字体重取色,会用白色映射原本的颜色,其它颜色按通道接通道的原理进行插值。

S字体的更多信息参见这里1

要使用S字体,首先要用函数进行注册。 然后设置S字体的样式属性。 这是缺省的S字体的字符集:

! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? 
@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ 
` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~

注意:你必须分别注册游戏中会用到的S字体的每一种组合,如粗斜体,斜体加下划线等。

在创建S字体时使用了有版权的字体的轮廓所产生的法律问题在这里讨论Bitmap Fonts and Copyright