Ren'py 系统设置界面修改(三)
本文修改全部位于screens.rpy
文件中
参考资料
视频教程
常规音量设置
新建界面
先新建一个界面,添加必要部分,参考代码如下
1 | screen sound(): |
功能选项
全部音量
添加如下代码
1 | vbox: |
音乐音量
添加如下代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19vbox:
spacing 10
hbox:
spacing 10
add "label.png"
text "BGM音量" color "#4e021f"
vbox:
hbox:
spacing 20
bar:
value Preference("music volume")
xsize 425
right_bar "volume.png"
left_bar "volume_left.png"
thumb "thu.png"
frame:
background "volume_num.png"
$ music_volume = int(preferences.get_mixer("music")*100)
text "[music_volume]" xoffset 10 yoffset -8
音效音量
添加如下代码
1 | vbox: |
播放语音时BGM音量
定义
1
2
3
4
5
6
7
8## 播放语音时降低bgm音量
default preferences.emphasize_audio = True
## 只能使用define
define config.emphasize_audio_channels = [ 'voice' ]
define config.emphasize_audio_time = 0.5
define config.emphasize_audio_volume = 0.5
## 自定义变量解决上面问题
default voicing_bgm_volume = 0.5设置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20vbox:
spacing 10
hbox:
spacing 10
add "label.png"
text "播放语音时BGM音量" color "#4e021f"
vbox:
hbox:
spacing 20
bar:
value VariableValue("voicing_bgm_volume",range=1.0)
xsize 425
right_bar "volume.png"
left_bar "volume_left.png"
thumb "thu.png"
frame:
background "volume_num.png"
$ config.emphasize_audio_volume = voicing_bgm_volume
$ text_voicing_bgm_volume = int(voicing_bgm_volume*100)
text "[text_voicing_bgm_volume]" xoffset 10 yoffset -8
显示BGM名称
定义
1
2
3
4## 显示歌曲名称
default music_name_always = True
default music_name_five_seconds = False
default music_name_never = False新建界面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54## 音乐弹窗
default bgm_name=" "
screen music_name():
## 获取当前正在播放的BGM
$ music_file_name=renpy.music.get_playing(channel = 'music')
## 确保显示为正确的文件名
timer 0.01:
action SetVariable("music_file_name",renpy.music.get_playing(channel = 'music'))
repeat True
## 将文件名替换为歌曲名
if music_file_name == "bgm22.ogg":
$ bgm_name = "红茶与布丁"
elif music_file_name == "bgm12.ogg":
$ bgm_name = "星空下的芭芭露"
## 总是显示
if music_name_always:
if renpy.music.is_playing(channel = 'music'):
frame:
at music_name_always_appear
background "music_name_bg.png"
text "[bgm_name]":
xoffset 80
yoffset 10
## 显示五秒
elif music_name_five_seconds:
if renpy.music.is_playing(channel = 'music'):
frame:
at music_name_five_seconds_appear
background "music_name_bg.png"
text "[bgm_name]":
xoffset 80
yoffset 10
## 不显示
else:
pass
## 总是显示
transform music_name_always_appear:
xoffset -600
easein 1.0 xoffset 0
## 显示五秒
transform music_name_five_seconds_appear:
xoffset -600
easein 1.0 xoffset 0
pause 5.0
easeout 1.0 xoffset -600设置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48vbox:
spacing 10
hbox:
spacing 10
add "label.png"
text "显示歌曲名称" color "#4e021f"
vbox:
hbox:
spacing 20
## 总是显示
if music_name_always:
imagebutton:
idle "music_name_always_hover.png"
action [SetVariable("music_name_always", True),SetVariable("music_name_five_seconds", False),SetVariable("music_name_never", False)]
imagebutton:
idle "music_name_five_seconds.png"
hover "music_name_five_seconds_hover.png"
action [SetVariable("music_name_always", False),SetVariable("music_name_five_seconds", True),SetVariable("music_name_never", False)]
imagebutton:
idle "music_name_never.png"
hover "music_name_never_hover.png"
action [SetVariable("music_name_always", False),SetVariable("music_name_five_seconds", False),SetVariable("music_name_never",True )]
## 显示五秒
elif music_name_five_seconds:
imagebutton:
idle "music_name_always.png"
hover "music_name_always_hover.png"
action [SetVariable("music_name_always", True),SetVariable("music_name_five_seconds", False),SetVariable("music_name_never", False)]
imagebutton:
idle "music_name_five_seconds_hover.png"
action [SetVariable("music_name_always", False),SetVariable("music_name_five_seconds", True),SetVariable("music_name_never", False)]
imagebutton:
idle "music_name_never.png"
hover "music_name_never_hover.png"
action [SetVariable("music_name_always", False),SetVariable("music_name_five_seconds", False),SetVariable("music_name_never",True )]
## 不显示
else:
imagebutton:
idle "music_name_always.png"
hover "music_name_always_hover.png"
action [SetVariable("music_name_always", True),SetVariable("music_name_five_seconds", False),SetVariable("music_name_never", False)]
imagebutton:
idle "music_name_five_seconds.png"
hover "music_name_five_seconds_hover.png"
action [SetVariable("music_name_always", False),SetVariable("music_name_five_seconds", True),SetVariable("music_name_never", False)]
imagebutton:
idle "music_name_never_hover.png"
action [SetVariable("music_name_always", False),SetVariable("music_name_five_seconds", False),SetVariable("music_name_never",True )]使用方法
每次播放音乐时展示该界面,停止播放音乐时隐藏该界面,添加pause
语句增强视觉体验效果1
2
3
4
5
6
7stop music
hide screen music_name
pause 0.5
play music "bgm22.ogg"
show screen music_name开发日志
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31## 日志
## 2024.11.23
## 尝试使用 config.overlay_screens.append("music_name") 显示该界面
## 结果 1. 总是显示切换bgm时歌曲信息会直接覆盖,需要隐藏或回退
## 2. 显示五秒只会显示第一次播放的bgm,后续切换bgm无法显示
## 3. 历史记录跳转等情况下,歌曲信息更新不及时
##
## 尝试直接在 say 界面运行
## 结果 每次点击都会重新运行
##
## 尝试使用自定义变量对比当前正在播放的音乐文件名
## 结果 获取值为固定值
##
## 尝试定义不同的界面实现不同的设置
## 结果 无法获取 music_file_name
##
## 本质问题 切换 bgm 时需要重新运行该界面,但 renpy 并没有提供切换音乐相关说明
##
## 2024.11.27
## 放弃使用函数、变量等,直接在 play/stop music 后添加 show/hide screen music_name
## 结果 除切换 bgm 展示该界面时会与前一个叠加外,效果意外不错,添加 pause 语句设置为 0.5 达到理想效果
##
## 继续尝试添加 on "hide" 语句,发生报错,无法与 pause 语句一同使用
## 尝试将 pause 语句加入 transform 语句中,表现效果不佳,放弃使用 on "hide" 语句
##
## 最终解决方法 1. 尝试添加 timer 语句,控制为 0.01 解决歌曲信息更新不及时问题
## 2. 每次播放 bgm 时显示该界面,停止播放时隐藏该界面,同时暂停0.5s
##
## 测试 除需要每次使用 play/stop music 时要添加额外语句外,暂未发现问题
## 新游戏,读档,历史记录跳转,更改该界面相关设置等行为会重新显示该界面,
## 其他情况下保持不变,同一 bgm 下保留音乐播放进度
角色音量设置
新建界面
先新建一个界面,添加必要部分,参考代码如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52screen voice:
tag menu
add "preference_bg.png"
## 子菜单
hbox:
pos(260,40)
spacing 30
imagebutton:
idle "system.png"
hover "hover_system.png"
action ShowMenu('preferences')
imagebutton:
idle "message.png"
hover "hover_message.png"
action ShowMenu('message')
imagebutton:
idle "sound.png"
hover "sound_hover.png"
action ShowMenu('sound')
hbox:
pos(1260,40)
spacing 30
imagebutton:
idle "dialog.png"
hover "dialog_hover.png"
action ShowMenu('dialog')
imagebutton:
idle "voi_hover.png"
action ShowMenu('voice')
imagebutton:
idle "shortcut.png"
hover "shortcut_hover.png"
action ShowMenu('shortcut')
## 返回按钮
hbox:
align (1.0,1.0)
xoffset -50
yoffset -50
spacing 20
if not main_menu:
imagebutton:
idle "return_title.png"
hover "return_title_hover.png"
action MainMenu()
imagebutton:
idle "end_game.png"
hover "end_game_hover.png"
action Quit()
imagebutton:
idle "return_game.png"
hover "return_game_hover.png"
action Return()
功能选项
语音音量
添加如下代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19vbox:
spacing 10
hbox:
spacing 10
add "label.png"
text "主音量" color "#4e021f"
vbox:
hbox:
spacing 20
bar:
value Preference("voice volume",range=100)
xsize 425
right_bar "volume.png"
left_bar "volume_left.png"
thumb "thu.png"
frame:
background "volume_num.png"
$ voice_volume=int(preferences.get_mixer("voice")*100)
text "[voice_volume]" xoffset 10 yoffset -8
单独角色音量
添加如下代码
- 定义
1
2
3
4
5
6
7
8
9
10
11init python:
## 判断字典存不存在,不存在则创建
if not hasattr(persistent, '_character_volume'):
persistent._character_volume = {}
## 判断字典的 key 存不存在,不存在创建 key 并赐值
if 'bingzhi' not in persistent._character_volume:
persistent._character_volume['bingzhi'] = 1.0
if 'yaliu' not in persistent._character_volume:
persistent._character_volume['yaliu'] = 1.0 - 设置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19vbox:
spacing 10
hbox:
spacing 10
add "label.png"
text "圣代桥冰织" color "#4e021f"
vbox:
hbox:
spacing 20
bar:
value DictValue(dict=persistent._character_volume ,key="bingzhi", range=1.0)
xsize 425
right_bar "volume.png"
left_bar "volume_left.png"
thumb "thu.png"
frame:
background "volume_num.png"
$ bz_voice_volume = int(GetCharacterVolume("bingzhi")*100)
text "[bz_voice_volume]" xoffset 10 yoffset -8
单独角色静音
- 定义
Ren’py中没有返回voice_tag
相关混音器状态的函数,但默认都是启用的,使用自定义变量达到相同效果1
2
3default bz_mute = False
default yl_mute = False
default others_mute = False - 设置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20hbox:
spacing 10
## 静音
if bz_mute:
imagebutton:
idle "hover_on.png"
hover "on.png"
action [SetVoiceMute(voice_tag="bingzhi", mute=False),SetVariable("bz_mute", False)]
imagebutton:
idle "off.png"
action [SetVoiceMute(voice_tag="bingzhi", mute=True),SetVariable("bz_mute", True)]
## 正常情况下
else:
imagebutton:
idle "on.png"
action [SetVoiceMute(voice_tag="bingzhi", mute=False),SetVariable("bz_mute", False)]
imagebutton:
idle "hover_off.png"
hover "off.png"
action [SetVoiceMute(voice_tag="bingzhi", mute=True),SetVariable("bz_mute", True)]
题外话
按钮可以使用如下属性
- 使用
hover_sound
可以在悬停时播放音效 - 使用
activate_sound
可以在点击时播放音效(系统语音的本质,不过是随机或是指定的) - 使用
mouse
可以更改悬停在其上时鼠标光标样式