You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 18:45:01