RenPy中文空间

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 93|回复: 6

[求助] 如何实现类似krkr当中canskip=false的效果

[复制链接]
发表于 2021-3-16 02:35:19 | 显示全部楼层 |阅读模式

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

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

x
在KRKR当中,当某一区间内的脚本内存在canskip=false的时候,会产生鼠标点击无效,且回车、CTRL等一系列操作均无法跳过的状态——直至区间脚本执行完毕,或者触发某种跳出机制,跳出当前脚本区间。

以下以krkr的脚本为例,//后的文字为对于脚本内容的说明:

//以page=back(即不显示)的状态导入一张图片。放置在Layer=1上。
@image layer=1 storage=test.png visible=true page=back
//将layer=1的图片显示出来,且禁止skip(期间内,鼠标、键盘等所有操作均无法产生影响)
@trans layer=1 method=crossfade time=1200 canskip=false
//等待trans的过程(wt即wait trans的缩写),这一等待过程同样无法skip
@wt canskip=false

且这一过程中并不会影响到GUI等其他层面的操作(这一点很重要)。

这一点看似只是一个简单的BLOCK阻断,但在实际操作当中其实非常重要。
尤其是需要进行强制时长或者某种限定状态的演出要求下。

其实我知道站内有类似解决方案(或许不完全一样,不太确定),然而阅读权限不够,目前并不是很了解具体的方案内容。
仅根据解决方案的标题来简单判断一下的话——

或许目前方案提供者采用的是类似使用自定义screen的方法,cover住某些图层或GUI以实现某种程度的阻断,进而产生类似鼠标点击无效的效果——
不过目前我观察,这一点似乎只能影响到鼠标操作,影响不到键盘层面。

这一点其实和我当前的需求还是有所偏差的。毕竟原则上canskip=false并不会阻断GUI功能,只是强制让玩家在限定状态(如限定时间,限定在某一触发状态前,或其他——)下执行脚本。

当前我采用了define config.allow_skipping = True / $ config.allow_skipping = False的方式封住了Ctrl键。
用screen封住了鼠标,但其他按键的操作(诸如回车等)依然会奏效。
用$ renpy.pause('time',hard=True)的方式只能强制锁定停留时间,演出效果(如淡入淡出等)还是会被跳过。

如果采用‘定制按键映射’的方式逐个封锁我想要阻断的按键,似乎操作起来有点过于麻烦和蛋疼了……而且从结果来看似乎也不是很优雅。

总之,虽然有点唐突,还是先发个帖子询问一下。
若有大大能提供解决方案,提前在此谢过~
发表于 2021-3-17 10:02:28 | 显示全部楼层
昨晚试了下,使用字典的内置方法直接清空整个config.keymap不行,必须要保留该字典的key。只好设置一个所有value都为空的字典,用作替换。

