找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 387|回复: 10

[求助] 如何设置自动前进模式下对话之间的间隔时间?

[复制链接]
发表于 2023-5-21 15:00:16 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 Ca清 于 2023-5-21 15:03 编辑

需要:在设置界面内添加按钮,将自动前进模式下对话之间的间隔时间设为某个值,不根据文本的长度调整




我想在自动前进模式下,让每段对话之间有一个固定的间隔时间,而不是根据文本的长度来调整。
Renpy游戏自有的“自动前进时间”设置,会根据一段文字文本的多少而改变,虽然很人性化,但我想换掉啊啊啊。
变量“preferences.afm_time”也遵循游戏内自有的变换公式,也就是说游戏内的“Preference("auto-forward time")”和“preferences.afm_time”都是依据文本数决定间隔时间的,使得对话间的间隔不固定。
我想让每段对话的等待时间都是固定的,不管文本有多长,有没有什么办法可以实现?

发表于 2023-5-21 19:00:07 | 显示全部楼层
本帖最后由 Lost 于 2023-5-21 19:01 编辑

你知道吗,有个功能叫做 skip (slow skip):无视对话、语音、音效等是否播放完毕,定时触发下一句,`config.skip_delay` 可以控制慢快进速度

不过不好的地方在于利用的是内置的快进,导致快进指示文字出现、快进按钮激活、在此基础上触发原先的快进有点逻辑混乱……

