找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1523|回复: 3

[原创] 【教程】禁止用户和界面交互的方法以及禁用快捷键

[复制链接]
发表于 2022-8-29 00:17:56 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 blackpineapple 于 2023-1-5 08:07 编辑

这篇文章会讲下如何在在游戏中禁止用户和界面交互,以及暂时禁止快捷键的办法。

在有些时候变换不希望被用户打断,或者变幻在界面上面演出,不希望用户再按界面的按钮。在这些情况下,需要让用户暂时不能和界面交互。

在论坛搜索之后发现了这个帖子:
不要使用lemmasoft这个帖子的办法,会有副作用!!
正确方法请往下拉。
https://lemmasoft.renai.us/forums/viewtopic.php?t=32309


除此之外,有些快捷键我们也想在一些界面禁止。比如快进(skip),隐藏界面,esc键呼出主菜单等。

关于定制按键映射可以看文档的这里:
https://doc.renpy.cn/zh-CN/keymap.html

我的实现例子

[RenPy] 纯文本查看 复制代码
## 快捷键禁用
# 鼠标右键、esc:会唤出系统菜单
# 鼠标中键:隐藏ui
# ctrl:快进
label disable_shortcut():
    python:
        ## 禁止显示游戏菜单
        _game_menu_screen = None

        ## 禁止快进
        config.allow_skipping = False

        ## 禁止隐藏界面
        _windows_hidden = True

    return

## 快捷键恢复
label enable_shortcut():
    python:
        _game_menu_screen = 'save'
        config.allow_skipping = True
        _windows_hidden = False

    return

## 使用禁止的例子
label setup():
    call disable_shortcut
    jump target
    return

## 使用激活的例子
label end():
        call enable_shortcut
        jump start 


_game_menu_screen 是按esc键会出现的界面,默认是存档界面,这个也可以自己写个界面替换。

是否可以快进这个变量,可以在存储区配置项的文档中找到,里面还有很多别的有用的配置项,比如是否可以回滚。

https://doc.renpy.cn/zh-CN/store_variables.html#var-_autosave

最后是_windows_hidden 这个变量,是一个文档里都没有提到,搜索都搜不到的变量。最近在接一个游戏制作的外包,对方制作人要求在一个界面禁用隐藏界面。因为游戏本来就是界面交互,要是玩家不小心按到了,结果界面没有怎么办。尝试通过修改按键映射,以及在界面赋予按键新的功能来解决,但是都不行。对方制作人提出可以用这个变量,他是看common文件夹里的00keymap.rpy这个文件的具体代码得知这个变量的。

具体代码如下
[RenPy] 纯文本查看 复制代码
label _hide_windows:

    if renpy.context()._menu:
        return

    if _windows_hidden:
        return

    python:
        _windows_hidden = True
        voice_sustain()
        ui.saybehavior(dismiss=['dismiss', 'hide_windows'])
        ui.interact(suppress_overlay=True, suppress_window=True)
        _windows_hidden = False

    return 

可以看到如果这个_windows_hidden是True的话,就不会执行下面的语句了,从而达到了禁止的效果。



 楼主| 发表于 2022-10-21 11:50:43 | 显示全部楼层
本帖最后由 blackpineapple 于 2023-1-5 08:08 编辑

上面的代码pygame那个代码可能会有副作用;
正确解决办法
[RenPy] 纯文本查看 复制代码
label disable_user_interaction():
    python:
        ## pygame这个是为了在转场的时候,用户不能和按钮交互
     
        ## 禁止使用鼠标相关
        pygame.event.set_blocked(pygame.MOUSEWHEEL)
        pygame.event.set_blocked(pygame.MOUSEBUTTONUP)
        pygame.event.set_blocked(pygame.MOUSEBUTTONDOWN)

        ## 禁止使用键盘
        pygame.event.set_blocked(pygame.KEYDOWN)
        pygame.event.set_blocked(pygame.KEYUP)
        
        ## 禁止关闭,因为禁止了鼠标如果用户点了关闭之后会弹框问是否关闭
        ## 但是因为禁止了鼠标,没有办法点,就卡住了。
        pygame.event.set_blocked(pygame.QUIT)

    return

label enable_user_interaction():
    ## 结束禁止交互
    #$ pygame.event.set_blocked(None)
    python:
        pygame.event.set_allowed(pygame.MOUSEWHEEL)
        pygame.event.set_allowed(pygame.MOUSEBUTTONUP)
        pygame.event.set_allowed(pygame.MOUSEBUTTONDOWN)

        pygame.event.set_allowed(pygame.KEYDOWN)
        pygame.event.set_allowed(pygame.KEYUP)

        pygame.event.set_allowed(pygame.QUIT)

    return

回复 支持 抱歉

使用道具 举报

发表于 2022-11-26 13:43:33 | 显示全部楼层
谢谢大佬
回复

使用道具 举报

 楼主| 发表于 2023-1-5 08:06:10 | 显示全部楼层
本帖最后由 blackpineapple 于 2024-1-8 10:55 编辑

补充一个禁止跳过转场的例子
[RenPy] 纯文本查看 复制代码
label start():
    scene black
    $_dismiss_pause = False
    show cave bg 1 with Dissolve(3.0)
    $_dismiss_pause = True
    show cave bg 2 with Dissolve(5.0)
    "结束"
    return


参考
https://lemmasoft.renai.us/forums/viewtopic.php?t=34328
#6
回复 支持 抱歉

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 05:19 , Processed in 0.056764 second(s), 13 queries , File On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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