Menu
CoddyTech

淡出并缩小

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

一直保持不变、直到消失的火花看起来就像一个熄灭的点。真实的火花会逐渐冷却:它们会在消亡时缩小并改变颜色。你已经有了表示这一点的数字,也就是粒子的 life。绘制火花时,根据它计算大小和颜色。

半径可以直接根据生命值计算:

radius = p["life"] // 10 + 1

还剩 40 帧时,半径是 5;还剩 9 帧或更少时,半径是 1。+ 1 可以确保半径至少为 1:半径为 0 的圆什么也不会画出来,火花就会提前消失。

颜色可以从几个阶段中选择,从炽热到冷却:

if p["life"] > 25:
    color = (255, 220, 80)
elif p["life"] > 10:
    color = (255, 140, 40)
else:
    color = (180, 50, 40)

先检查较大的数字。如果顺序反过来,life > 10 也会匹配生命值为 30 的情况,黄色分支就永远不会运行。

challenge icon

挑战

中等

让火花在飞行时逐渐冷却。

  1. 将每个火花的半径设为 life // 10 + 1。
  2. 当火花的生命值大于 25 时,将它涂成黄色 (255, 220, 80);大于 10 时涂成橙色 (255, 140, 40);之后涂成深红色 (180, 50, 40)。

按“开始”,再按空格键:圆环会从黄色逐渐变成红色。然后按“检查”。

亲手试试

import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Ring of Sparks")
clock = pygame.time.Clock()

DIRECTIONS = [(3, 0), (2, 2), (0, 3), (-2, 2), (-3, 0), (-2, -2), (0, -3), (2, -2)]
particles = []

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:
            for vx, vy in DIRECTIONS:
                particles.append({"x": 240, "y": 180, "vx": vx, "vy": vy, "life": 40})

    for p in particles:
        p["x"] += p["vx"]
        p["y"] += p["vy"]
        p["life"] -= 1

    screen.fill((20, 20, 36))
    for p in particles:
        if p["life"] > 0:
            pygame.draw.circle(screen, (255, 220, 80), (p["x"], p["y"]), 4)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

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

自己练习: Pygame 在线编辑器