色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何用Python放煙花

麥辣雞腿堡 ? 來源:CSDN博客 ? 作者:Leleprogrammer ? 2023-01-14 11:34 ? 次閱讀

首先,需要的外置庫:pygame,pymunk

導入

import pygame

from pygame.locals import *

import pymunk

from pymunk import pygame_util

import sys

import random as rd

import time

import math

然后寫一個主程序類,對pygame進行初始化,設置屏幕寬高,設置標題,創建pymunk空間,然后設置空間的重力為(0,300),然后設置collision_persistence參數為0,表示沒有碰撞,畢竟倆煙花也不會撞一起......然后設置煙花半徑(可以自行修改),創建兩個列表,用于存放煙花爆炸形成的火球和發射到天空中還沒爆炸的煙花,創建一個colors列表,存放煙花的顏色

class Firework:

def init (self):

pygame.init()

self.W,self.H=800,1000

self.screen=pygame.display.set_mode((self.W,self.H))

self.draw_options=pygame_util.DrawOptions(self.screen)

pygame.display.set_caption("2023元旦煙花")

self.space=pymunk.Space()

self.space.gravity=(0,300)

self.space.collision_persistence=0

self.fireball_radius=2

self.fire_radius=2

self.fireballs=[]

self.colors=[

(255,0,0),(255,127,80),(255,140,0),(255,160,122),(240,128,128),(255,99,71),(255,69,0),

(255,105,180),(255,20,147),(208,32,144),(176,48,96),(153,50,204),(255,48,48),

(238,44,44),(205,38,38),(255,255,0),(255,215,0),(255,185,15),(238,201,0),

(34,139,34),(46,139,87),(60,179,113),(0,255,127)

]

self.fires=[]

接下來,進行事件監聽,按下鼠標就可以創建火球

def listen(self):

for event in pygame.event.get():

if event.type==QUIT:

sys.exit()

if event.type==MOUSEBUTTONDOWN:

self.create_firework(x=pygame.mouse.get_pos()[0])

然后寫個創建煙花的方法,首先要有個body,設置body_type為DYNAMIC,因為煙花是動態的。然后設置body的位置,x坐標為傳參的x坐標,y坐標為屏幕最底部,接下來創建一個shape,形狀為circle,body對應的fireball_body傳進去就好了,然后設置radius(半徑),設置shape的彈性(這個不設置也可以,沒多大影響),將body和shape添加到空間中,用add添加,然后將煙花對應的shape對象、顏色、創建時間、爆炸前持續時間這四個參數歸在一個列表,將這個列表添加到fireballs中,最后就是要賦予body沖擊力了,使用apply_impulse_at_local_point方法

def create_firework(self,x):

fireball_body=pymunk.Body(mass=1,moment=100,body_type=pymunk.Body.DYNAMIC)

fireball_body.position=x,self.H

fireball_shape=pymunk.Circle(fireball_body,self.fireball_radius)

fireball_shape.elasticity=0.5

self.space.add(fireball_body,fireball_shape)

self.fireballs.append([fireball_shape,rd.choice(self.colors),time.time(),rd.uniform(1,2.2)]) # shape,color,startTime,lastTime

fireball_body.apply_impulse_at_local_point((0,rd.randint(-730,-500)),(0,0))

然后是draw的代碼(比較多),先是填充背景為黑色,然后使用while循環遍歷fireballs,將煙花繪制出來,檢查是否到達了爆炸時間,如果已經到達爆炸時間,那么將這個火球從煙花的列表中刪掉。接下來就要創建炸開來的火花,火花是向不同方向散開的,所以用for循環遍歷一圈的度數,每隔10°就有一個,length是斜邊長度,然后定義bias偏移量,因為火花散發力量和距離并不是固定的,所以每一次length都會浮動一點,但始終控制在25~100之間(maximum和minimum),因為apply_impulse_at_local_point發射出去時傳參是x軸的力量和y軸的力量,所以要使用三角函數計算臨邊和對邊的長度從而得到apply_impulse_at_local_point傳參的數值,又因為我們遍歷的是度數(degree),sin和cos計算的是弧度(radians),所以要先把度數通過math.radians轉化為弧度,再傳參到sin和cos中。計算出來之后,還是創建body和shape并設置一些基本的參數,添加到空間中,并添加到fires列表中,最后刪除已爆炸的煙花,別忘了變量i需要減1。

上面是對未爆炸的煙花進行遍歷,下面我們還需要對爆炸后形成的火花進行遍歷,如果超出范圍或已到達刪除時間就進行刪除的操作,邏輯差不多

