受击闪光
本课属于 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 帧是十分之一秒:足够让人看清,又足够短,让下一次击中也能再次闪白。玩家一眼就能看出攻击命中了。
带图像的精灵也可以用同样的方式闪白:保留一份白色的图像副本,或者将副本填充为白色,并在计数器运行期间绘制它。许多游戏会在玩家受到伤害时让玩家闪红,使用的也是同一个计数器。
挑战
简单每次命中时,都让敌人闪白光。
- 在循环前设置
flash = 0,命中时设置flash = 6。 - 每一帧,只要
flash大于 0,就将它减 1。 - 当
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 在线编辑器