另一个思路是开个定时器来定时触发下一句,这个不难但是要考虑到各种情况也挺麻烦(

再来个思路就是直接改 `afm_delay` 的计算逻辑,强行给固定值,这个要改 `renpy.display.behavior.SayBehavior.event` 实例方法,简单来说就是魔改 renpy,最好在游戏独立打包后再改(
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2023-5-22 22:47:02 | 显示全部楼层
Lost 发表于 2023-5-21 19:00
你知道吗,有个功能叫做 skip (slow skip):无视对话、语音、音效等是否播放完毕,定时触发下一句,`config ...

对应1,2行,就是想用auto,skip不改动,并且也不是这样的定时播放

对应3行,有考虑过每段对话后都跟一个pause,但那样根本做不到,不管是理论还是实践上的

对应4行,能做到像环境变量一样吗?用在游戏中,可设置

其实我就希望renpy有控制这个的环境变量,甚至我觉得有点不可思议,自动前进竟然不能设定间隔时间?!
回复 支持 抱歉

使用道具 举报

发表于 2023-5-22 23:50:09 | 显示全部楼层
自动要求游戏对话、语音正常播放完毕才会进下一句,所以每一句的停留时间肯定不一样,你想要的是什么效果呢,如果设定时间到了却没有完成各种展示该怎么办?
回复 支持 抱歉

使用道具 举报

发表于 2023-5-23 18:33:04 | 显示全部楼层
本帖最后由 Lost 于 2023-5-23 18:36 编辑

这样吧,我先给个代码,这是改 `afm_delay` 的计算逻辑的那个思路,这里是劫持改写而没有去动 renpy 源码,请注意此处改后正常的 Auto 就没有了,基本按照固定时间自动播放了,但是可能会出现些特殊情况什么的,我也不知道会发生什么(

设置里的那个自动时间就变成了间隔秒数了,不过那个 bar 的调整范围有点感人,为了体验良好建议再做个数学函数映射到一个合适的等待秒数范围上

哦对,这是 renpy 8.0.2.22080705 版本的,其它版本可能不适用,请自己改一改

[RenPy] 纯文本查看 复制代码
init -999 python:
    from renpy.display.behavior import map_event
    import pygame_sdl2 as pygame

    def event_patched(self, ev, x, y, st):
        if self.afm_length and renpy.game.preferences.afm_time and renpy.game.preferences.afm_enable:

            # afm_delay = (1.0 * (renpy.config.afm_bonus + self.afm_length) / renpy.config.afm_characters) * renpy.game.preferences.afm_time

            # if self.text_tuple is not None:
            #     max_time = 0

            #     for t in self.text_tuple:
            #         max_time = max(max_time, t.get_time())

            #     afm_delay += max_time

            afm_delay = renpy.game.preferences.afm_time

            if ev.type == renpy.display.core.TIMEEVENT and ev.modal:
                return None

            if st > afm_delay:
                if renpy.config.afm_callback:
                    if renpy.config.afm_callback() and not renpy.display.tts.is_active():
                        return True
                    else:
                        renpy.game.interface.timeout(0.1)
                else:
                    return True
            else:
                renpy.game.interface.timeout(afm_delay - st)

        dismiss = [ (i, True) for i in self.dismiss ] + [ (i, False) for i in self.dismiss_unfocused ] # type: ignore

        for dismiss_event, check_focus in dismiss:

            if map_event(ev, dismiss_event):

                if check_focus and not self.is_focused():
                    continue

                if renpy.config.skipping:
                    renpy.config.skipping = None
                    renpy.exports.restart_interaction()
                    raise renpy.display.core.IgnoreEvent()

                if not renpy.config.enable_rollback_side:
                    rollback_side = "disable"
                if renpy.exports.variant("mobile"):
                    rollback_side = renpy.game.preferences.mobile_rollback_side
                else:
                    rollback_side = renpy.game.preferences.desktop_rollback_side

                if ev.type == pygame.MOUSEBUTTONUP:

                    percent = 1.0 * x / renpy.config.screen_width

                    if rollback_side == "left":

                        if percent < renpy.config.rollback_side_size:
                            renpy.exports.rollback()
                            raise renpy.display.core.IgnoreEvent()

                    elif rollback_side == "right":

                        if (1.0 - percent) < renpy.config.rollback_side_size:
                            renpy.exports.rollback()
                            raise renpy.display.core.IgnoreEvent()

                if renpy.game.preferences.using_afm_enable and renpy.game.preferences.afm_enable and not renpy.game.preferences.afm_after_click:

                    renpy.game.preferences.afm_enable = False
                    renpy.exports.restart_interaction()
                    raise renpy.display.core.IgnoreEvent()

                if self.allow_dismiss:
                    if not self.allow_dismiss():
                        raise renpy.display.core.IgnoreEvent()

                return True

        skip_delay = renpy.config.skip_delay / 1000.0

        if renpy.config.skipping and renpy.config.allow_skipping and renpy.store._skipping:

            if ev.type == renpy.display.core.TIMEEVENT and st >= skip_delay:

                if ev.modal:
                    return None
                elif renpy.game.preferences.skip_unseen:
                    return True
                elif renpy.config.skipping == "fast":
                    return True
                elif renpy.game.context().seen_current(True):
                    return True
                else:
                    renpy.config.skipping = None
                    renpy.exports.restart_interaction()

            else:
                renpy.game.interface.timeout(skip_delay - st)

        return None

    renpy.display.behavior.SayBehavior.event = event_patched


label start:

    '[renpy.game.preferences.afm_time]'
    'bar 是线性的 0.1 到 30.0'

回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2023-5-26 23:44:07 | 显示全部楼层
Lost 发表于 2023-5-22 23:50
自动要求游戏对话、语音正常播放完毕才会进下一句,所以每一句的停留时间肯定不一样,你想要的是什么效果呢 ...

是我没有说清楚吗?我再解释一下,就是从上个对话结束时刻到下个对话开始时刻,这之间的时间间隔我希望都一样,所以不需要考虑播放的问题
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2023-5-26 23:49:15 | 显示全部楼层
Lost 发表于 2023-5-23 18:33
这样吧,我先给个代码,这是改 `afm_delay` 的计算逻辑的那个思路,这里是劫持改写而没有去动 renpy 源码, ...

暂时没有时间看,不过是不是这样修改使得所有对话都持续一个限定的时间?是少的内容播放完等待,和多的内容播放不完中断?我想修改的时间上面回复又解释了,修改需要怎么变化吗?
回复 支持 抱歉

使用道具 举报

发表于 2023-5-27 01:15:24 | 显示全部楼层
本帖最后由 Lost 于 2023-5-27 01:19 编辑

哦哦,我理解了,测试了一下后我才发现长台词的自动停顿时间真的蛮离谱的,可以继续用上面的 hook 代码,记得这样改就行了:

[RenPy] 纯文本查看 复制代码
init -999 python:
    from renpy.display.behavior import map_event
    import pygame_sdl2 as pygame

    def event_patched(self, ev, x, y, st):
        if self.afm_length and renpy.game.preferences.afm_time and renpy.game.preferences.afm_enable:

            # afm_delay = (1.0 * (renpy.config.afm_bonus + self.afm_length) / renpy.config.afm_characters) * renpy.game.preferences.afm_time

            afm_delay = renpy.game.preferences.afm_time

            if self.text_tuple is not None:
                max_time = 0

                for t in self.text_tuple:
                    max_time = max(max_time, t.get_time())

                afm_delay += max_time

            if ev.type == renpy.display.core.TIMEEVENT and ev.modal:
                return None

......


现在会在对话播放完毕后停顿固定时间,不过我不是很推荐这样子改,因为可能换个 renpy 版本就寄了
所以如果没有强迫症的话,我建议利用点数学技巧:
```python
renpy.config.afm_bonus = 1000000
renpy.config.afm_characters = 1000000
```
嗯对,改个大数字就行,可以抹平文字长度的影响,至于略微的差别人应该看不出来()

对了,吐槽一下,中文文档这里的翻译有问题啊:
`config.afm_bonus` 这个真的能让人听懂吗  https://doc.renpy.cn/zh-CN/config.html#var-config.afm_bonus
`config.afm_characters` 这解释的啥啊  https://doc.renpy.cn/zh-CN/config.html#var-config.afm_characters

我可以理解 renpy 官方为什么不选择固定间隔时间,因为如果对话被用户设置成瞬间显示,那长短对话间的停顿就很让人尴尬了,所以长短对话间隔有差别是必要的,想了想也没去提 feature request 了()

不知道有没有人说过,反正文档没讲过,自动对话间隔中前一对话显示完毕到下一对话开始显示的时间的计算公式为:`afm_delay = (renpy.config.afm_bonus + self.afm_length) / renpy.config.afm_characters * renpy.game.preferences.afm_time`
`afm_length` 应该和文本长度之类的有关,其它三项不是 config 设置就是用户设置中的 preference

回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2023-5-27 22:10:15 | 显示全部楼层
Lost 发表于 2023-5-27 01:15
哦哦,我理解了,测试了一下后我才发现长台词的自动停顿时间真的蛮离谱的,可以继续用上面的 hook 代码,记 ...

代码我明天再仔细写,先谢谢啦,另外...
屏幕截图 2023-05-21 150544.png

点评

这……很明显 bing 在胡说八道(  发表于 2023-5-28 00:25
回复 支持 抱歉

使用道具 举报

发表于 2023-6-2 08:32:02 | 显示全部楼层
中文的文档翻译确实有问题……
回复 支持 抱歉

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 20:51 , Processed in 0.079052 second(s), 19 queries , File On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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