Menu
CoddyTech

受击闪光

本课属于 Coddy Pygame 学习旅程的“音效与游戏体验”单元。第 13 课,共 23 课。

击中敌人时,游戏应该立即显示出来,即使生命值条还没有变化。常见的做法是使用受击闪白:敌人会有几帧显示为全白。

这需要一个计数器,用来记录还要闪白多少帧。受到攻击时设置计数器,每帧将它减小:

flash = 0
...
# 受到一次攻击
hp -= 1
flash = 6
...
# 每一帧
if flash > 0:
    flash -= 1

绘制时,计数器决定颜色:

if flash > 0:
    pygame.draw.rect(screen, (255, 255, 255), enemy)
else:
    pygame.draw.rect(screen, (220, 80, 80), enemy)

6 帧是十分之一秒:足够让人看清,又足够短,让下一次击中也能再次闪白。玩家一眼就能看出攻击命中了。

带图像的精灵也可以用同样的方式闪白:保留一份白色的图像副本,或者将副本填充为白色,并在计数器运行期间绘制它。许多游戏会在玩家受到伤害时让玩家闪红,使用的也是同一个计数器。

challenge icon

挑战

简单

每次命中时,都让敌人闪白光。

  1. 在循环前设置 flash = 0,命中时设置 flash = 6。
  2. 每一帧,只要 flash 大于 0,就将它减 1。
  3. 当 flash 大于 0 时,将敌人绘制成白色 (255, 255, 255),否则绘制成红色。

按“开始”,再按空格键:敌人会闪白光。然后点击“检查”。

亲手试试

import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Training Dummy")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)

hit_sound = pygame.mixer.Sound("assets/sounds/hit.ogg")
player = pygame.Rect(120, 150, 60, 60)
enemy = pygame.Rect(300, 150, 60, 60)
hp = 5

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE and hp > 0:
            hp -= 1
            hit_sound.play()

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (80, 160, 255), player)
    if hp > 0:
        pygame.draw.rect(screen, (220, 80, 80), enemy)
    label = font.render(f"Enemy HP: {hp}", True, (240, 240, 240))
    screen.blit(label, (300, 110))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

音效与游戏体验中的所有课

自己练习: Pygame 在线编辑器