# 角色
有角色的对话,需要 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!" |
# 图像及其变换
标准图像展示有两种, scene
和 show
- scene:清楚当前界面的所有图像,然后展示该图像
- show:展示图像
显示一个图像时,通常可以使用 at
来决定图像的位置(及变换), at
的标准函数有两个: left
和 right
图像的变换可以使用 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 |
# 音乐和音效
标准声音播放有三种: music
、 sound
、 vioce
。
- music:默认循环播放。
- sound:默认播放一次。
- voice:默认播放一次并且点击就会停止。
可以使用 stop
语句来立即停止音乐。
# 选项与分支
menu
语句能够给玩家提供一个分支选项
使用 jump
、 label
来确定选项对应的不同结果。
可以随时使用 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 显示新界面,或者隐藏旧界面。
# 高级转场
-
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 秒钟后,再使用溶解效果切换至新场景。
-
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),被剪裁和移动的是旧场景。
-
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 之间。