如何用python画烟花


本文摘自php中文网,作者coldplay.xixi,侵删。

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

用python画烟花的方法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

# -*- 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()

实现效果图:

阅读剩余部分

相关阅读 >>

Python的三种程序结构是什么

如何修改Python字典内的值?2种修改Python字典内的值方法总结

什么是 Python

pytho 中闭包与装饰器详解

1%的人知道的pandas骚操作,传授给你

Python该怎么学才快

Python怎么输出列表

Python opencv检测并提取目标颜色

Python迭代器的实例详解

Python怎么批量合并excel表格

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...