使用pygame.time.get_ticks()在游戏记分板显示道具剩余时长的问题
故障修复方案
核心问题梳理
- 剩余时长计算逻辑错误:记分板初始直接用
powerup_time - POWERUP_TIME_ALLOWED计算,初始powerup_time为0,自然得到-5000的错误结果。 - 记分板没有动态更新:
prep_remaining_pow_time()仅在记分板初始化时调用1次,后续计时数值、增益等级变化后没有重新渲染,导致拾取道具后数值无变化。 - 增益时长叠加逻辑错误:拾取新道具时直接覆盖
powerup_time,原有剩余时长直接丢失,不符合叠加5秒的需求。 - 计时降级逻辑错误:单段计时结束后直接重置
powerup_time为当前时间,多段叠加时长的计时规则完全不生效。
分步修复代码
1. 修复记分板时长计算与渲染逻辑(scoreboard.py)
修正计算规则,无生效增益时直接显示0,也可按需调整为显示空白:
def prep_remaining_pow_time(self): """turn remainging pow time into an image""" # 无生效增益直接显示0 if self.settings.ship_power <= 1: pow_time_left = 0 else: # 总结束时间 = 计时起点 + 5秒 * 增益等级差 total_end_time = self.settings.powerup_time + self.settings.POWERUP_TIME_ALLOWED * (self.settings.ship_power - 1) pow_time_left = total_end_time - pygame.time.get_ticks() # 避免出现负数 pow_time_left = max(pow_time_left, 0) # 转成秒显示更易读,保留1位小数 pow_time_str = f"增益剩余: {pow_time_left/1000:.1f}s" self.powtime_image = self.font.render(pow_time_str, True, self.text_color, self.settings.bg_color) # place image below score and level self.powtime_rect = self.powtime_image.get_rect() self.powtime_rect.right = self.screen_rect.right - 20 self.powtime_rect.top = self.level_rect.bottom + 10
2. 修复道具拾取叠加逻辑(main.py的_check_pow_collisions方法)
拾取道具时不覆盖原有计时起点,仅提升增益等级,同时触发记分板更新:
for collosion in collisions: if collosion.type == 'gun': self.settings.ship_power += 1 # 首次拾取增益时才设置计时起点 if self.settings.ship_power == 2: self.settings.powerup_time = pygame.time.get_ticks() # 触发记分板刷新 self.sb.prep_remaining_pow_time() self._check_power_time() # 原有shield逻辑保持不变
3. 修复计时降级逻辑(main.py的_check_power_time方法)
按段降级,每过5秒减1级,降级后自动更新记分板:
def _check_power_time(self): if self.settings.ship_power >= 2: # 当前段增益的结束时间 current_stage_end = self.settings.powerup_time + self.settings.POWERUP_TIME_ALLOWED if pygame.time.get_ticks() > current_stage_end: self.settings.ship_power -= 1 # 计时起点后移5秒,进入下一段计时 self.settings.powerup_time = current_stage_end # 触发记分板刷新 self.sb.prep_remaining_pow_time()
4. 可选优化:实现实时跳动的时长显示
如果希望时长数字逐帧更新,在_update_screen方法调用self.sb.show_score()前添加一行代码即可:
self.sb.prep_remaining_pow_time()
内容的提问来源于stack exchange,提问作者Zoidberg
相关产品推荐
相关产品推荐

