|
以下是修正后的烟花模拟代码,主要修复了初始化问题、列表未定义问题以及烟花爆炸逻辑:
- import pygame
- import random
- import math
- import sys
- pygame.init()
- WIDTH, HEIGHT = 800, 600
- screen = pygame.display.set_mode((WIDTH, HEIGHT))
- pygame.display.set_caption("烟花(作者:尉尉的可乐)")
- clock = pygame.time.Clock()
- BLACK = (0, 0, 0)
- class Particle:
- def __init__(self, x, y, angle, speed, color, radius=2, life=255):
- self.x = x
- self.y = y
- self.radius = radius
- self.speed = speed
- self.angle = angle
- self.color = color
- self.life = life
- def update(self):
- self.speed *= 0.96
- self.x += math.cos(self.angle) * self.speed
- self.y += math.sin(self.angle) * self.speed + 0.6
- self.life -= 6
- def draw(self, surface):
- if self.life > 0:
- faded_color = (*self.color, self.life)
- s = pygame.Surface((self.radius * 2, self.radius * 2), pygame.SRCALPHA)
- pygame.draw.circle(s, faded_color, (self.radius, self.radius), self.radius)
- surface.blit(s, (self.x - self.radius, self.y - self.radius))
- class Firework:
- def __init__(self):
- self.x = random.randint(100, WIDTH - 100)
- self.y = HEIGHT
- self.target_y = random.randint(100, 300)
- self.color = (random.randint(50, 255), random.randint(50, 255), random.randint(50, 255))
- self.speed = -10
- self.exploded = False
- self.particles = [] # 初始化粒子列表
- self.trails = [] # 初始化尾迹列表
- self.radius = 5 # 添加烟花半径
- def update(self):
- if not self.exploded:
- # 添加上升尾迹
- for _ in range(2):
- angle = random.uniform(math.pi / 4, 3 * math.pi / 4)
- speed = random.uniform(0.5, 1.5)
- trail = Particle(self.x, self.y, angle + math.pi, speed, self.color, radius=1, life=80)
- self.trails.append(trail)
-
- # 更新位置
- self.y += self.speed
-
- # 到达目标高度时爆炸
- if self.y <= self.target_y:
- self.exploded = True
- # 生成爆炸粒子
- for _ in range(100):
- angle = random.uniform(0, 2 * math.pi)
- speed = random.uniform(1, 8)
- particle = Particle(
- self.x, self.y,
- angle, speed,
- self.color,
- radius=random.randint(1, 3)
- )
- self.particles.append(particle)
-
- # 更新尾迹
- for trail in self.trails:
- trail.update()
- self.trails = [t for t in self.trails if t.life > 0]
-
- # 更新爆炸粒子
- for particle in self.particles:
- particle.update()
- self.particles = [p for p in self.particles if p.life > 0]
- def draw(self, surface):
- # 绘制尾迹
- for trail in self.trails:
- trail.draw(surface)
-
- # 绘制爆炸粒子
- for particle in self.particles:
- particle.draw(surface)
-
- # 绘制未爆炸的烟花主体
- if not self.exploded:
- s = pygame.Surface((10, 10), pygame.SRCALPHA)
- pygame.draw.circle(s, self.color, (5, 5), self.radius)
- surface.blit(s, (self.x - 5, self.y - 5))
- class Ripple:
- def __init__(self, x, y):
- self.x = x
- self.y = y
- self.radius = 5
- self.alpha = 255
-
- def update(self):
- self.radius += 2
- self.alpha -= 5
- if self.alpha < 0:
- self.alpha = 0
-
- def draw(self, surface):
- if self.alpha > 0:
- s = pygame.Surface((self.radius * 2, self.radius * 2), pygame.SRCALPHA)
- pygame.draw.circle(s, (120, 180, 255, self.alpha), (self.radius, self.radius), self.radius, 2)
- surface.blit(s, (self.x - self.radius, self.y - self.radius))
- # 初始化列表
- fireworks = []
- ripples = []
- last_ripple_time = 0
- def main():
- global last_ripple_time
- while True:
- screen.fill(BLACK)
-
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- pygame.quit()
- sys.exit()
-
- elif event.type == pygame.MOUSEBUTTONDOWN:
- x, y = event.pos
- ripples.append(Ripple(x, y))
-
- elif event.type == pygame.MOUSEMOTION:
- if pygame.mouse.get_pressed()[0]: # 检查左键是否按下
- x, y = event.pos
- if pygame.time.get_ticks() - last_ripple_time > 20:
- ripples.append(Ripple(x, y))
- last_ripple_time = pygame.time.get_ticks()
-
- # 随机生成新烟花
- if random.random() < 0.05: # 降低生成频率
- fireworks.append(Firework())
-
- # 更新并绘制烟花
- for fw in fireworks[:]: # 使用副本遍历避免修改问题
- fw.update()
- fw.draw(screen)
- fireworks = [fw for fw in fireworks if not fw.exploded or fw.particles]
-
- # 更新并绘制涟漪
- for r in ripples[:]:
- r.update()
- r.draw(screen)
- ripples = [r for r in ripples if r.alpha > 0]
-
- pygame.display.flip()
- clock.tick(60)
- if __name__ == "__main__":
- main()
复制代码
### 主要修复内容:
1. 初始化问题修复:
- 添加了 self.particles = [] 和 self.trails = [] 初始化
- 为烟花添加了随机颜色生成
- 给烟花主体添加了半径属性 self.radius = 5
2. 爆炸逻辑完善:
- 当烟花到达目标高度时生成100个爆炸粒子
- 粒子具有随机角度和速度
- 尾迹和粒子会自动消失(根据life值)
3. 鼠标交互修复:
- 修复了鼠标移动检测逻辑 pygame.mouse.get_pressed()[0]
- 添加了涟漪生成频率限制(20ms)
4. 对象管理优化:
- 使用列表推导式清理已完成的烟花和涟漪
- 遍历时使用副本避免修改异常
### 使用说明:
1. 程序会自动随机生成烟花
2. 鼠标点击会在点击位置产生蓝色涟漪
3. 按住鼠标移动会产生连续的涟漪效果
4. 按关闭按钮退出程序
这个修正版本包含了完整的烟花上升、爆炸、粒子消散效果,以及鼠标交互的涟漪效果,所有对象都会在生命周期结束后自动清理。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|