diff --git a/source/constants.py b/source/constants.py index 06bf8d2..e34e690 100755 --- a/source/constants.py +++ b/source/constants.py @@ -7,9 +7,6 @@ else: # 非Windows系统存储路径 USERDATA_PATH = os.path.expanduser(os.path.join("~", ".config", "wszqkzqk.dev", "pypvz", "userdata.json")) USERLOG_PATH = os.path.expanduser(os.path.join("~", ".config", "wszqkzqk.dev", "pypvz", "run.log")) -# 游戏速度倍率(调试用) -GAME_RATE = 1 - # 窗口标题 ORIGINAL_CAPTION = 'pypvz' # 窗口图标 @@ -86,6 +83,7 @@ LEVEL_NUM = 'level num' LITTLEGAME_NUM = 'littleGame num' LEVEL_COMPLETIONS = 'level completions' LITTLEGAME_COMPLETIONS = 'littleGame completions' +GAME_RATE = 'game rate' # 整个游戏的状态 MAIN_MENU = 'main menu' @@ -663,6 +661,7 @@ INIT_USERDATA = { LITTLEGAME_NUM: 1, LEVEL_COMPLETIONS: 0, LITTLEGAME_COMPLETIONS: 0, + GAME_RATE: 1, } # 无穷大常量 diff --git a/source/tool.py b/source/tool.py index 3b06fc0..16f3125 100755 --- a/source/tool.py +++ b/source/tool.py @@ -33,7 +33,6 @@ class Control(): self.screen = pg.display.get_surface() self.done = False self.clock = pg.time.Clock() # 创建一个对象来帮助跟踪时间 - self.fps = 50 * c.GAME_RATE self.keys = pg.key.get_pressed() self.mouse_pos = None self.mouse_click = [False, False] # value:[left mouse click, right mouse click] @@ -45,10 +44,19 @@ class Control(): # 存在存档即导入 with open(c.USERDATA_PATH) as f: userdata = json.load(f) - # 存档内不包含即时游戏时间信息,需要新建 - self.game_info = {c.CURRENT_TIME:0} - # 导入数据 - self.game_info.update(userdata) + self.game_info = {} + # 导入数据,保证了可运行性,但是放弃了数据向后兼容性,即假如某些变量在以后改名,在导入时可能会被重置 + need_to_rewrite = False + for key in c.INIT_USERDATA: + if key in userdata: + self.game_info[key] = userdata[key] + else: + self.game_info[key] = c.INIT_USERDATA[key] + need_to_rewrite = True + if need_to_rewrite: + with open(c.USERDATA_PATH, "w") as f: + savedata = json.dumps(self.game_info, sort_keys=True, indent=4) + f.write(savedata) except FileNotFoundError: # 不存在存档即新建 if not os.path.exists(os.path.dirname(c.USERDATA_PATH)): @@ -57,8 +65,9 @@ class Control(): savedata = json.dumps(c.INIT_USERDATA, sort_keys=True, indent=4) f.write(savedata) self.game_info = c.INIT_USERDATA.copy() # 内部全是不可变对象,浅拷贝即可 - # 存档内不包含即时游戏时间信息,需要新建 - self.game_info[c.CURRENT_TIME] = 0 + # 存档内不包含即时游戏时间信息,需要新建 + self.game_info[c.CURRENT_TIME] = 0 + self.fps = 50 * self.game_info[c.GAME_RATE] def setup_states(self, state_dict, start_state): @@ -69,7 +78,7 @@ class Control(): def update(self): # 返回自 pygame_init() 调用以来的毫秒数 * 游戏速度倍率 - self.current_time = pg.time.get_ticks() * c.GAME_RATE + self.current_time = pg.time.get_ticks() * self.game_info[c.GAME_RATE] if self.state.done: self.flip_state()