draw的代碼如下

def draw(self):
   self.screen.fill((0,0,0))
   i=0
   while i<len(self.fireballs):
       fireball,color,startTime,lastTime=self.fireballs[i]
       pygame.draw.circle(self.screen,color,fireball.body.position,self.fireball_radius)
       nowTime=time.time()
       boomTime=startTime+lastTime
       if nowTime>boomTime:
           popball=self.fireballs.pop(i)
           length=50
           for degree in range(90,450,10):
               bias=1
               length+=rd.randint(-bias,bias)
               maximum,minimum=100,25
               if length>maximum:
                   length=maximum
               elif lengthmath.radians(degree)
               x_force=math.sin(radians)*length
               y_force=math.cos(radians)*length
               body=pymunk.Body(mass=1,moment=100,body_type=pymunk.Body.DYNAMIC)
               body.position=popball[0].body.position
               shape=pymunk.Circle(body,self.fire_radius)
               self.space.add(body,shape)
               self.fires.append([shape,popball[1],time.time(),rd.uniform(0.5,1.5)]) # shape,color,startTime,lastTime
               body.apply_impulse_at_local_point((x_force,y_force),(0,0))
           self.space.remove(popball[0])
           i-=1
       i+=1
   i=0
   while i<len(self.fires):
       fire,color,startTime,lastTime=self.fires[i]
       pos=fire.body.position
       pygame.draw.circle(self.screen,color,pos,self.fire_radius)
       nowTime=time.time()
       deleteTime=startTime+lastTime
       if nowTime>deleteTime:
           self.fires.pop(i)
           self.space.remove(fire)
           i-=1
       elif pos[0]<0 or pos[0]>self.W or pos[1]>self.H:
           self.fires.pop(i)
           self.space.remove(fire)
           i-=1
       i+=1

寫到這兒,我們的煙花就差不多完成了,最后寫個run

def run(self):

clock=pygame.time.Clock()

FPS=60

while True:

clock.tick(FPS)

self.listen()

self.draw()

self.space.step(1/FPS)

pygame.display.update()

運行

if name ==" main ":

firework=Firework()

firework.run()

這樣就好啦!

最終代碼:

import pygame

from pygame.locals import *

import pymunk

from pymunk import pygame_util

import sys

import random as rd

import time

import math

class Firework:

def init (self):

pygame.init()

self.W,self.H=800,1000

self.screen=pygame.display.set_mode((self.W,self.H))

self.draw_options=pygame_util.DrawOptions(self.screen)

pygame.display.set_caption("2023元旦煙花")

self.space=pymunk.Space()

self.space.gravity=(0,300)

self.space.collision_persistence=0

self.fireball_radius=2

self.fire_radius=2

self.fireballs=[]

self.colors=[

(255,0,0),(255,127,80),(255,140,0),(255,160,122),(240,128,128),(255,99,71),(255,69,0),

(255,105,180),(255,20,147),(208,32,144),(176,48,96),(153,50,204),(255,48,48),

(238,44,44),(205,38,38),(255,255,0),(255,215,0),(255,185,15),(238,201,0),

(34,139,34),(46,139,87),(60,179,113),(0,255,127)

]

self.fires=[]

def listen(self):

for event in pygame.event.get():

if event.type==QUIT:

sys.exit()

if event.type==MOUSEBUTTONDOWN:

self.create_firework(x=pygame.mouse.get_pos()[0])

def create_firework(self,x):

fireball_body=pymunk.Body(mass=1,moment=100,body_type=pymunk.Body.DYNAMIC)

fireball_body.position=x,self.H

fireball_shape=pymunk.Circle(fireball_body,self.fireball_radius)

fireball_shape.elasticity=0.5

self.space.add(fireball_body,fireball_shape)

self.fireballs.append([fireball_shape,rd.choice(self.colors),time.time(),rd.uniform(1,2.2)]) # shape,color,startTime,lastTime

fireball_body.apply_impulse_at_local_point((0,rd.randint(-730,-500)),(0,0))

def draw(self):

self.screen.fill((0,0,0))

i=0

while i

fireball,color,startTime,lastTime=self.fireballs[i]

pygame.draw.circle(self.screen,color,fireball.body.position,self.fireball_radius)

nowTime=time.time()

boomTime=startTime+lastTime

if nowTime>boomTime:

popball=self.fireballs.pop(i)

length=50

for degree in range(90,450,10):

bias=1

length+=rd.randint(-bias,bias)

maximum,minimum=100,25