[RenPy] 纯文本查看 复制代码
# 定义一个全空的按键映射字典
define empty_keymap = dict(

    rollback = [ ],
    screenshot = [ ],
    toggle_afm = [ ],
    toggle_fullscreen = [ ],
    game_menu = [ ],
    hide_windows = [ ],
    launch_editor = [ ],
    dump_styles = [ ],
    reload_game = [ ],
    inspector = [ ],
    full_inspector = [ ],
    developer = [ ],
    quit = [ ],
    iconify = [ ],
    help = [ ],
    choose_renderer = [ ],
    progress_screen = [ ],
    accessibility = [ ],

    # Accessibility.
    self_voicing = [ ],
    clipboard_voicing = [ ],
    debug_voicing = [ ],

    # Say.
    rollforward = [ ],
    dismiss = [ ],
    dismiss_unfocused = [ ],

    # Pause.
    dismiss_hard_pause = [ ],

    # Focus.
    focus_left = [ ],
    focus_right = [ ],
    focus_up = [ ],
    focus_down = [ ],

    # Button.
    button_ignore = [ ],
    button_select = [ ],
    button_alternate = [ ],
    button_alternate_ignore = [ ],

    # Input.
    input_backspace = [ ],
    input_enter = [ ],
    input_left = [ ],
    input_right = [ ],
    input_up = [ ],
    input_down = [ ],
    input_delete = [ ],
    input_home = [ ],
    input_end = [ ],
    input_copy = [ ],
    input_paste = [ ],

    # Viewport.
    viewport_leftarrow = [ ],
    viewport_rightarrow = [ ],
    viewport_uparrow = [ ],
    viewport_downarrow = [ ],
    viewport_wheelup = [ ],
    viewport_wheeldown = [ ],
    viewport_drag_start = [ ],
    viewport_drag_end = [ ],
    viewport_pageup = [ ],
    viewport_pagedown = [ ],

    # These keys control skipping.
    skip = [ ],
    stop_skipping = [ ],
    toggle_skip = [ ],
    fast_skip = [ ],

    # Bar.
    bar_activate = [ ],
    bar_deactivate = [ ],
    bar_left = [ ],
    bar_right = [ ],
    bar_up = [ ],
    bar_down = [ ],

    # Delete a save.
    save_delete = [ ],

    # Draggable.
    drag_activate = [ ],
    drag_deactivate = [ ],

    # Debug console.
    console = [ ],
    console_older = [ ],
    console_newer = [ ],

    # Director
    director = [ ],

    # Ignored (kept for backwards compatibility).
    toggle_music = [ ],
    viewport_up = [ ],
    viewport_down = [ ],

    # Profile commands.
    performance = [ ],
    image_load_log = [ ],
    profile_once = [ ],
    memory_profile = [ ],

)

label start:

    "您已创建一个新的 Ren'Py 游戏。"
    
    "此处会禁用所有输入5秒。"

    python:
        # 清空所有按键映射
        temp_keymap = config.keymap.copy()
        config.keymap.clear()
        config.keymap = empty_keymap.copy()
        renpy.clear_keymap_cache()
        
        renpy.pause(5.0, hard=True)

        # 恢复所有按键映射
        config.keymap.clear()
        config.keymap = temp_keymap.copy()
        renpy.clear_keymap_cache()


这里使用字典copy方法复制字典元素,而不是用等号直接修改字典引用对象,防止用户中途关闭应用导致”keymap被保存“等狗屁倒灶的问题。

开头的空映射请根据实际需求修改,选择保留哪些还需要生效的按键。

点评

感谢!我回头尝试一下~  发表于 2021-3-17 18:43
回复 支持 1 反对 0

使用道具 举报

发表于 2021-3-16 09:31:36 | 显示全部楼层
好吧,调低权限!
回复 支持 反对

使用道具 举报

发表于 2021-3-16 09:33:12 | 显示全部楼层
龙氏 发表于 2021-3-16 09:31
好吧,调低权限!

不是能阅读了吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-16 10:33:16 | 显示全部楼层
龙氏 发表于 2021-3-16 09:33
不是能阅读了吗

是的、刚刚升级

目前正在对照测试当中。当前的方案比较蛋疼,但用在显示LOGO的环节是够了
嘛、采用的就是龙大给出的方法

    key "mouseup_3" action NullAction() # 阻断鼠标右键,以避免呼出系统菜单等
    key "input_enter" action NullAction()  # 阻断回车键

总觉着这么挨个阻断感觉……

总之非常感谢~
回复 支持 反对

使用道具 举报

发表于 2021-3-16 15:45:19 | 显示全部楼层
如果要停用所有快捷键的话,可以换个思路……
先把config.keymap保存到某个临时字典里,接着把config.keymap清空,调用renpy.clear_keymap_cache()函数让清空快捷键生效。timer定时器到点之后把临时字典的东西塞回config.keymap,再次调用renpy.clear_keymap_cache()。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2021-4-16 19:49 , Processed in 0.106079 second(s), 15 queries , File On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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