# 角色

有角色的对话,需要 define 一个 Character ,然后调用角色对应的标签才可以运行。

多行对话时,可以使用三引号来区分,然后用回车键来隔开。

define a = Character('alice')
label start:
    a "Hello world!"
    "Hello world!"
    a """
    Hello
    Hello world!
    """

what_ 标签表示对话内容相关的前缀, who_ 标签表示角色名字相关的前缀

what_size 属性可以调整一个角色说话时的文本大小, who_size 表示角色框文字大小。

what_prefix 显示对话内容之前,添加的前缀字符串; what_suffix 显示对话内容之前,添加的后缀字符串; who_prefix 显示角色名字之前,添加的前缀字符串; who_suffix 显示角色名字之前,添加的后缀字符串。

window_background 表示该角色对话内容背景。

who_bold 可以设置角色名字为粗体

outline 可以设置文本外边框,四个参数为:粗细、颜色、x 偏移、y 偏移。

define a = Character('alice', what_size = 24, who_size = 50,window_background="gui/textbox2.png", who_color="#C8FFC8",what_color="#CFC5C8",who_bold = True, what_outlines=[(1,"#000800",1,1)],what_suffix='喵')

ctc 一个用做 “点击继续” 提示的可展现部件,若有其他特殊提示被使用时可能不会展现。

ctc_pause 当文本显示被 {p}{w} 标签 (tag) 暂停时,用作 “点击继续” 提示的一个可视组件。

ctc_timedpause 当文本显示被 {p=}{w=} 标签 (tag) 暂停时,用作 “点击继续” 提示的一个可视组件。当该值为 None 时,会使用 ctc_pause 的值作为默认值。若你想要使用 ctc_pause 而不是 ctc_timedpause ,请使用 Null()

ctc_position 该参数控制 “点击继续” 提示的位置。若值为 "nestled" ,该提示会作为目前展示文本的一部分出现,在最后一个字符显示后立即出现相应提示。若值为 "fixed" ,提示会被直接添加到界面上,其在界面上的位置由位置样式属性控制。

# 定义一个两秒旋转一圈的雪花
image end_pic:
    "snowflake.png"
    size (16, 16)
    block:
        rotate 0
        linear 2.0 rotate 360
        repeat
# 闪烁效果
transform Flashing:
    alpha 0.0
    linear 1.0 alpha 1.0
    linear 1.0 alpha 0.0
    repeat
image download:
    "download.png"
    size(25,25)
    Flashing
define a = Character('alice',ctc="download",ctc_position="nestled")

narrator 默认为旁白

当一个角色与一个图像标签 (tab) 关联,包含对应角色的 say 语句将在角色名和第二个字符串之间就可以插入图像属性 (attribute)。

在这中情况下,如果带有给定标签 (tag) 的某个图片需要显示,Ren’Py 会定位一条包含角色标签 (tag) 和属性 (attribute) 的 show 命令。如果图片未显示,Ren’Py 会保存属性 (attribute) 并用于头像,但依然不会显示图片。

image alice_image a = "alicea.png"
image alice_image b = "aliceb.png"
image alice_image c = "alicec.png"
label start:
    show alice_image a with dissolve
    alice "Hello world!"
    alice c "Hello world!"
    alice b "Hello world!"

# 图像及其变换

标准图像展示有两种, sceneshow

  • scene:清楚当前界面的所有图像,然后展示该图像
  • show:展示图像

显示一个图像时,通常可以使用 at 来决定图像的位置(及变换), at 的标准函数有两个: leftright

图像的变换可以使用 with 属性进行。

隐藏图像通常用 hide

show alicea at left
alice "Hello world!"
hide alicea
#展示 alice 后隐藏 alice

新展示的图像会覆盖到旧图像的上一层。

show adventure
show alicea at left
# alice 在 adventure 上层
alice "Hello world!"
hide alicea
with dissolve
# alice 渐变消失
show alicea at right

图像的基本语法

  • Anchor 锚点的水平坐标,以可视组件左边为坐标零点
  • Pos 水平坐标,以整个区域的左边为坐标零点。
  • Center xpos -> 0.5 xanchor -> 0.5
  • Offset 可视组件在水平方向偏离的像素数。向右偏离时是正数。
  • Align 将 xpos 和 xanchor 设置为相同的值。
  • Zoom 放大倍数。
  • Alpha 透明度,1.0 完全不透明,0.0 完全透明。
  • Rotate 角度
show alice_image a:
    xpos 0.0
    ypos 0.5
    # 人物立绘并非在左边的中间位置,因为还有透明像素
    xcenter 0.5
    ycenter 0.5
    # 人物立绘在中间位置
    xoffset -100
    #立绘整体移动 100 像素
    zoom 2.0
    #放大两倍

图像的变换:

  • Linear 线性变换
  • Ease 缓动函数(慢 -> 快 -> 慢)
  • Easein (慢 -> 快)
  • Easeout (慢 -> 快)
  • Pause 暂停
  • Time 时间后
  • Parallrl /contains 同时运行区块
