赞
踩
用python实现一些小游戏,所依赖的包,基本有:tkinter、PIL、以及数学、时间等一系列包;本文介绍一个实现烟花效果的小程序。
Tkinter是Python的标准图形用户界面(GUI)工具包。它是一个用于构建GUI应用程序的模块,可以创建窗口和各种控件,如按钮、标签、文本框、列表框等。
通过Tkinter,我们可以创建各种GUI应用程序,比如计算器、文本编辑器、图形化界面的程序等。Tkinter提供了丰富的功能,可以满足大多数GUI应用程序的需求。
以下是一个使用Tkinter创建一个简单窗口的示例代码:
- mport tkinter as tk
-
- # 创建窗口
- root = tk.Tk()
- root.title("Hello Tkinter")
-
- # 创建标签
- label = tk.Label(root, text="Hello World!")
- label.pack()
-
- # 运行窗口
- root.mainloop()
运行这段代码,就可以看到一个简单的窗口,其中包含一个标签,显示了“Hello World!”这个文本。
PIL (Python Imaging Library) 是处理图像的 Python 库,使得 Python 可以方便地加载、处理和保存各种图像格式,例如 JPEG、PNG、GIF、BMP、TIFF 等等。PIL 提供了各种图像处理工具,例如缩放、剪裁、旋转、滤镜等等,也可以进行图像格式转换和色彩空间转换。PIL 库在 Python 2 中支持得较好,但在 Python 3 中需要安装 Pillow 库才能使用。Pillow 是 PIL 库在 Python 3 中的一个分支,提供了对 Python 3 的支持,并加入了新的功能。
time库是Python标准库中的一个模块,它提供了与时间相关的函数。以下是time库的一些常用函数:
使用time库可轻松地操作时间,比如计时器、计算程序运行时间、控制程序等待等功能。
-
- 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
- colors = ['red', 'blue', 'yellow', 'white', 'green', 'orange', 'purple', 'seagreen', 'indigo', 'cornflowerblue']
- class fireworks:
- 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
- # 烟花绽放 x 轴
- self.x = x
- # 烟花绽放 x 轴
- self.y = y
- self.initial_speed = explosion_speed
- # 外放 x 轴速度
- self.vx = vx
- # 外放 y 轴速度
- 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))
- self.cv.move(self.cid, self.vx + move_x, self.vy + 0.5 * dt)
- self.vy += 0.5 * dt
- # 过期移除
- elif self.cid is not None:
- cv.delete(self.cid)
- self.cid = None
-
- # 定义膨胀效果的时间帧
- def expand(self):
- return self.age <= 1.5
-
- # 检查粒子是否仍在生命周期内
- def alive(self):
- return self.age <= self.lifespan
-
- def ignite(cv):
- t = time()
- # 烟花列表
- explode_points = []
- wait_time = randint(10, 100)
- # 爆炸的个数
- numb_explode = randint(6, 10)
- for point in range(numb_explode):
- # 爆炸粒子列表
- objects = []
- # 爆炸 x 轴
- x_cordi = randint(50, 550)
- # 爆炸 y 轴
- y_cordi = randint(50, 150)
- speed = uniform(0.5, 1.5)
- size = uniform(0.5, 3)
- color = choice(colors)
- # 爆炸的绽放速度
- explosion_speed = uniform(0.2, 1)
- # 爆炸的粒子数半径
- total_particles = randint(10, 50)
- for i in range(1, total_particles):
- r = fireworks(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.8 秒时间帧内保持更新
- while total_time < 1.8:
- # 让画面暂停 0.01s
- 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, ignite, cv)
-
- if __name__ == "__main__":
- root = tk.Tk()
- # 绘制一个画布
- cv = tk.Canvas(root, height=400, width=600)
- # 背景图
- image = Image.open("D001.jpg")
- photo = ImageTk.PhotoImage(image)
- # 在画板上绘制一张图片
- cv.create_image(0, 0, image=photo, anchor='nw')
- cv.pack()
- root.protocol(colors)
- root.after(100, ignite, cv)
- # 生成窗口
- root.mainloop()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。