用类写一个以动态星空为背景的烟花
时间: 2024-03-01 14:51:38 浏览: 26
好的,我可以为您编写一个Python类,它可以在动态星空背景下模拟烟花爆炸的效果。以下是代码示例:
```python
import random
import tkinter as tk
class Firework:
def __init__(self, canvas):
self.canvas = canvas
self.id = None
self.x = random.randint(0, canvas.winfo_width())
self.y = random.randint(0, canvas.winfo_height() * 0.6)
self.color = "#" + "%06x" % random.randint(0, 0xFFFFFF)
self.particles = []
self.create_particles()
def create_particles(self):
for i in range(100):
vx = random.uniform(-3, 3)
vy = random.uniform(-3, 3)
particle = self.canvas.create_oval(self.x, self.y, self.x, self.y, width=2, fill=self.color)
self.particles.append((particle, vx, vy))
def explode(self):
for particle in self.particles:
self.canvas.itemconfig(particle[0], state=tk.NORMAL)
self.canvas.move(particle[0], particle[1], particle[2])
self.canvas.after(10, self.fade_out)
def fade_out(self):
for particle in self.particles:
self.canvas.move(particle[0], particle[1], particle[2])
alpha = self.canvas.itemcget(particle[0], "fill")
alpha = alpha[:-2] + "%02x" % (int(alpha[-2:], 16) - 5)
self.canvas.itemconfig(particle[0], fill=alpha)
if int(alpha[-2:], 16) <= 0:
self.cleanup()
else:
self.canvas.after(50, self.fade_out)
def cleanup(self):
for particle in self.particles:
self.canvas.delete(particle[0])
self.canvas.delete(self.id)
class AnimatedBackground:
def __init__(self, canvas):
self.canvas = canvas
self.stars = []
self.create_stars()
self.fireworks = []
self.canvas.bind("<Button-1>", self.create_firework)
self.animate()
def create_stars(self):
for i in range(200):
x = random.randint(0, self.canvas.winfo_width())
y = random.randint(0, self.canvas.winfo_height())
size = random.randint(1, 3)
star = self.canvas.create_oval(x, y, x+size, y+size, fill="white", outline="")
self.stars.append(star)
def create_firework(self, event):
firework = Firework(self.canvas)
self.fireworks.append(firework)
firework.id = self.canvas.create_oval(firework.x, firework.y, firework.x, firework.y, width=0, fill=firework.color)
self.canvas.tag_bind(firework.id, "<Button-1>", lambda e, f=firework: f.explode())
def animate(self):
for star in self.stars:
x = self.canvas.coords(star)[0] + random.uniform(-0.5, 0.5)
y = self.canvas.coords(star)[1] + random.uniform(-0.5, 0.5)
if x < 0:
x = self.canvas.winfo_width()
elif x > self.canvas.winfo_width():
x = 0
if y < 0:
y = self.canvas.winfo_height()
elif y > self.canvas.winfo_height():
y = 0
self.canvas.coords(star, x, y, x+random.randint(1,3), y+random.randint(1,3))
for firework in self.fireworks:
for particle in firework.particles:
if self.canvas.coords(particle[0])[1] > self.canvas.winfo_height():
firework.cleanup()
self.fireworks.remove(firework)
break
self.canvas.after(50, self.animate)
root = tk.Tk()
root.title("Animated Background")
canvas = tk.Canvas(root, width=800, height=600, bg="black")
canvas.pack(fill="both", expand=True)
background = AnimatedBackground(canvas)
root.mainloop()
```
该类使用Python的tkinter库创建了一个GUI窗口,并在其中实现了一个动态星空背景和烟花爆炸的效果。当您单击窗口时,将创建一个新的烟花对象,并模拟其爆炸效果。此外,星空背景也会动态移动,为整个场景增添了更多的动态效果。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)