实现效果描述
这大过年的不弄点有意思的怎么行呢?可以考虑用编程实现一个烟花升空-爆炸-绚丽地效果。随机的烟花也玩习惯了,这次我们用pygame实现用户鼠标点击屏幕实现放烟花并在指定高度绽放~
效果
鼠标点击时,烟花点会从屏幕底部正中心发射至鼠标点击点处并绽放出随机的颜色,烟花颗粒符合物理规律,看上去很和谐,并且会随机消失做出闪烁的效果。
那么一起来看看是如何实现的吧~
代码地址
https://gitee.com/DogMonkeys/daily-script/tree/master/fireworks 直接访问即可
解析
main.py
import core
def main():
core.init()
while True:
core.loop()
if __name__ == "__main__":
main()
很简单,调用core模块中的初始化函数和主循环函数
core.py
import pygame
from fireworks import Fireworks
g_fireworks = None # 烟花主类
def init():
global g_fireworks
pygame.init()
screen = pygame.display.set_mode([800, 600])
pygame.mouse.set_visible(1)
pygame.display.set_caption("烟花")
g_fireworks = Fireworks(screen)
clock = pygame.time.Clock()
def loop():
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
else:
g_fireworks.run(event)
clock.tick(24)
pygame.display.update()
这里为了简化,直接使用全局变量g_fireworks保存游戏运行主类。
初始化函数中,调用pygame库提供的初始化各项参数方法,包括设定窗口大小和标题,设定鼠标可见,等等
然后设定全局变量clock用来控制全局的帧率。(我也不知道为啥要弄一个global,但是当时就这么写的懒得改了反正没啥大问题,这部分的源码未经优化,许多地方都可以改得让其更顺畅,更符合标准。)
最后是loop主循环函数,不断遍历pygame事件表,如果有退出信号就退出(很正常,点击“X”或者按alt+F4都会触发)。其他事件交给firework主类完成。
遍历完事件后就进行迭代更新工作,不用解释,刷新屏幕和控制帧率
接下来最重要的部分来了,控制烟花的运行!
fireworks.py
先贴出全部代码吧:
import math
import pygame
from random import randint
from math import sin, cos, radians, tan
class Point:
def __init__(self, idx, pos, screen, color) -> None:
self.rad = radians(idx*6)
self.x = pos[0]
self.y = pos[1]
self.t = 0
self