找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1868|回复: 11

[已解决] 关于在主界面添加按钮从而次序播放两幅画面后返回

[复制链接]
发表于 2023-4-2 10:14:16 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 Ca清 于 2023-4-9 23:08 编辑

需要:在主界面添加一个按钮,交互后显示两幅画面,且次序播放,播放结束自动返回,尽量可以附带转场效果。

我的尝试:
想法为在主界面再添加一个“start”或别的什么形式,使之可以像剧情一样播放
于是,没有使用导航菜单,直接在主界面中置入按钮,包括“开始”和我需要的按钮,代码如下

[RenPy] 纯文本查看 复制代码
#

screen main_menu():
    tag menu
    add gui.main_menu_background
    hbox:
        xoffset 244
        yoffset 595
        #xalign 0.5
        #yalign 0.87
        vbox:
            spacing 7
            imagebutton idle "gui/main_menu/start/start.png" hover "gui/main_menu/start/start_.png" action Start() ##开始
            imagebutton idle "gui/main_menu/config/config.png" hover "gui/main_menu/config/config_.png" action Show("preferences")
            imagebutton idle "gui/main_menu/history/history.png" hover "gui/main_menu/history/history_.png" action Show("updatehistory")
            imagebutton idle "gui/main_menu/patch/patch.png" hover "gui/main_menu/patch/patch_.png" action Start("foo") ##我的需要
        vbox:
            spacing 7
            imagebutton idle "gui/main_menu/continue/continue.png" hover "gui/main_menu/continue/continue_.png" action Start()
            imagebutton idle "gui/main_menu/how_to/how_to.png" hover "gui/main_menu/how_to/how_to_.png" action Show("preferences")
            imagebutton idle "gui/main_menu/credit/credit.png" hover "gui/main_menu/credit/credit_.png" action Show("preferences")
            imagebutton idle "gui/main_menu/quit/quit.png" hover "gui/main_menu/quit/quit_.png" action Show("preferences")

#

[RenPy] 纯文本查看 复制代码
#

label start:

    scene bg room
    show eileen happy

    e "您已创建一个新的 Ren'Py 游戏。"

    e "当您完善了故事、图片和音乐之后,您就可以向全世界发布了!"

    return

label foo:

    scene applypatch1 ##图片名,在别处有image applypatch1 = "gui/main_menu/patch/patch_beta.jpg"

    return

#

问题:“开始”功能正常,我设置的按钮交互后无任何反应,全程无报错
想法为排除按钮自身的问题
于是,将action Start("foo")修改为action Jump("foo")

问题:按钮交互后有反应,但是只能从label start开始,也就是我希望的画面没被显示
想法为主界面不能够“开始两个游戏”
于是,将label start:修改为label start1:


问题:交互“开始”与我的按钮皆出现报错,:为“ScriptError: could not find label 'start'.”
想法为只能寻找start?
于是,再将label foo:修改为label start:


问题:交互“开始”后无任何反应,无报错,交互我的按钮后出现报错,为ScriptError: could not find label 'foo'.”


以上为我的尝试的主要躯干,每次尝试时间间隔为一周,其中包括向别的方向尝试,查阅资料等等

需求重申:
在主界面添加一个按钮,交互后自动显示两幅画面,且次序播放,播放结束自动返回,尽量可以附带转场效果。
问题总结:不设置导航界面有关系吗?游戏的主界面只能“开始一个游戏”吗?不是的话方法几何?

经长期自我努力,特来求问,发布此贴以得到需求与问题的满足与解答,广谢吧友


发表于 2023-4-9 14:10:24 | 显示全部楼层
本帖最后由 Lost 于 2023-4-9 14:14 编辑

1. transform 就是对可视组件的动画,文档 https://doc.renpy.cn/zh-CN/atl.html
2. on 就是对于事件的监听吧,当事件触发时要干些什么,不清楚具体实现,我猜可能在某些情况下时会向可视组件传递事件信号,怀疑本质上是 Pygame 的事件
2.1. appear 没怎么看到过,但在 showif 里解释过 https://doc.renpy.cn/zh-CN/screens.html#showif
3. linear 是 warpers 的一种,意思是在指定秒数内线性变换到后面的状态

4. screen 里的内容应该是实时监测变化的,这和上层的 Pygame 的循环有点关系吧,具体我没有研究过,我猜大部分游戏都直接套个循环,每一帧来处理事件这样?
5. 剩下的一起解释:
`on "show" action SetVariable("patch_index", 0)` 是指 screen 显示时,将变量的初始值设为0,这个 show 事件应该是 call / show screen 传递过来的

