支持Windows下单文件封装模式调节游戏速度倍率

This commit is contained in:
wszqkzqk 2022-07-27 16:50:20 +08:00
parent 95d72c55cd
commit 64f2fa52c0
2 changed files with 19 additions and 11 deletions

View File

@ -7,9 +7,6 @@ else: # 非Windows系统存储路径
USERDATA_PATH = os.path.expanduser(os.path.join("~", ".config", "wszqkzqk.dev", "pypvz", "userdata.json")) 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")) USERLOG_PATH = os.path.expanduser(os.path.join("~", ".config", "wszqkzqk.dev", "pypvz", "run.log"))
# 游戏速度倍率(调试用)
GAME_RATE = 1
# 窗口标题 # 窗口标题
ORIGINAL_CAPTION = 'pypvz' ORIGINAL_CAPTION = 'pypvz'
# 窗口图标 # 窗口图标
@ -86,6 +83,7 @@ LEVEL_NUM = 'level num'
LITTLEGAME_NUM = 'littleGame num' LITTLEGAME_NUM = 'littleGame num'
LEVEL_COMPLETIONS = 'level completions' LEVEL_COMPLETIONS = 'level completions'
LITTLEGAME_COMPLETIONS = 'littleGame completions' LITTLEGAME_COMPLETIONS = 'littleGame completions'
GAME_RATE = 'game rate'
# 整个游戏的状态 # 整个游戏的状态
MAIN_MENU = 'main menu' MAIN_MENU = 'main menu'
@ -663,6 +661,7 @@ INIT_USERDATA = {
LITTLEGAME_NUM: 1, LITTLEGAME_NUM: 1,
LEVEL_COMPLETIONS: 0, LEVEL_COMPLETIONS: 0,
LITTLEGAME_COMPLETIONS: 0, LITTLEGAME_COMPLETIONS: 0,
GAME_RATE: 1,
} }
# 无穷大常量 # 无穷大常量

View File

@ -33,7 +33,6 @@ class Control():
self.screen = pg.display.get_surface() self.screen = pg.display.get_surface()
self.done = False self.done = False
self.clock = pg.time.Clock() # 创建一个对象来帮助跟踪时间 self.clock = pg.time.Clock() # 创建一个对象来帮助跟踪时间
self.fps = 50 * c.GAME_RATE
self.keys = pg.key.get_pressed() self.keys = pg.key.get_pressed()
self.mouse_pos = None self.mouse_pos = None
self.mouse_click = [False, False] # value:[left mouse click, right mouse click] 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: with open(c.USERDATA_PATH) as f:
userdata = json.load(f) userdata = json.load(f)
# 存档内不包含即时游戏时间信息,需要新建 self.game_info = {}
self.game_info = {c.CURRENT_TIME:0} # 导入数据,保证了可运行性,但是放弃了数据向后兼容性,即假如某些变量在以后改名,在导入时可能会被重置
# 导入数据 need_to_rewrite = False
self.game_info.update(userdata) 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: except FileNotFoundError:
# 不存在存档即新建 # 不存在存档即新建
if not os.path.exists(os.path.dirname(c.USERDATA_PATH)): 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) savedata = json.dumps(c.INIT_USERDATA, sort_keys=True, indent=4)
f.write(savedata) f.write(savedata)
self.game_info = c.INIT_USERDATA.copy() # 内部全是不可变对象,浅拷贝即可 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): def setup_states(self, state_dict, start_state):
@ -69,7 +78,7 @@ class Control():
def update(self): def update(self):
# 返回自 pygame_init() 调用以来的毫秒数 * 游戏速度倍率 # 返回自 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: if self.state.done:
self.flip_state() self.flip_state()