找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9634|回复: 4

[有回复] ConditionSwitch无法切换非repeat的图片

[复制链接]
发表于 2019-8-6 15:18:55 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 鼠西 于 2019-8-6 15:25 编辑

这是一个动态立绘(其中的WhileSpeaking作用是:当对白滚动时嘴巴会动,对白停止时嘴巴也会停下,也因此选用了LiveComposite)

我希望通过ConditionSwitch实现:随时切换[普通随机眨眼](BBeyes)和[快速眨眼2次后停下](BBdoubleblink)两种模式。
代码没有报错,但图片的显示出了些问题,具体情形如下:


【一】
操作:默认定义doubleblink无论真假,BBdoubleblink有repeat
效果:一切正常显示。

【二】
操作:默认定义doubleblink为False,BBdoubleblink无repeat
效果:改变条件前普通眨眼,改变后永久禁止在睁眼状态(如果最后一张图是eys_close,就禁止在闭眼状态),再次切换普通眨眼依然可正常显示
(PS:某次测试,在经过一个Input语句后会闪现一次姗姗来迟的快速眨眼)

【三】
操作:默认定义doubleblink为True,BBdoubleblink无repeat
效果:初次显示立绘会有快速眨眼,切换普通眨眼可正常显示,再次切换快速眨眼后同【三】情况。回到标题再次开始游戏后,初次显示立绘也不会快速眨眼,除非重启游戏。


(PS:repeat 2、repeat 4,等,限制循环次数后和无repeat效果一样)


也就是说,除非图片是永久循环的才会正常显示,但我不希望有永久循环。
现在的状况有种图片被“吞”掉了一部分的感觉。
请问是哪个环节出错误了?

[RenPy] 纯文本查看 复制代码
#省略了与问题无关的代码

define BB = Character("BB", callback=speaker("BB"))
default doubleblink = False

image BBspeaking = LiveComposite(
    (433, 1004),
    (0,0),"BB_base.png",
    (0,0),ConditionSwitch("doubleblink","BBdoubleblink","doubleblink == False","BBeyes"),
    (0,0),WhileSpeaking("BB", "BB_speak", "BB_mouth_close.png"),
    )

image BBeyes:
    "BB_eye_open.png"
    choice 2:
        7.5 
    choice 3:
        5.5
    choice 5:
        4.5 
    choice 2:
        2.5 
    choice 5:
        1.5
    "BB_eye_half.png"
    .1
    "BB_eye_close.png"
    .1
    repeat

image BBdoubleblink:
    "BB_eye_open.png"
    0.15
    "BB_eye_close.png"
    0.08
    "BB_eye_open.png"
    0.15
    "BB_eye_close.png"
    0.08
    "BB_eye_open.png"
    0.15

 楼主| 发表于 2019-8-6 15:22:28 | 显示全部楼层
本帖最后由 鼠西 于 2019-8-6 15:26 编辑

这是情形【二】中的script

[RenPy] 纯文本查看 复制代码
label start:

    scene bg with dissolve

    show BBspeaking with dissolve

    BB "这里是测试{w}啦啦啦啦{p}哈哈哈哈哈"


    BB "测试一下说话,aaa,BALABLABLABLA"

    a "不说话啦啦啦"

    BB "sdhsdsdjsshahahahahhah"

    $ doubleblink = True #实际应该快速眨眼的节点

    BB "ssddsadijs,sjdopadospad,shdhsadisaiodas"

    python:
        povname = renpy.input("你的名字是什么?","请输入 ")
        povname = povname.strip()

    $ doubleblink = False  #就是在这个节点,出现了闪现一次眨眼

    a "你的名字是{size=+10}[povname]{/size} www"

    BB "aaaaaaaaaaaaaaaaaaaaaaaaa"

return
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2019-8-6 22:42:50 | 显示全部楼层
本帖最后由 鼠西 于 2019-8-6 22:48 编辑

切换的问题是暂时解决了,每次更新变量都要重新show一次立绘才行,大概是因为需要刷新可视组件?

但是又出现了新的问题——

