Skip to content

saveexample_CN

windows99-hue edited this page Jul 20, 2026 · 1 revision

一个保存示例

这是一个为你展示dokibox的保存和加载功能使用的小例子,你的程序不一定这样写,这只是为了让你理解dokibox在你的剧情里的应用

from dokibox import *
import keyboard
import time
import json
import os

# 全局变量
progress = [1, 0]
action_flag = None  # 用于接收后台线程的指令 ('save' 或 'load')

# ----------------- 回调 (运行在后台线程) -----------------
# 它们现在只负责“发号施令”,不触碰任何 UI
def trigger_save():
    global action_flag
    action_flag = 'save'

def trigger_load():
    global action_flag
    action_flag = 'load'

def exit_program():
    print("正在退出程序...")
    keyboard.unhook_all_hotkeys()
    os._exit(0)

# ----------------- 实际执行动作 (运行在主线程) -----------------
def do_save():
    notice("保存中...")
    data_to_save = {"progress": progress}
    try:
        with open("save.json", 'w', encoding='utf-8') as f:
            json.dump(data_to_save, f, ensure_ascii=False, indent=4)
        print("存档已保存")
    except Exception as e:
        print(f"保存失败: {e}")

def do_load():
    global progress
    try:
        with open('save.json', 'r', encoding='utf-8') as f:
            data = json.load(f)
        
        progress[0] = data["progress"][0]
        progress[1] = data["progress"][1]
        
        notice("读取存档中...")
        print(f"已加载存档,当前进度: 章节 {progress[0]}, 剧情 {progress[1]}")
        return True # 读档成功
    except FileNotFoundError:
        notice("未找到存档文件!")
        print("读档失败:当前目录下没有 save.json 文件")
        return False

# ----------------- 主程序逻辑 -----------------
def main():
    print("程序已启动...")
    print("按 F3 键保存当前进度")
    print("按 F4 键加载存档 (将在当前对话结束后生效)")
    print("按 ESC 键退出程序")
    
    # 注册热键
    # keyboard.add_hotkey('f3', trigger_save)
    # keyboard.add_hotkey('f4', trigger_load)
    keyboard.add_hotkey('esc', exit_program)

    dialogbox.save = trigger_save
    dialogbox.load = trigger_load

    # 启动时先尝试读一次档
    # do_load()
    
    # 开始剧情
    if progress[0] == 1:
        label1()
    
def label1():
    global action_flag, progress
    juben = [
        ("莫妮卡", "今天天气真不错!"),
        ("纱世里", "是啊,很好奇会发生什么事情"),
        ("莫妮卡", "我最近在研究如何从renpy里穿出到Windows系统"),
        ("莫妮卡", "但是dokibox的作者99遇到了点问题"),
        ("莫妮卡", "他不知道dokibox到底是啥定位"),
        ("莫妮卡", "所以我正在帮他,如果咱们的对话能成功被保存"),
        ("莫妮卡", "就意味着,dokibox的存在是正确的"),
        ("纱世里", "哇!那以后咱们就可以去他的电脑里啦!"),
        ("纱世里", "真想看看那里是啥样的"),
        ("莫妮卡", "一定会去的纱世里,毕竟,计算机的世界,什么都能做到。")
    ]
    
    # 这里用 while 循环取代 for 循环,这样可以随时灵活修改 progress[1] 的值(即跳跃进度)
    while progress[1] < len(juben):
        # 1. 检查是否有快捷键发来的指令
        if action_flag == 'save':
            do_save()
            action_flag = None
        elif action_flag == 'load':
            if do_load():
                action_flag = None
                continue  # 如果读档成功,直接跳过后面的代码,重新循环并显示新进度的对话
            action_flag = None

        # 2. 渲染 UI (这会卡住主线程,直到玩家点击继续)
        dialogbox(msg=juben[progress[1]][1], name=juben[progress[1]][0])
        
        # 3. 对话结束后,判断刚才在看对话时有没有按下读档键
        # 如果没有按读档,才进入下一句话。按了的话就不加 1,留给下一轮去 load。
        if action_flag != 'load':
            progress[1] += 1

if __name__ == "__main__":
    main()

Clone this wiki locally