这个界面一开始想要实现的功能是点击一下切换图片,下面没有图片就隐藏界面,所以有了 `dismiss action If(...`

一开始就考虑不止两张图片,貌似 renpy 没有 case 语句,就只能 showif elif elif else 这样写了

后来说是要自动播放,那我认为不应该手动点击触发了,于是注释掉 `dismiss action If(...`,并且加了自动的 timer,如果这里不注释掉 `dismiss action If(...` 显然它是可以和 timer 同时工作的,也就是用户点击会快于 timer 会提前切换图片,但是,timer 仍然会定时触发,它这个时间是相对于 screen 开始显示的时间,也就是这里会多加一次的(当然只有两张图那目前是正常的)
回复 支持 1 抱歉 0

使用道具 举报

发表于 2023-4-2 14:52:08 | 显示全部楼层
本帖最后由 Lost 于 2023-4-2 14:56 编辑

`label start:` 肯定只能有一个,但是 `action Start("other_start")` 是可以在别的 label 地方开始的,你说没反应,只是因为没有台词导致直接结束了()

[RenPy] 纯文本查看 复制代码
label test_start:
    show pic_1

    ""
    hide pic_1

    show test_png

    ""

    return


这样就可以了,但是很难看,因为有个 say 的 window,还有底下一行工具栏,强迫症不能忍

所以更推荐直接写个 screen,给个参考:

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

transform show_hide_tran:
    xalign 0.5 yalign 0.5 alpha 0.0
    on appear:
        alpha 1.0
    on show:
        linear .5 alpha 1.0
    on hide:
        linear .5 alpha 0.0


default image_screen_index = 0

define test_tran = Dissolve(0.5)

screen image_screen:
    add "#000"
    dismiss action If(image_screen_index == 1, true=Hide(transition=test_tran),
                    false=SetVariable("image_screen_index", image_screen_index+1))

    showif image_screen_index == 0:
        image "test_png" at show_hide_tran
    else:
        image "pic_1" at show_hide_tran


    zorder 9999

    on "show" action SetVariable("image_screen_index", 0)


记得 main_menu 的按钮 action 改成 `Show('image_screen', transition=test_tran)` 就行了

注意一下: dismiss 可视组件是新版加上去的,7.5 或者 8.0 版本才行好像,低版本可能需要麻烦点了(实在不行就全屏的 imagebutton)