if length>maximum:

length=maximum

elif length

length=minimum

radians=math.radians(degree)

x_force=math.sin(radians)*length

y_force=math.cos(radians)*length

body=pymunk.Body(mass=1,moment=100,body_type=pymunk.Body.DYNAMIC)

body.position=popball[0].body.position

shape=pymunk.Circle(body,self.fire_radius)

self.space.add(body,shape)

self.fires.append([shape,popball[1],time.time(),rd.uniform(0.5,1.5)]) # shape,color,startTime,lastTime

body.apply_impulse_at_local_point((x_force,y_force),(0,0))

self.space.remove(popball[0])

i-=1

i+=1

i=0

while i

fire,color,startTime,lastTime=self.fires[i]

pos=fire.body.position

pygame.draw.circle(self.screen,color,pos,self.fire_radius)

nowTime=time.time()

deleteTime=startTime+lastTime

if nowTime>deleteTime:

self.fires.pop(i)

self.space.remove(fire)

i-=1

elif pos[0]<0 or pos[0]>self.W or pos[1]>self.H:

self.fires.pop(i)

self.space.remove(fire)

i-=1

i+=1

def run(self):

clock=pygame.time.Clock()

FPS=60

while True:

clock.tick(FPS)

self.listen()

self.draw()

self.space.step(1/FPS)

pygame.display.update()

if name ==" main ":

firework=Firework()

firework.run()

此時我仿佛聽見你說:一直按鼠標手好酸啊!

那沒事,我們改成自動就好啦!

只需要修改一部分內容就好

首先需要一個自定義事件(全局變量)

CREATE_FIREBALL=USEREVENT+1

run中while循環前添加這一行,用來啟動事件循環,第二個參數是間隔時間,單位是毫秒,可以自己修改

pygame.time.set_timer(CREATE_FIREBALL,120)

將listen改成這樣

def listen(self):

for event in pygame.event.get():

if event.type==QUIT:

sys.exit()

if event.type==CREATE_FIREBALL:

self.create_firework(x=rd.randint(0,self.W))

這樣就大功告成啦!

原文鏈接:https://blog.csdn.net/leleprogrammer/article/details/128510460

編輯:何安

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 開發
    +關注

    關注

    0

    文章

    370

    瀏覽量

    40836
  • python
    +關注

    關注

    56

    文章

    4792

    瀏覽量

    84628
