python代码画动态烟花_如何用python画烟花

本文介绍了如何使用Python实现动态烟花效果。通过创建粒子类,模拟粒子的扩大、下坠和消失过程,结合tkinter库在画布上绘制。代码中包含随机颜色选择、自由落体运动以及粒子生命周期管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用python画烟花的方法:首先创建一个所有粒子同时扩大的二维列表;然后实现粒子范围扩大,以自由落体坠落;接着移除超过最高时长的粒子;最后循环调用保持不停。

b2c19d4f2ec50f09482506ecbfb2823a.png

用python画烟花的方法:# -*- coding: utf-8 -*-

# Nola

import tkinter as tk

from PIL import Image, ImageTk

from time import time, sleep

from random import choice, uniform, randint

from math import sin, cos, radians

# 模拟重力

GRAVITY = 0.05

# 颜色选项(随机或者按顺序)

colors = ['red', 'blue', 'yellow', 'white', 'green', 'orange', 'purple', 'seagreen', 'indigo', 'cornflowerblue']

'''

particles 类

粒子在空中随机生成随机,变成一个圈、下坠、消失

属性:

- id: 粒子的id

- x, y: 粒子的坐标

- vx, vy: 在坐标的变化速度

- total: 总数

- age: 粒子存在的时长

- color: 颜色

- cv: 画布

- lifespan: 最高存在时长

'''

class Particle:

def __init__(self, cv, idx, total, explosion_speed, x=0., y=0., vx=0., vy=0., size=2., color='red', lifespan=2,

**kwargs):

self.id = idx

self.x = x

self.y = y

self.initial_speed = explosion_speed

self.vx = vx

self.vy = vy

self.total = total

self.age = 0

self.color = color

self.cv = cv

self.cid = self.cv.create_oval(

x - size, y - size, x + size,

y + size, fill=self.color)

self.lifespan = lifespan

def update(self, dt):

self.age += dt

# 粒子范围扩大

if self.alive() and self.expand():

move_x = cos(radians(self.id * 360 / self.total)) * self.initial_speed

move_y = sin(radians(self.id * 360 / self.total)) * self.initial_speed

self.cv.move(self.cid, move_x, move_y)

self.vx = move_x / (float(dt) * 1000)

# 以自由落体坠落

elif self.alive():

move_x = cos(radians(self.id * 360 / self.total))

# we technically don't need to update x, y because move will do the job

self.cv.move(self.cid, self.vx + move_x, self.vy + GRAVITY * dt)

self.vy += GRAVITY * dt

# 移除超过最高时长的粒子

elif self.cid is not None:

cv.delete(self.cid)

self.cid = None

# 扩大的时间

def expand (self):

return self.age <= 1.2

# 粒子是否在最高存在时长内

def alive(self):

return self.age <= self.lifespan

'''

循环调用保持不停

'''

def simulate(cv):

t = time()

explode_points = []

wait_time = randint(10, 100)

numb_explode = randint(6, 10)

# 创建一个所有粒子同时扩大的二维列表

for point in range(numb_explode):

objects = []

x_cordi = randint(50, 550)

y_cordi = randint(50, 150)

speed = uniform(0.5, 1.5)

size = uniform(1, 3)

color = choice(colors)

explosion_speed = uniform(0.2, 1)

total_particles = randint(10, 50)

for i in range(1, total_particles):

r = Particle(cv, idx=i, total=total_particles, explosion_speed=explosion_speed, x=x_cordi, y=y_cordi,

vx=speed, vy=speed, color=color, size=size, lifespan=uniform(0.6, 1.75))

objects.append(r)

explode_points.append(objects)

total_time = .0

# 1.8s内一直扩大

while total_time < 1.8:

sleep(0.01)

tnew = time()

t, dt = tnew, tnew - t

for point in explode_points:

for item in point:

item.update(dt)

cv.update()

total_time += dt

# 循环调用

root.after(wait_time, simulate, cv)

def close(*ignore):

"""退出程序、关闭窗口"""

global root

root.quit()

if __name__ == '__main__':

root = tk.Tk()

cv = tk.Canvas(root, height=400, width=600)

# 绘制一个黑色背景

cv.create_rectangle(0, 0, 600, 400, fill='black')

# cv = tk.Canvas(root, height=400, width=600)

# # 选一个好看的背景会让效果更惊艳!

# image = Image.open("./image.jpg")

# photo = ImageTk.PhotoImage(image)

#

# cv.create_image(0, 0, image=photo, anchor='nw')

cv.pack()

root.protocol("WM_DELETE_WINDOW", close)

root.after(100, simulate, cv)

root.mainloop()

实现效果图:

779e1c96af3e1c534df593a66e938b96.png

Python烟花代码通常指用于创建动态效果的库或模块,特别是在处理形界面(GUI)或者数据可视化时。比如,`pygame`是一个常用的Python游戏开发库,可以用来制作简单的效果,包括“烟花”般的效果。通过控制像素点的颜色、位置和运轨迹,你可以模拟出各种视觉上的火花绽放。 以下是一个简单的使用pygame绘制烟花效果的例子: ```python import pygame import random # 初始化Pygame pygame.init() # 设置窗口大小 screen = pygame.display.set_mode((500, 500)) # 烟花颜色和起始位置 colors = [(255, 0, 0), (0, 255, 0), (0, 0, 255)] positions = [(random.randint(0, screen.get_width()), random.randint(0, screen.get_height())) for _ in range(100)] while True: # 清空屏幕 screen.fill((0, 0, 0)) # 遍历烟花,每次更新位置并改变颜色 for i, (color, pos) in enumerate(positions): size = int(random.random() * 5 + 1) pygame.draw.circle(screen, color, pos, size) if size <= 0 or i >= len(positions) - 1: # 当烟花消失或所有烟花发射完后删除 positions.pop(i) else: pos[0] += random.randint(-1, 1) # 随机移 pos[1] += random.randint(-1, 1) # 更新显示 pygame.display.flip() # 检查事件(如关闭窗口) for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() ``` 这个代码会创建一个包含100个随机位置和颜色的烟花,每个烟花会在屏幕上随机移直到消失。如果你想创建更复杂的烟花效果,可以考虑使用专门的库或者结合数学原理模拟烟花的爆炸过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值