transform re_left:
    xalign 0.0
    yalign 1.0
    linear 1.0 xalign 1.0 yalign 0.0
    # 图像从左下角移动到右上角
transform re_left——2:
    xalign 0.0
    yalign 1.0
    block:
        linear 1.0 xalign 1.0 yalign 0.0
        linear 1.0 xalign 0.0 yalign 1.0
        repest
transform re_left——3:
    xalign 0.0
    yalign 1.0
    parallel:
        ease 2.5 xalign 0.2 yalign 0.5
        linear 2.5 xalign 0.8 yalign 0.5
        repest
    parallel:
        rotate 0
        linear 3.5 rotate 360
        repest

# 音乐和音效

标准声音播放有三种: musicsoundvioce

  • music:默认循环播放。
  • sound:默认播放一次。
  • voice:默认播放一次并且点击就会停止。

可以使用 stop 语句来立即停止音乐。

# 选项与分支

menu 语句能够给玩家提供一个分支选项

使用 jumplabel 来确定选项对应的不同结果。

可以随时使用 flag 标识来让选项的结果立 flag 作为伏笔,影响之后的游戏进程。

想让 flag 生效,需要使用 if 以及 else 语句,来对 flag 进行回收。

menu:
    alice "这是选项"
    "这是选项 1":
        jump second
    "这是选项 2":
        jump third
label second:
    alice "选项 1"
    return
label second:
    alice "选项 2"
    return

# python 代码

$ 后可以接 python 语句

多行语句使用 python:

define flag = False
label start:
menu:
    alice "这是选项"
    "这是选项 1":
        $ flag = True
        # 等价于
        # python:
        #   flag = True
    "这是选项 2":
        pass
label second:
    if flag == True:
    # if flag:
        alice "选项 1"
    else:
        alice "选项 2"
    return

# 文本标签、转义、内插数据

label start:
    "比如,这是 {b} 粗体 {/b},{i} 斜体 {/i},{s} 删除线 {/s},{u} 下划线{/u}"
    "{a=jump:second}a 标签可以用来超链接 {/a}"
    "{alpha=0.5}alpha 标签表示透明度 {/alpha}"
    "{color=#66CCFF}color 标签可以改变文字颜色 {/color}"
    "{cps=25}cps 标签可以让一段文本速度暂时改变 {/cps}"
    "可以修改一部分文字的 {font=DejaVuSans-Bold.ttf} 字体{/font}"
    "size 标签可以让一段文字的字体 {size=+10} 变大 {/size} 或者 {size=-10} 变小 {/size},以及{size=30} 指定大小{/size}"
    "tag 标签强行插入 {space=30} 一段空白,{vspace=30}vspace 则是插入上下行的空白"
    "p 标签表示行标签 {p} 用于一个对话内换行(需点击两次),{p=1.5}可以设定最长点击时间"
    "w 标签同上 {w} 但是不换行"
    "nw 标签可以在两句话之间加入动画"
    "比如这样 {nw}"
    hide alicea
    show alicec with dissolve
    extend "比如这样就动了"
    "想打百分号的话,需要打两个 %%"
    "\n 表示换行"
    #使用 [] 来引用内插数值
    #例如
    $ flag = False
    "flag=[flag]" #flag = False
    $ flag = True * True
    "flag=[flag]" #flag = 1
label second:
    "你点击了一个文本标签"

# 转场

# 基础转场

  • fade: 0.5 秒时间画面逐渐暗淡至全黑,然后 0.5 秒时间画面从全黑逐渐变亮成新界面。

  • dissolve: 0.5 秒时间,使用溶解效果从旧界面切到新界面。

  • pixellate: 0.5 秒像素化旧场景,并 0.5 秒反向像素化至新场景。

  • move: 通过在图像上移动位置切换场景。

  • moveinright 及: moveinleft, moveintop, moveinbottom

    从界面上对应的边界移入图像,用时 0.5 秒。

  • moveoutright 及: moveoutleft, moveouttop, moveoutbottom

    从界面上对应的边界移出图像,用时 0.5 秒。

  • ease 及: easeinright, easeinleft, easeintop, easeinbottom, easeoutright, easeoutleft, easeouttop, easeoutbottom

    类似于上面的 move 系列转场效果,差别在于 ease 系列基于余弦曲线放缓开始和结束的转场。

  • zoomin: 镜头放大切入图像,耗时 0.5 秒。

  • zoomout: 镜头缩小离开图像,耗时 0.5 秒。

  • zoominout: 先镜头放大切入图像,然后镜头缩小离开图像,耗时 0.5 秒。

  • vpunch: 这种转场效果,会垂直摇晃界面 0.25 秒。

  • hpunch: 这种转场效果,会水平摇晃界面 0.25 秒。

  • blinds: 垂直遮蔽原界面,耗时 1 秒。一个 ImageDissolve () 转场类的实例。

  • squares: 以平面效果转场界面,耗时 1 秒。

  • wipeleft 及: wiperight, wipeup, wipedown

    以指定方向擦除原界面。

  • slideleft 及: slideright, slideup, slidedown

    以指定方向滑入新场景。

  • slideawayleft 及: slideawayright, slideawayup, slideawaydown

    以指定方向滑出旧场景。

  • pushright 及: pushleft, pushtop, pushbottom

    新场景把旧场景从指定的边界推出。

  • irisin 及: irisout

    使用一个矩形 iris 显示新界面,或者隐藏旧界面。

