RenPy中文空间

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 222|回复: 1

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

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

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

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

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

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

在论坛搜索之后发现了这个帖子:

https://lemmasoft.renai.us/forums/viewtopic.php?t=32309

下面是一个实例的代码。

不希望打断的转场,放在eyecatch这个屏幕里面,然后设定转场是10s。
[RenPy] 纯文本查看 复制代码
init python:
    import pygame
label eyecatch():
    ## pygame这个是为了在转场的时候,用户不能和按钮交互
    $ pygame.event.set_allowed(None)
    $ pygame.event.set_allowed(pygame.USEREVENT)

    scene bg
    show screen eyecatch
    ## 动态效果总演示事件为10s
    pause 10
    $ pygame.event.set_blocked(None)
    jump execuation
    return


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

关于定制按键映射可以看文档的这里:
https://www.renpy.cn/doc/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://www.renpy.cn/doc/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 | 显示全部楼层
上面的代码pygame那个代码可能会有副作用;
修改为:
[RenPy] 纯文本查看 复制代码
label disable_user_interaction():
    python:
        ## pygame这个是为了在转场的时候,用户不能和按钮交互
        #pygame.event.set_allowed(None)
        #pygame.event.set_allowed(pygame.USEREVENT)

        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)

        ## 关闭也需要禁止,否则因为不能交互,不能点击确认关闭的窗口
        ## pygame.event.set_allowed(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
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2022-11-1 05:02 , Processed in 0.022169 second(s), 13 queries , File On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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