새해 복 많이 받 으 세 요!python 현란 한 불꽃 피 우기 효과 구현

파 이 썬 프로젝트 를 만 들 었 습 니 다.python 의 시각 화 기법 을 이용 하여 불꽃 이 피 는 효 과 를 내 었 습 니 다.글 의 영감 은 인터넷 의 한 신 에서 나 왔 습 니 다.
환경
Pycharm
모듈
1.tkinter:이 작은 프로젝트 의 주인공 은 python 그래 픽 모듈 입 니 다.또한 Python 3 는 이 모듈 을 자체 적 으로 가지 고 있어 서 따로 설치 할 필요 가 없습니다.자바 의 swing 그래 픽 모듈 과 같 습 니 다.
2.PIL:Python Imaging Library 는 Python 플랫폼 의 이미지 처리 표준 모듈 입 니 다.Python 3 에서 도 자체 적 으로 가 져 왔 습 니 다.이 항목 에서 배경 그림 가 져 오기 에 사 용 됩 니 다.
3.time:이 모듈 은 모두 가 낯 설 지 않 을 것 이 라 고 믿 습 니 다.불꽃놀이 의 피 어 나 고 떨 어 지 며 사라 지 는 시간 을 조절 하기 위해 가 져 옵 니 다.
4.random:난수 모듈,불꽃 랜 덤 좌표 점 생 성,랜 덤 피 어 나 는 속도,랜 덤 으로 사라 지 는 시간.
5.math:이 모듈 도 잘 알 고 있 을 것 입 니 다.불꽃 이 피 는 입 자 를 일정한 각도 로 흩 어 뜨리 는 것 이 목적 입 니 다.
효과

프로젝트 가 최종 적 으로 실현 되 는 효 과 는 위 와 같다.
코드
다음은 제 가 그 큰 신의 코드 를 배우 고 간단 한 주 해 를 추가 한 것 입 니 다.

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.5
#listof colors,can choose randomly or use as queue(FIFO
colors=['red','blue','yellow','white','green','orange','purple','seagreen','indigo','cornflowerblue']
'''
create a class for particles  
particles are emitted almost randomly on the sky,
forming around(     ) of circle(a star)before falling and getting removed from canvas

Attributes(  ):
id:          
x,y:       
vx,vy:       
total:          
age:             
color:    
cv:  
lifespan:             
'''
class part:#                       
 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#     x 
  self.y=y#     x 
  self.initial_speed=explosion_speed#   
  self.vx=vx#  x   
  self.vy=vy#  y   
  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)#create_oval()      ,     x,  y,  x,  y,     ,       id
  self.lifespan=lifespan#      
 def update(self,dt):#    ,       
  self.age+=dt
  #    
  if self.alive() and self.expand():#      (2s)  &&    (1.2s)  
   move_x=cos(radians(self.id*360/self.total))*self.initial_speed#   x     
   move_y=sin(radians(self.id*360/self.total))*self.initial_speed#   y     
   self.cv.move(self.cid, move_x, move_y)#  id         x y   
   self.vx=move_x/(float(dt)*1000)
  #       
  elif self.alive():#          ,        ,      
   move_x=cos(radians(self.id*360/self.total))#x     
   self.cv.move(self.cid,self.vx+move_x,self.vy+GRAVITY*dt)# y            ,         v   a
   self.vy+=GRAVITY*dt#    y 

  elif self.cid is not None:#           ,     
   cv.delete(self.cid)#       
   self.cid=None
 #          
 def expand(self):
  return self.age<=1.2#      1.2s
 #             
 def alive(self):#                
  return self.age<=self.lifespan
'''
      :
                 
    “  ”         ,                  (   ,             )              
'''
#        
def simulate(cv):
 t=time()#time()     1970         ,       6 
 explode_points=[]#     --    
 wait_time=randint(10,100)#      int n,10<=n<=100
 numb_explode=randint(6,10)#      6~10
 #                    
 for point in range(numb_explode):#       
  objects=[]#            
  x_cordi=randint(50,550)#      x 
  y_cordi=randint(50,150)#  y 
  speed=uniform(0.5,1.5)#      float speed,0.5<=speed<1.5
  size=uniform(0.5,3)#      float size,0.5<=size<3
  color=choice(colors)#choice() python    ,      ,  ,         
  explosion_speed=uniform(0.2,1)#             
  total_particles=randint(10,50)#             
  for i in range(1,total_particles):#               ,  ,       
   r = part(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#     0
 # 1.8         
 while total_time<1.8:
  sleep(0.01)#     0.01s
  tnew=time()#    
  t,dt=tnew,tnew-t#       ,        tnew-t
  for point in explode_points:#      
   for item in point:#          
    item.update(dt)#    
  cv.update()#    
  total_time+=dt#    while      
 root.after(wait_time,simulate,cv)#           ,       ,     ,           ,        
def close(*ignore):
 #           
 global root
 root.quit()

if __name__=="__main__":
 root=tk.Tk()
 cv=tk.Canvas(root,height=600,width=700)#      
 #        
 #cv.create_rectangle(0,0,600,600,fill="black")
 #use a nice background image
 image=Image.open("L:\PyCharm Community Edition 2018.2.2\Python_program\image.jpg")
 photo=ImageTk.PhotoImage(image)
 cv.create_image(0,0,image=photo,anchor='nw')#          
 cv.pack()# cv    
 root.protocol("WM_DELETE_WINDOW",close)
 # 0.1s      stimulate()
 root.after(100,simulate,cv)#  stimulate          
 root.mainloop()#  root,    
#       python      
마무리
이 블 로 그 는 당분간 이렇다.기회 가 된다 면 다시 할 것 이지 만,가장 큰 가능성 은 기약 이 없 을 것 이다.먼저 항목 에 대해 다음 과 같이 수정 할 계획 입 니 다.
1.마우스 인 터 랙 션 기능 을 추가 하고 사용자 가 마우스 로 클릭 한 위치 에 불꽃 이 추가 로 피 어 납 니 다.
2.텍스트 그리 기 기능 을 추가 합 니 다.배경 그림 에 글자 가 숨겨 져 있 습 니 다.불꽃 이 피 면 글자 에 떨 어 지 는 입자 가 사라 지지 않 고 창 에 고정 되 어 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기