# 高级转场

  1. MultipleTransition(args)

    返回一个转场效果,其是多个转场效果顺序显示之后的集。

    args
    一个包含奇数个物件的列表。列表中奇数序号的物件必须是场景,偶数序号的物件必须是转场效果。这里说的场景可以是如下类别之一:

    • 可视组件。
    • false 值,表示使用旧场景。
    • true 值,表示使用新场景。

    大多数情况下,第一个入参会是 false 而最后一个是 true。

    args 中的转场按顺序执行。对每一个转场效果而言,其前面的参数就是旧场景,其后面的参数就是新场景。举例:

    define logodissolve = MultipleTransition([
        False, Dissolve(0.5),
        "logo.jpg", Pause(1.0),
        "logo.jpg", dissolve,
        True])

    这个例子中,首先会使用溶解效果切换到 logo.jpg 文件,等待 1 秒钟后,再使用溶解效果切换至新场景。

  2. CropMove(time, mode="slideright", startcrop=(0.0, 0.0, 0.0, 1.0), startpos=(0.0, 0.0), endcrop=(0.0, 0.0, 1.0, 1.0), endpos=(0.0, 0.0), topnew=True)

    返回一个转场效果,其会剪裁一个场景并将其放置在界面中指定位置。其可以模板化处理一堆效果,这些效果的共通点是将界面分割成矩形条 (slice)。

    • time 转场效果耗时。
    • mode 转场模式名。转场模式总共有 3 大类:wipes、slides、其他。也可以是 “custom”,是一个用户自己定义的模式。

    在 wipe 模式下,原图像先保持不变,然后逐渐使用转场效果全部擦除。例如,在 “wiperight” 模式下,一个刷子会从左到右擦除原图像,即先擦除界面最左边的图像,接着擦除界面中间,最后擦除界面最右边。其他的 wipe 包括 “wipeleft”、“wipedown” 和 “wipeup”。

    在 slide 模式下,图像会移动。在 “slideright” 模式下,图像的右边从界面的左边开始,平移至界面右边,完成整个转场过程。其他 slide 模式包括 “slideleft”、“slidedown” 和 “slideup”。

    还有 slideaway 模式,这个模式下原图像在新图像上层,平移出界面。slideaway 模式包括 “slideawayright”、“slideawayleft”、“slideawayup” 和 “slideawaydown”。

    我们还支持矩形 iris,包括 “irisin” 和 “irisout”。

    下列参数值在模式为 “custom” 的情况下才会使用。位置信息与界面尺寸相关,剪裁大小与图像尺寸相关。一个 (0.25, 0.0, 0.5, 1.0) 的剪裁会使用某个图像的中间一小块。

    • startcrop : 顶层图像的剪裁起始矩形。一个 4 元素的元组,包含 x、y、width 和 height。
    • startpos : 顶层图像绘制在界面上起始坐标。一个 2 元素的元组,包含 x 和 y。
    • endcrop : 顶层图像的剪裁结束矩形。一个 4 元素的元组,包含 x、y、width 和 height。
    • endpos : 顶层图像绘制在界面上结束坐标。一个 2 元素的元组,包含 x 和 y。
    • topnew : 若该值为真 (true),被剪裁和移动的是新场景。若该值为假 (false),被剪裁和移动的是旧场景。
  3. ImageDissolve(image, time, ramplen=8, reverse=False, alpha=True, time_warp=None)

    返回一个转场效果,其使用溶解特效切换新旧界面,并利用某个图像控制溶解过程。这意味着纯白的像素首先被溶解,而纯黑的像素最后溶解。

    • image 使用的控制图像。其必须是一个图片文件或者图像控制器。控制图像需要与待溶解场景的尺寸一致。
    • time 溶解效果持续时间。
    • ramplen 色彩蔓延 (ramp) 步长。其必须是一个 2 的整次幂。默认值是 8,当纯白像素全部溶解之后,下一步溶解的像素是在灰度上比纯白色低 8 度的颜色。
    • reverse 若该值为真 (true),黑色像素反而先于白色像素溶解。
    • alpha 若该值为真 (true),溶解效果会使用 alpha 通道。若该值为假 (false),直接替换原界面,这样效率比较高。
    • time_warp 一个调整时间线的功能函数。若不为空值 (None),其应该是一个使用 0.0 至 1.0 之间的小数作为输入的函数,返回结果也是 0.0 至 1.0 之间。