马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 natsuri 于 2024-12-1 19:53 编辑
先贴个源代码,下面会说明debug过程。
[RenPy] 纯文本查看 复制代码 init python:
if not hasattr(persistent, '_character_volume'):
persistent._character_volume = {}
if 'character1' not in persistent._character_volume:
persistent._character_volume['character1'] = 1.0
def set_music_volume(vol):
persistent._music_volume = vol
preferences.set_volume("music",vol)
renpy.restart_interaction()
default persistent._music_volume = 1.0
screen settings():
hbox:
spacing 20
label "音乐"
bar adjustment ui.adjustment(range=1.0,value=persistent._music_volume,adjustable=True,step=0.1,changed=set_music_volume,force_step=True) xsize 400
text "{:.0f}".format(persistent._music_volume*10)
textbutton "静音" action Preference("music mute","toggle")
hbox:
spacing 20
label "角色1"
bar value DictValue(persistent._character_volume,"character1",1.0,step=0.1,force_step=True) xsize 400
text "{:.0f}".format(persistent._character_volume["character1"]*10)
textbutton "静音" action ToggleVoiceMute("character1")
原生的声音BarValue类不支持修改step,我英语不太好,GPT的帮助下,在Lemmasoft找到了两个参考帖子。
参考1https://lemmasoft.renai.us/forums/viewtopic.php?p=556038
参考2https://lemmasoft.renai.us/forums/viewtopic.php?t=31660
两个帖子都使用了adjustment对象
中文文档:adjustment对象表示可以通过某个条(bar)或视口(viewport)调整的值。adjustment对象包括值的信息,值的范围,以及修改这个对象使用的最小步长和最大页面(page)。
下列参数分别对应adjustment对象的字段(field)或者特性(property)。 简单来说,adjustment对象能接受某个条或视口调整的值,它本身不会修改任何值。且它本身可以当作一个无法调用的临时变量。 例如:ui.adjustment(range=1.0,value=persistent._music_volume,adjustable=True,step=0.1,changed=set_music_volume,force_step=True) range最大值,value条初始化时调整为这个值,adjustment若为True条可以修改adjustment对象,step步进 changed将自身值传给“X”python函数并执行,所以我们可以使用python函数更新变量和preferences force_step若为True最终结果会调整为最接近的某个步进值False忽略step
为什么不使用VariableValue并执行action?这个不能做到实时执行action,它会在下一次交互中更新而不是本次交互!
在参考1我复制了帖子提供的代码并修改了一下。
[RenPy] 纯文本查看 复制代码 init python:
def set_music_volume(vol):
persistent._music_volume = vol
preferences.set_volume("music",vol)
screen settings():
tag menu
hbox:
spacing 20
label "音乐"
bar adjustment ui.adjustment(range=1.0,value=persistent._music_volume,adjustable=True,step=0.1,changed=set_music_volume,force_step=True) xsize 400
text "{:.0f}".format(persistent._music_volume*10)
textbutton "静音" action Preference("music mute","toggle")
我发现显示的变量值它不会实时更新!群友推荐我使用renpy.restart_interaction()
中文文档:重新启动当前交互行为。包括以下内容,将显示的图像添加到场景(scene),重新规划界面(screen),并启动所有队列中的转场(transition)。 仅在某个交互行为中,该函数才会执行所有工作。交互行为之外,该函数不产生任何效果。 在自定义的python的末尾加上就完全解决了。
接下来是关于voice_tag相关。
根据参考2和反复琢磨得到,voice_tag的volume值储存在字典persistent._character_volume。 我们可以使用bar value DictValue()来修改字典的值。它会直接更新voice_tag音量 但需要自行创建一下persistent._character_volume字典,不然会报错找不到字典与其key。 default不能创建和修改字典,需要使用python块。
[RenPy] 纯文本查看 复制代码
if not hasattr(persistent, '_character_volume'):
persistent._character_volume = {} ##判断字典存不存在,不存在则创建
if 'character1' not in persistent._character_volume:
persistent._character_volume['character1'] = 1.0 #判断字典的key存不存在,不存在创建key并赐值。
|