Pygame实现坦克无敌状态下的精灵闪烁/半透明效果
PyGame 坦克免疫状态下的半透明白色叠加闪烁效果实现
要实现50%不透明度的白色叠加层闪烁,需要结合状态标记、时间控制和绘制逻辑三部分完成,以下是具体改造方案:
1. 扩展Tank类的属性
在Tank类中添加控制闪烁的必要变量:
class Tank(GamePhysicsObject): def __init__(self): # 原有属性保留 self.time_since_death = pygame.time.get_ticks() self.immune = False self.immune_time = 3000 # 新增闪烁控制属性 self.flashing = False # 是否处于闪烁状态 self.flash_tick = pygame.time.get_ticks() # 记录闪烁切换的时间点 self.flash_visible = True # 当前叠加层是否显示
2. 实现start_flashing函数
该函数用于开启闪烁状态并初始化相关变量:
def start_flashing(self): """开启坦克的免疫闪烁效果""" self.flashing = True self.flash_tick = pygame.time.get_ticks() self.flash_visible = True
3. 在post_update中处理闪烁逻辑与停止机制
更新post_update方法,加入闪烁状态的时间控制,同时在免疫结束时停止闪烁:
def post_update(self): current_time = pygame.time.get_ticks() # 处理免疫超时 if current_time - self.time_since_death > self.immune_time: self.immune = False self.flashing = False # 停止闪烁 # 处理闪烁状态切换(每300ms切换一次显示状态,可按需调整) if self.flashing: if current_time - self.flash_tick > 300: self.flash_visible = not self.flash_visible self.flash_tick = current_time
4. 修改坦克的绘制逻辑
在绘制原始坦克精灵后,额外绘制半透明白色叠加层:
def draw(self, screen): # 先绘制原始坦克精灵 super().draw(screen) # 如果处于闪烁状态且当前需要显示叠加层 if self.flashing and self.flash_visible: tank_rect = self.rect # 创建和坦克同尺寸的半透明白色表面 white_overlay = pygame.Surface((tank_rect.width, tank_rect.height), pygame.SRCALPHA) # 设置白色+50%不透明度(alpha值128,范围0-255) white_overlay.fill((255, 255, 255, 128)) # 将叠加层绘制到坦克位置 screen.blit(white_overlay, tank_rect.topleft)
补充优化
如果坦克是不规则形状,可通过mask裁剪叠加层,保证仅在坦克区域显示白色效果:
# 替换上述绘制叠加层的代码 white_overlay = pygame.Surface((tank_rect.width, tank_rect.height), pygame.SRCALPHA) white_overlay.fill((255, 255, 255, 128)) # 用坦克的mask裁剪叠加层 white_overlay.blit(self.mask.to_surface(), (0,0), special_flags=pygame.BLEND_RGBA_MULT) screen.blit(white_overlay, tank_rect.topleft)
内容的提问来源于stack exchange,提问作者Bart
相关产品推荐
相关产品推荐