为了能够替换不同嘴型的说话动态所以用了DynamicDisplayable,因为发现在Livecomposite中用转义符并不能改变图片显示...(即使刷新立绘也一样)

但在Dynamic中眨眼变得非常鬼畜....经试验发现凡是带了choice的image都会这样,没有带的就一切正常
鬼畜眼睛示意短视频(百度网盘)https://pan.baidu.com/s/1djEMCA_y_SCEiBKOU1Yhfw

下面是代码和眼睛的示意(右边的眼睛是正常显示的样子)

目前感觉有几个方向:
1、解决choice和Dynamic的冲突?
2、把有关变更嘴巴类型的变量,传入事先定义的一系列speak函数的某个地方?
3、运用其他的办法实现间隔的随机性?


不过都不知道要怎么解决……纠结一天了OTZ

(PS:嘴巴动态是从LSF论坛上搬运修改的,原作者ID:kinmoku)

[RenPy] 纯文本查看 复制代码
init python:
  
    # This is set to the name of the character that is speaking, or
    # None if no character is currently speaking.
    speaking = None

    # This returns speaking if the character is speaking, and done if the
    # character is not.
    def while_speaking(name, speak_d, done_d, st, at):
        if speaking == name:
            return speak_d, .1
        else:
            return done_d, None
  
    # Curried form of the above.
    curried_while_speaking = renpy.curry(while_speaking)
  
    # Displays speaking when the named character is speaking, and done otherwise.
    def WhileSpeaking(name, speaking_d, done_d=Null()):
        return DynamicDisplayable(curried_while_speaking(name, speaking_d, done_d))
  
    # This callback maintains the speaking variable.
    def speaker_callback(name, event, **kwargs):
        global speaking
       
        if event == "show":
            speaking = name
        elif event == "slow_done":
            speaking = None
        elif event == "end":
            speaking = None
  
    # Curried form of the same.
    speaker = renpy.curry(speaker_callback)
    motion  = 1
    eyes = 1
    mayu = 1
    def draw_BB(st,at):
        return LiveComposite(
        (433, 1004), # size of composition
        (0,0),"BB_base.png", # default sprite
        (0,0),"BBeyes_%d"%eyes, # blinking animation
        (0,0),WhileSpeaking("BB", "BB_speak%d"%motion, "BB_mouse_close%d.png"%motion), # lip sync (character callback speaker, animation, and closed mouth.)
        (0,0),"BB_mayu%d.png"%mayu,
        ),.1

image BBspeaking = DynamicDisplayable(draw_BB)




回复 支持 抱歉

使用道具 举报

发表于 2019-8-7 20:41:01 | 显示全部楼层
搞的那么复杂,仅仅是控制眨眼频率
可以做不同眨眼动态(可都循环播放),快速眨眼2次也可不循环,根据情况调用相应动态图。
或做个循环眨眼两次,中间间隔长些,或开头时间长些,也可结尾长些... ...
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2019-8-8 16:09:19 | 显示全部楼层
本帖最后由 鼠西 于 2019-8-11 12:54 编辑
龙氏 发表于 2019-8-7 20:41
搞的那么复杂,仅仅是控制眨眼频率
可以做不同眨眼动态(可都循环播放),快速眨眼2次也可不循环 ...


因为根据表情、动作不同,五官各个部件都会变化,再加上动态..工作量和容量都很大
可以排列组合的话就方便多了,演出效果也会更丰富

目前,快速眨眼2次后来是加了个循环眨眼的block,再刷新立绘就没事了

问题就在于图片带choice的随机间隔后,就会开始高速闪动....也不知道是为什么...
嘴型也有choice(还非常复杂..)但就完全没有问题呢……

只是为了效果的话,也不是不能妥协
但就是很想知道为什么存在这个冲突,万一以后还碰到呢……
没搞明白就非常在意——

总之还是谢谢回复!我再去想想办法T T————————————————————————————

最后直接写了超长的普通眨眼循环,从而制造一种随机的假象(
回复 支持 抱歉

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 15:33 , Processed in 0.117679 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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