找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 225|回复: 0

[经验] 关于音量条和角色音量条控制精度(step步进)和相关问题

[复制链接]
发表于 2024-12-1 19:53:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 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并赐值。












您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|RenPy中文空间 ( 苏ICP备17067825号|苏公网安备 32092302000068号 )

GMT+8, 2025-1-7 16:43 , Processed in 0.111491 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表