这里用了 showif,因为直接 add 然后切换图片并不能触发变换的 on(详见文档,要是能手动传递事件就好了

当然我觉得这种写法也不是很好看,幸好这里只有两张图,我在想也许可以用画廊什么的……要是不嫌麻烦也可以来个连环 screen……
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2023-4-4 19:06:44 | 显示全部楼层
Lost 发表于 2023-4-2 14:52
`label start:` 肯定只能有一个,但是 `action Start("other_start")` 是可以在别的 label 地方开始的,你 ...

刚刚才看到,十分感谢
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2023-4-4 21:09:06 | 显示全部楼层
Lost 发表于 2023-4-2 14:52
`label start:` 肯定只能有一个,但是 `action Start("other_start")` 是可以在别的 label 地方开始的,你 ...

这个效果真的很好,十分感谢,但自动的需求的确是很重要的,如果我将两幅画面的交替提前录成视频有办法简化吗?播放完了就返回主界面,期间屏蔽交互,有办法做到吗?我仍然希望这能够实现,如果有空闲的话就十分感谢了
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2023-4-4 21:29:06 | 显示全部楼层
Lost 发表于 2023-4-2 14:52
`label start:` 肯定只能有一个,但是 `action Start("other_start")` 是可以在别的 label 地方开始的,你 ...

另外一个问题,renpy有“自动”语句吗?就是能使行为自动播放,如果有,其时间,次序如何调试,如有劳烦十分抱歉,中文文档搜”自动”和“auto”的结果都给我看吐了,十分感谢
回复 支持 抱歉

使用道具 举报

发表于 2023-4-4 21:47:29 | 显示全部楼层
本帖最后由 Lost 于 2023-4-4 22:04 编辑

哦哦,原来要求自动播放啊,没看见(

screen 里有 timer,见 https://doc.renpy.cn/zh-CN/screens.html#timer

[RenPy] 纯文本查看 复制代码
screen image_screen:
    add "#000"
    # dismiss action If(image_screen_index == 1, true=Hide(transition=test_tran),
    #                 false=SetVariable("image_screen_index", image_screen_index+1))

    showif image_screen_index == 0:
        image "test_png" at show_hide_tran
    else:
        image "pic_1" at show_hide_tran


    zorder 9999

    timer 2.5 action SetVariable("image_screen_index", image_screen_index+1)
    timer 5.0 action Hide(transition=test_tran)


    on "show" action SetVariable("image_screen_index", 0)


在进入和退出 screen 的那个转场还是稍微会被用户输入影响一下,不爽就把转场时间改短到看不出来(再加个黑图大概也行

至于有没有其它自动控制的……不清楚,对话自动貌似只能按对话来而不是时间,视频不允许跳过也要加个屏蔽层,而且也不方便
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2023-4-5 16:09:45 | 显示全部楼层
Lost 发表于 2023-4-4 21:47
哦哦,原来要求自动播放啊,没看见(

screen 里有 timer,见 https://doc.renpy.cn/zh-CN/screens.html#time ...

效果已经完全达到了!十分感谢!但……用户输入似乎并不只影响转场,在整个过程中(从交互按钮开始到回到标题),在原来其他按钮的位置上点击,行为依旧会触发,在整个过程中有办法屏蔽用户输入吗
回复 支持 抱歉

使用道具 举报

发表于 2023-4-5 16:22:53 | 显示全部楼层
草,这是 bug 吧,我都加了个黑色背景了,怎么点击穿透到下面的菜单上去了()

把那个 dismiss 改一下就行了 `dismiss action NullAction()`
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2023-4-9 09:25:35 | 显示全部楼层
Lost 发表于 2023-4-5 16:22
草,这是 bug 吧,我都加了个黑色背景了,怎么点击穿透到下面的菜单上去了()

把那个 dismiss 改一下就行 ...

啊,注释没去掉,原来的语句去掉注释就可以了,并且直接用dismiss action NullAction()也能达到相同的效果,十分感谢
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2023-4-9 10:07:54 | 显示全部楼层
Lost 发表于 2023-4-5 16:22
草,这是 bug 吧,我都加了个黑色背景了,怎么点击穿透到下面的菜单上去了()

把那个 dismiss 改一下就行 ...

关于我的需求已经达到了,真是十分的感谢,如果您有兴趣能不能看看附加问题呢,如下,这些问题我好久一次才抽得出时间解决,我可以慢慢的解决但还是希望帮助啦,再谢谢你了(哭哭哭)
[RenPy] 纯文本查看 复制代码
.

##做个转场下面用
transform patch_tran:
    xalign 0.5 yalign 0.5 alpha 0.0 ##居中,透明
    on appear:
        alpha 1.0 ##appear时变为完全不透明
    on show:
        linear .5 alpha 1.0 ##show时完全不透明和?
    on hide:
        linear .5 alpha 0.0 ##hide时透明和?

    ##transform变换是个什么?可以理解成转场吗?
    ##on语句怎么判定上述行为发生了没有?未见一个appear却可以“当appear时”?或者说对on的认识不清
    ##linear是个什么?中文文档在GUI和动画和界面里都只用不解释,其他地方没有直接描述
 
##设定一个值一会用
default patch_index = 0

##做一个转场一会用 
define test_tran = Dissolve(0.5)
 
screen patch:
    add "#000"

    dismiss action NullAction()##未获取焦点时行动,因为是两幅画面一直没有焦点所以一交互就触发dismiss的nullaction,所以可以防止穿透
    #dismiss action If(patch_index == 1, true=Hide(transition=test_tran),false=SetVariable("patch_index", patch_index+1))##根据值发生行为的

    ##发生的流程不太清楚,猜想,一开始是值是0,所以加1,1时隐藏,那么下面的showif有为零的时候吗?还是说其实是要我交互一下才+1?和下面的timer配合?如果我没交互那么timer在0.5s后自动加一?验证后似乎确实如此欸
 
    showif patch_index == 0:
        image "applypatch1" at patch_tran ##在值为0时以patch_tran的转场显示第一幅画面
    else:
        image "applypatch2" at patch_tran ##1时第二幅
    
    ##是实时监测的吗?
 
    zorder 9999 ##图层最高防止干扰

    timer 0.5 action SetVariable("patch_index", patch_index+1) ##0.5s后给值加1,也就是0.5s后显示第二张图片?同时是不是也意味着用dismiss action If的时候可以快于0.5s,也就是可以通过交互快速通过?
    timer 1.0 action Hide(transition=test_tran) ##1.0s后隐藏,整场显示1.0s后结束,也就是这里可以控制整个过程的时间?
 
 
    on "show" action SetVariable("patch_index", 0) ##show时值归零,依然on判断行为不太懂


.

回复 支持 抱歉

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 11:35 , Processed in 0.116728 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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