当前位置:   article > 正文

python语言:烟花效果实现

python语言:烟花效果实现

一、说明

        用python实现一些小游戏,所依赖的包,基本有:tkinter、PIL、以及数学、时间等一系列包;本文介绍一个实现烟花效果的小程序。

二、依赖包分解

2.1 窗口依赖tkinter

        Tkinter是Python的标准图形用户界面(GUI)工具包。它是一个用于构建GUI应用程序的模块,可以创建窗口和各种控件,如按钮、标签、文本框、列表框等。

        通过Tkinter,我们可以创建各种GUI应用程序,比如计算器、文本编辑器、图形化界面的程序等。Tkinter提供了丰富的功能,可以满足大多数GUI应用程序的需求。

        以下是一个使用Tkinter创建一个简单窗口的示例代码:

  1. mport tkinter as tk
  2. # 创建窗口
  3. root = tk.Tk()
  4. root.title("Hello Tkinter")
  5. # 创建标签
  6. label = tk.Label(root, text="Hello World!")
  7. label.pack()
  8. # 运行窗口
  9. root.mainloop()

        运行这段代码,就可以看到一个简单的窗口,其中包含一个标签,显示了“Hello World!”这个文本。

2.3 图片处理pil

        PIL (Python Imaging Library) 是处理图像的 Python 库,使得 Python 可以方便地加载、处理和保存各种图像格式,例如 JPEG、PNG、GIF、BMP、TIFF 等等。PIL 提供了各种图像处理工具,例如缩放、剪裁、旋转、滤镜等等,也可以进行图像格式转换和色彩空间转换。PIL 库在 Python 2 中支持得较好,但在 Python 3 中需要安装 Pillow 库才能使用。Pillow 是 PIL 库在 Python 3 中的一个分支,提供了对 Python 3 的支持,并加入了新的功能。

2.4 time库

        time库是Python标准库中的一个模块,它提供了与时间相关的函数。以下是time库的一些常用函数:

  1. time():获取当前时间戳,即从1970年1月1日0时0分0秒开始到现在的秒数。
  2. localtime():获取本地时间,返回一个time.struct_time结构体对象,包含年、月、日、时、分、秒等信息。
  3. strftime():将时间格式化为指定的字符串形式。
  4. mktime():将一个time.struct_time结构体对象转换为时间戳。
  5. sleep():先让程序暂停一定的时间,以便在这段时间内执行其他任务。

使用time库可轻松地操作时间,比如计时器、计算程序运行时间、控制程序等待等功能。

三、用tkinter实现一个实现烟花的程序

  1. import tkinter as tk
  2. from PIL import Image, ImageTk
  3. from time import time, sleep
  4. from random import choice, uniform, randint
  5. from math import sin, cos, radians
  6. colors = ['red', 'blue', 'yellow', 'white', 'green', 'orange', 'purple', 'seagreen', 'indigo', 'cornflowerblue']
  7. class fireworks:
  8. def __init__(self, cv, idx, total, explosion_speed, x=0., y=0., vx=0., vy=0., size=2., color='red', lifespan=2, **kwargs):
  9. self.id = idx
  10. # 烟花绽放 x 轴
  11. self.x = x
  12. # 烟花绽放 x 轴
  13. self.y = y
  14. self.initial_speed = explosion_speed
  15. # 外放 x 轴速度
  16. self.vx = vx
  17. # 外放 y 轴速度
  18. self.vy = vy
  19. # 绽放的粒子数
  20. self.total = total
  21. # 已停留时间
  22. self.age = 0
  23. # 颜色
  24. self.color = color
  25. # 画布
  26. self.cv = cv
  27. self.cid = self.cv.create_oval(x - size, y - size, x + size, y + size,
  28. fill=self.color)
  29. self.lifespan = lifespan
  30. # 更新数据
  31. def update(self, dt):
  32. self.age += dt
  33. # 粒子膨胀
  34. if self.alive() and self.expand():
  35. move_x = cos(radians(self.id * 360 / self.total)) * self.initial_speed
  36. move_y = sin(radians(self.id * 360 / self.total)) * self.initial_speed
  37. self.cv.move(self.cid, move_x, move_y)
  38. self.vx = move_x / (float(dt) * 1000)
  39. # 膨胀到最大下落
  40. elif self.alive():
  41. move_x = cos(radians(self.id * 360 / self.total))
  42. self.cv.move(self.cid, self.vx + move_x, self.vy + 0.5 * dt)
  43. self.vy += 0.5 * dt
  44. # 过期移除
  45. elif self.cid is not None:
  46. cv.delete(self.cid)
  47. self.cid = None
  48. # 定义膨胀效果的时间帧
  49. def expand(self):
  50. return self.age <= 1.5
  51. # 检查粒子是否仍在生命周期内
  52. def alive(self):
  53. return self.age <= self.lifespan
  54. def ignite(cv):
  55. t = time()
  56. # 烟花列表
  57. explode_points = []
  58. wait_time = randint(10, 100)
  59. # 爆炸的个数
  60. numb_explode = randint(6, 10)
  61. for point in range(numb_explode):
  62. # 爆炸粒子列表
  63. objects = []
  64. # 爆炸 x 轴
  65. x_cordi = randint(50, 550)
  66. # 爆炸 y 轴
  67. y_cordi = randint(50, 150)
  68. speed = uniform(0.5, 1.5)
  69. size = uniform(0.5, 3)
  70. color = choice(colors)
  71. # 爆炸的绽放速度
  72. explosion_speed = uniform(0.2, 1)
  73. # 爆炸的粒子数半径
  74. total_particles = randint(10, 50)
  75. for i in range(1, total_particles):
  76. r = fireworks(cv, idx=i, total=total_particles, explosion_speed=explosion_speed, x=x_cordi, y=y_cordi,
  77. vx=speed, vy=speed, color=color, size=size,
  78. lifespan=uniform(0.6, 1.75))
  79. # 添加进粒子列表里
  80. objects.append(r)
  81. # 把粒子列表添加到烟花列表
  82. explode_points.append(objects)
  83. total_time = .0
  84. # 在 1.8 秒时间帧内保持更新
  85. while total_time < 1.8:
  86. # 让画面暂停 0.01s
  87. sleep(0.01)
  88. # 刷新时间
  89. tnew = time()
  90. t, dt = tnew, tnew - t
  91. # 遍历烟花列表
  92. for point in explode_points:
  93. # 遍历烟花里的粒子列表
  94. for item in point:
  95. # 更新时间
  96. item.update(dt)
  97. # 刷新页面
  98. cv.update()
  99. total_time += dt
  100. root.after(wait_time, ignite, cv)
  101. if __name__ == "__main__":
  102. root = tk.Tk()
  103. # 绘制一个画布
  104. cv = tk.Canvas(root, height=400, width=600)
  105. # 背景图
  106. image = Image.open("D001.jpg")
  107. photo = ImageTk.PhotoImage(image)
  108. # 在画板上绘制一张图片
  109. cv.create_image(0, 0, image=photo, anchor='nw')
  110. cv.pack()
  111. root.protocol(colors)
  112. root.after(100, ignite, cv)
  113. # 生成窗口
  114. root.mainloop()

四、实现效果 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/70919
推荐阅读
相关标签
  

闽ICP备14008679号