收藏 人收藏

    評論

    相關推薦

    請問如何用Python來寫單片機?

    請問如何用Python來寫單片機?
    發表于 06-15 09:29

    何用Python語言控制單片機?

    何用Python語言控制單片機?
    發表于 11-12 06:00

    何用python中的serial向串口發送和接收數據?

    何用python中的serial向串口發送和接收數據?
    發表于 11-22 06:35

    CH32V307評估板如何用Python開發?

    CH32V307評估板如何用Python開發?
    發表于 03-28 20:44

    智能RFID倉庫管理系統之煙花倉庫智能管理

    每到春節,燃放煙花是中國人的傳統習俗。為加強煙花安全管理,加強對煙花生產、儲存、運輸、銷售和燃放的監督檢查,每年元旦、春節期間是煙花生產、銷售、運輸的旺季,無證生產、運輸、存儲販賣
    發表于 12-16 15:18 ?522次閱讀

    RFID在易燃易爆品行業的應用——以煙花倉庫為例

    。影視作品中的很多靈感就是來源于實際生活,可想而知在實際生活中一旦發生這樣的安全事故,要付出的代價可能過之不及。 中國人的節日是歷來要放煙花爆炸來慶祝的,春節則是煙花行業的旺季。無論是生產還是運輸銷售,都有可
    發表于 11-08 14:17 ?451次閱讀

    何用python爬取抖音app數據

    記錄一下如何用python爬取app數據,本文以爬取抖音視頻app為例。
    的頭像 發表于 03-16 09:07 ?5327次閱讀

    何用Python計算提高機器學習算法和結果

    本文將簡要介紹常用的距離度量方法、它們的工作原理、如何用Python計算它們以及何時使用它們。這樣可以加深知識和理解,提高機器學習算法和結果。
    發表于 10-31 10:58 ?613次閱讀

    python有什么用 如何用python創建數據庫

    python有什么用 如何用python創建數據庫 Python是一種高級編程語言,可以用于開發各種類型的應用程序和工具。它的廣泛應用使它在編程領域中極為受歡迎。
    的頭像 發表于 08-28 16:41 ?1173次閱讀

    何用Python自動套用模板批量生成PDF文檔

    今天就給大家講講如何用Python自動套用模板批量生成的PDF文檔。 1.準備 開始之前,你要確保Python和pip已經成功安裝在電腦上噢,如果沒有,請訪問這篇文章: 超詳細Python
    的頭像 發表于 10-17 10:54 ?975次閱讀
    如<b class='flag-5'>何用</b><b class='flag-5'>Python</b>自動套用模板批量生成PDF文檔

    何用Python來實現文件系統的操作功能

    就來介紹一下如何用 Python 來實現這些功能 輸出當前的路徑 我們可以通過 Python 當中的 OS 庫來獲取當前文件所在的位置 import os os .getcwd() 路徑的拼接 我們
    的頭像 發表于 10-30 14:27 ?411次閱讀
    如<b class='flag-5'>何用</b><b class='flag-5'>Python</b>來實現文件系統的操作功能

    何用Python自動套用模板批量生成PDF文檔

    辦最高效的事。 今天就給大家講講如何用Python自動套用模板批量生成下方這樣的PDF文檔。 1.準備 開始之前,你要確保Python和pip已經成功安裝在電腦上噢,如果沒有,請訪問這篇文章: 超詳細
    的頭像 發表于 10-31 10:56 ?1551次閱讀
    如<b class='flag-5'>何用</b><b class='flag-5'>Python</b>自動套用模板批量生成PDF文檔

    何用python實現RFM建模

    今天給大家分享的是如何用python實現RFM建模。 RFM模型的含義 RFM模型是衡量客戶價值和客戶創利能力的重要工具和手段。在眾多的客戶關系管理(CRM)的分析模式中,RFM模型是被廣泛提到
    的頭像 發表于 11-02 10:36 ?841次閱讀
    如<b class='flag-5'>何用</b><b class='flag-5'>python</b>實現RFM建模

    過年DIY了個煙花給女朋友,誰說程序員不懂浪漫?

    千百年來,煙花爆竹被看作是中國人春節的底色,絢爛彌漫的煙花,搭配噼里啪啦的爆竹聲,人們在年味漸濃中享受團聚的歡樂。而近期煙花大師蔡國強的新作品--《海市蜃樓》,也讓放煙花一時成為爆款視
    的頭像 發表于 02-06 15:03 ?523次閱讀
    過年DIY了個<b class='flag-5'>煙花</b>給女朋友,誰說程序員不懂浪漫?

    涂鴉手把手教你DIY超炫酷的龍年煙花!效果超豐富、可玩度更強

    千百年來,煙花爆竹被看作是中國人春節的底色,絢爛彌漫的煙花,搭配噼里啪啦的爆竹聲,人們在年味漸濃中享受團聚的歡樂。而近期煙花大師蔡國強的新作品--《海市蜃樓》,也讓放煙花一時成為爆款視
    的頭像 發表于 02-19 12:59 ?791次閱讀
    涂鴉手把手教你DIY超炫酷的龍年<b class='flag-5'>煙花</b>!效果超豐富、可玩度更強
    主站蜘蛛池模板: 色婷婷国产麻豆AV| 粉嫩无套白浆第一次jk| 在公交车上被JB草坏了被轮J了 | 亚洲欧美综合中文字幕| 中文人妻熟妇精品乱又伦| 俄罗斯mm| 欧美6O老妪与小伙交| 亚洲精品免费在线视频| nxgx69日本护士| 蜜臀久久99精品久久久久久做爰 | 绝对诱惑在线试听| 欧美久久无码AV麻豆| 日本久久高清视频| 无码中文字幕av免费放| 亚洲乱码国产乱码精品精98| 亚洲视频网站欧美视频网站| 99久久精品国产国产毛片| 超碰97超碰在线视频哦| 国产午夜精品理论片在线| 久热在线这里只有精品7| 久久天堂成人影院| 色狠狠一区二区| 亚洲人成7777| gogogo在线观看| 好男人在线高清WWW免费观看| 美女网站免费久久久久久久| 男男肉肉互插腐文| 祺鑫WRITEAS流出来了| ABO成结顶腔锁住| 国产小视频免费在线观看| 高清 国产 在线 亚洲| 风情韵味人妻HD| 国产精品线路一线路二| 精品一成人岛国片在线观看| 女子叉开腿让男子桶免费软件| 亚洲欧美韩国综合色| 草民电影网午夜伦理电影网| 国产一级特黄aa毛片| 狠狠综合久久综合88亚洲| 欧美性类s0x| 无码日韩人妻精品久久蜜桃免费 |