找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 19|回复: 0

[教程] 简单实用的自定义命名存档功能和修改存档名功能

[复制链接]
发表于 昨天 18:24 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 小笠原 于 2026-8-6 18:39 编辑

本应该是很常见的功能,但在renpy里好像并没有看到,实际上修改起来也十分简单。


首先要自定义存档命名肯定需要有个输入框,这里先建个存档专用的输入框界面,UI布局可自行修改。





[RenPy] 纯文本查看 复制代码
screen save_name_popup(slot):

    modal True
    zorder 200

    default temp_name = FileSaveName(slot) if FileLoadable(slot) else _("存档 {}").format(slot)

    $ confirm_action = (
        [SetVariable("save_name", temp_name.strip() if temp_name.strip() else _("存档 {}").format(slot)), FileSave(slot), Hide("save_name_popup")]
    )

    add "#000000aa"

    frame:
        xalign 0.5
        yalign 0.5
        xsize 640
        padding (40, 40)

        vbox:
            spacing 24
            xalign 0.5

            text _("为存档命名") size 32 xalign 0.5 color "#ffffff"

            input:
                value ScreenVariableInputValue("temp_name")
                length 16
                xalign 0.5
                size 28
                color "#ffffff"

            text "[len(temp_name)/16" size 18 xalign 1.0 color "#888888"

            hbox:
                spacing 40
                xalign 0.5

                textbutton _("保存"):
                    style "my_button"
                    action confirm_action

                textbutton _("取消"):
                    style "my_button"
                    action Hide("save_name_popup")

    key "K_RETURN" action confirm_action
    key "K_KP_ENTER" action confirm_action
    key "K_ESCAPE" action Hide("save_name_popup")






然后只需修改原本存读档界面里调用的file_slots界面里的网格布局里的存档按钮button。

原本是长这样子:

[RenPy] 纯文本查看 复制代码
                    button:
                        action FileAction(slot)

                        has vbox

                        add FileScreenshot(slot) xalign 0.5

                        text FileTime(slot, format=_("{#file_time}%Y-%m-%d %H:%M"), empty=_("空存档位")):
                            style "slot_time_text"

                        text FileSaveName(slot):
                            style "slot_name_text"

                        key "save_delete" action FileDelete(slot)




直接替换成这样:


[RenPy] 纯文本查看 复制代码
                    button:
                        if CurrentScreenName() == "save":
                            action Show("save_name_popup", slot=slot)
                        else:
                            action FileAction(slot)

                        has vbox

                        add FileScreenshot(slot) xalign 0.5

                        text FileTime(slot, format=_("{#file_time}%Y-%m-%d %H:%M"), empty=_("空存档位")):
                            style "slot_time_text"

                        text FileSaveName(slot):
                            style "slot_name_text"

                        key "save_delete" action FileDelete(slot)
[/mw_shl_code]



原理就是利用save_name这个变量,在存档时先弹出一个输入框的窗口,打字输入完后点击取人就会把赋值传给save_name再保存。

也就改了下存档按钮和新增一个输入框界面的事。

但是,这样就只能实现存档时的自定义命名,不能满足修改已经存档的数据的命名。

既然如此的话,那直接舍弃掉renpy原本的FileSave,单独写几段函数来处理改名逻辑就好了,其实也非常简单。

首先添加这段:


[RenPy] 纯文本查看 复制代码
default persistent.custom_save_names = {}

init python:

    def get_display_name(slot):
        # 每个存档位在不同页码下是不同的文件,用FileSlotName算出稳定的标识
        key = FileSlotName(slot, gui.file_slot_cols * gui.file_slot_rows)
        return persistent.custom_save_names.get(key, FileSaveName(slot))

    def set_custom_save_name(slot, name):
        key = FileSlotName(slot, gui.file_slot_cols * gui.file_slot_rows)
        name = name.strip()
        if not name:
            name = FileSaveName(slot) or _("存档 {}").format(slot)
        persistent.custom_save_names[key] = name

    def clear_custom_save_name(slot):
        key = FileSlotName(slot, gui.file_slot_cols * gui.file_slot_rows)
        if key in persistent.custom_save_names:
            del persistent.custom_save_names[key]





之前的方法只会在存档那一刻生效,无需新增按钮,那么既然要改已经存档的数据,所以还要再新写个改名的按钮,这个按钮放哪里也可以自行修改。


[RenPy] 纯文本查看 复制代码
                            textbutton _("改名"):
                                style "slot_rename_button"
                                xalign 1.0
                                action Show("save_name_popup", slot=slot, existing=True)




当然,要放在存档的按钮里也行,另外因为已经不需要用FileSave相关的东西了,这些也需要改成之前写的执行函数。

整体就变成这样:


[RenPy] 纯文本查看 复制代码
                    button:
                        if CurrentScreenName() == "save":
                            action Show("save_name_popup", slot=slot)
                        else:
                            action FileAction(slot)

                        has vbox

                        add FileScreenshot(slot) xalign 0.5

                        text FileTime(slot, format=_("{#file_time}%Y-%m-%d %H:%M"), empty=_("空存档位")):
                            style "slot_time_text"


                        text get_display_name(slot):
                            style "slot_name_text"

                        if FileLoadable(slot):
                            textbutton _("改名"):
                                style "slot_rename_button"
                                xalign 1.0
                                action Show("save_name_popup", slot=slot, existing=True)

                        key "save_delete" action [FileDelete(slot), Function(clear_custom_save_name, slot)]





需要注意的是,删除存档的方式也要一起修改。

最后是之前新建的输入框界面,也要改,总共就两个地方。

一、原本的
[RenPy] 纯文本查看 复制代码
screen save_name_popup(slot):

改成
[RenPy] 纯文本查看 复制代码
screen save_name_popup(slot, existing=False):



二、原本的


[RenPy] 纯文本查看 复制代码
    $ confirm_action = (
        [SetVariable("save_name", temp_name.strip() if temp_name.strip() else _("存档 {}").format(slot)), FileSave(slot), Hide("save_name_popup")]
    )





改成


[RenPy] 纯文本查看 复制代码
    $ confirm_action = (
        [Function(set_custom_save_name, slot, temp_name), Hide("save_name_popup")]
        if existing else
        [SetVariable("save_name", temp_name.strip() if temp_name.strip() else _("存档 {}").format(slot)), FileSave(slot), Hide("save_name_popup")]
    )




这样一来无论是存档时的自定义命名还是修改已经存档的数据的命名,都可以通过输入框界面里的变量传入到存档数据里了。

具体的解释和演示可以观看视频:

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

本版积分规则

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

GMT+8, 2026-8-7 04:23 , Processed in 0.022118 second(s), 7 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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