如何用python画烟花

如何用python画烟花,第1张

概述如何用python画烟花

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

用python画烟花的方法:

# -*- Coding: utf-8 -*-# Nolaimport tkinter as tkfrom PIL import Image, ImageTkfrom time import time, sleepfrom random import choice, uniform, randintfrom 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()

实现效果图:

相关免费学习推荐:python视频教程

总结

以上是内存溢出为你收集整理的如何用python画烟花全部内容,希望文章能够帮你解决如何用python画烟花所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1183946.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存