学习来源

自定义开场画面 1
自定义界面
SDK 版本 7.1.2

脚本标签 label

特殊 label 标签
脚本标签 label 可以用在任何 rpy 脚本文件中,可以理解为某一段脚本的索引
新建工程会生成一个 start 的 label,在主菜单点击启动或开始后,就会从 start 开始顺序执行脚本

可用标签

这个场景下可以使用的标签有三个

  • splashscreen
  • before_main_menu
  • main_menu

在开头先把文本标签写上

1
2
3
4
5
6
7
8
9
10
11
# 开场画面
label splashscreen:
pass

# 主菜单之前
label before_main_menu:
pass

# 主菜单
label main_menu:
pass

在 script.rpy 中添加这些文本标签后会发现,开头的主菜单(main menu)被跳过了

在主菜单前显示一个 logo

将需要显示的 logo 图片放在工程目录中的 images 子目录下,
然后重命名为 logo.png(文件名不能用中文),
修改 splashscreen 标签

1
2
3
4
label splashscreen:
show logo at truecenter with Dissolve(2.0)
pause 1.0
hide logo width Dissolve(2.0)

show 语句带两个分句来调整位置和使用转场(transition)
pause 语句暂停整个画面 1 秒
hide 语句使用转场(transition)让 logo 消失

logo 背景色

如上方法显示 logo,背景是黑色的
如果需要白色或者其他图片作为背景的话,先定义图像(image),
使用 scene 和 show 语句顺序显示就可以了

1
2
3
4
5
6
7
8
9
10
# 开场logo
image pure_black = "#000"
image pure_white = "#fff"

label splashscreen:
scene pure_black
show pure_white with Dissolve(2.0)
show logo at truecenter with Dissolve(2.0)
pause 1.0
hide logo with Dissolve(2.0)

这里使用了两个图像(image),采用的是 RGB 纯色
也可以使用图片文件替换
如果需要展示多个 logo,可以按顺序使用 show 和 hide 语句

logo 不可点击跳过

使用 renpy.pause 函数可以做到…
在每一个不想被跳过的 sence,show,hide 语句后面都加上一句

1
$ renpy.pause(1, hard=True)

$表示后面是一个 python 函数,
入参数字 1 表示持续时间为 1 秒,
hard=True 表示鼠标点击不能打断暂停

官方对 hard=True 的使用建议是:Use this sparingly, as it’s hard to distinguish a hard pause from a crashing game(谨慎使用,因为很难区分硬性暂停和程序卡死)。

在开头播放视频

假设要播放的视频文件为“opening.webm”,将它放入另一个特殊脚本标签中:

1
2
label before_main_menu:
$ renpy.movie_cutscene("opening.webm")

使用 before_main_menu 可以将视频做成主菜单的背景循环播放
有一个缺点,renpy 的编码格式比较有限

自定义一个“点击开始”的界面

参考文档:
界面(screen)
可视组件(imagemap)
变换(transform)和转场(transition)

在显示完 logo 和开场动画之后,很多游戏会出现一个特殊画面,画面显示“点击 xxx 键开始”
用户使用鼠标或者其他设备点击之后,可能会出现主菜单,也可能会进入某个序章剧情

思路

  • 自定义一个界面,完成显示和菜单功能
  • 修改原来的 main_menu 界面
    这里选用前者,原因是——修改别人的代码比较烦人……

自定义一个界面(screen)

1
2
3
#自定义界面(screen)
screen press_to_start():
pass

习惯上,一般都会将界面(screen)放在 screens.rpy 中,或者新建一个 rpy 文件专门写自定义界面

接着是在界面上添加图像(image)
这里要添加的图片有两个: “点击继续”和“背景图”
当然,点击继续也可以使用文字
先在工程目录的 images 里新建一个子目录 menu
放入两张图片,background.png 和 press_to_start.png
自定义界面:

1
2
3
4
5
6
7
screen press_to_start():
# 这步确保任何其他界面都会被替换
tag menu
# 背景图的尺寸正好跟窗口尺寸是一样的,所以不需要做调整。
add 'menu/background.png'
# “点击继续”的图片放在水平正中垂直方向偏下的地方。
add 'menu/press_to_start.png' xalign 0.5 yalign 0.7

显示自定义界面

在 scripts.rpy 中使用 before_main_menu

1
2
3
4
# scripts.rpy
label before_main_menu:
call screen press_to_start with Dissolve(3)
with Fade(3, 3, 3, color="#000")

效果:

让“点击开始”闪烁起来

使用变换(transform)

1
2
3
4
5
6
7
8
9
10
11
# 自定义的图片闪烁变换
transform transform_blink:
linear 1.0 alpha 0.2
linear 1.0 alpha 1.0
repeat

# 自定义界面的部分
screen press_to_start():
tag menu
add 'menu/background.png'
add 'menu/press_to_start.png' xalign 0.5 yalign 0.7 at transform_blink

点击继续按钮的功能

为了实现继续的功能,需要进入一个全屏的热点(hotspot):

1
2
3
4
5
6
7
8
9
10
screen press_to_start():
tag menu
add "menu/background.png"
add "menu/press_to_start.png" xalign 0.5 yalign 0.7 at transform_blink

imagemap:
# transparen.png是一张透明的图片
# 点击时会执行一系列Action函数
ground 'menu/transparent.png'
hotspot (0, 0, 1280, 720) focus_mask None action (Play('sound', 'sound/start.wav'), Return())

为了偷懒,最后使用了 Return()函数回到了主控流程,也就是自动引入 main_menu 界面
如果想在这个画面中直接显示定义菜单的话,可以隐藏点击继续的图片并显示菜单
也可以用 call 函数调用一个完整的自定义菜单界面

最后再加一个点击开始界面等待一段时间后播放一段视频,或者其他画面的方法
比如,我们想再 press_to_start 界面 30 秒没有点击的情况下播放一段视频,再回到 press_to_start 界面
可以这样处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# scripts.rpy
label before_main_menu:
$ renpy.movie_cutscene('videos/opening.webm')
call screen press_to_start with Dissolve(3)
with Fade(3, 3, 3, color="#000")

# 自定义界面部分(screen)
screen press_to_start():
tag menu
add "menu/background.png"
add "menu/press_to_start.png" xalign 0.5 yalign 0.7 at transform_blink

imagemap:
ground 'menu/transparent.png'
hotspot (0, 0, 1280, 720) focus_mask None action(Play('sound', 'sound/start.wav'), Return())

timer 30 action Jump('before_main_menu')