本文修改全部位于screens.rpy文件中

参考资料

  1. 角色音量
  2. 播放语音时BGM音量
  3. 非线性问题解决

视频教程

常规音量设置

新建界面

先新建一个界面,添加必要部分,参考代码如下

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
screen sound():
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_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.png"
hover "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
19
vbox:
spacing 10
hbox:
spacing 10
add "label.png"
text "主音量" color "#4e021f"
vbox:
hbox:
spacing 20
bar:
value Preference("main volume",range=100)
xsize 425
right_bar "volume.png"
left_bar "volume_left.png"
thumb "thu.png"
frame:
background "volume_num.png"
$ main_volume = int(preferences.get_mixer("main")*100)
text "[main_volume]" xoffset 10 yoffset -8

音乐音量

添加如下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
vbox:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
vbox:
spacing 10
hbox:
spacing 10
add "label.png"
text "音效音量" color "#4e021f"
vbox:
hbox:
spacing 20
bar:
value Preference("sound volume")
xsize 425
right_bar "volume.png"
left_bar "volume_left.png"
thumb "thu.png"
frame:
background "volume_num.png"
$ sound_volume = int(preferences.get_mixer("sfx")*100)
text "[sound_volume]" xoffset 10 yoffset -8

播放语音时BGM音量

  1. 定义

    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
  2. 设置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    vbox:
    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. 定义

    1
    2
    3
    4
    ## 显示歌曲名称
    default music_name_always = True
    default music_name_five_seconds = False
    default music_name_never = False
  2. 新建界面

    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
  3. 设置

    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
    vbox:
    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 )]
  4. 使用方法
    每次播放音乐时展示该界面,停止播放音乐时隐藏该界面,添加pause语句增强视觉体验效果

    1
    2
    3
    4
    5
    6
    7
    stop music
    hide screen music_name
    pause 0.5

    play music "bgm22.ogg"
    show screen music_name

  5. 开发日志

    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
52
screen 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
19
vbox:
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. 定义
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    init 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
  2. 设置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    vbox:
    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

单独角色静音

  1. 定义
    Ren’py中没有返回voice_tag相关混音器状态的函数,但默认都是启用的,使用自定义变量达到相同效果
    1
    2
    3
    default bz_mute = False
    default yl_mute = False
    default others_mute = False
  2. 设置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    hbox:
    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)]

题外话

按钮可以使用如下属性

  1. 使用hover_sound可以在悬停时播放音效
  2. 使用activate_sound可以在点击时播放音效(系统语音的本质,不过是随机或是指定的)
  3. 使用mouse可以更改悬停在其上时鼠标光标样式