python人工降雪 2.0版本

前言:上次昼汗,參考了Ahab的文章俩莽,實現(xiàn)了一個簡單的降雪腳本。但是乔遮,身為一個強(qiáng)迫癥患者扮超,怎么能用圓代替大自然那完美的六邊形的雪花那。所以蹋肮,今天出刷,我就在上次的基礎(chǔ)上,改進(jìn)了一下,對比一下:

1.0版本


01.png

2.0版本


00.png

是不是和大自然的雪花更加像了坯辩。

好馁龟,接下來,看一下如何實現(xiàn)漆魔。

源碼:

    '''
人工降雪v2.0
Data:2018-12-11
Author:Lingyin
reference:https://mp.weixin.qq.com/s/fki-eGBzrSsz2xDbk--vpw


'''

import pygame
import random
import os
from pygame.locals import *
from pygame.compat import geterror

if not pygame.mixer: print('Warning, sound disabled')

SIZE = (1300,700)
#設(shè)置一些基本的顏色
BLACK = (0,0,0)
WHITE = (255,255,255)
RED = (255,0,0)
GREEN = (0,255,0)
BLUE = (0,0,255)


main_dir = os.path.split(os.path.abspath(__file__))[0]
data_dir = os.path.join(main_dir, 'data')

#初始化
pygame.init()

screen = pygame.display.set_mode(SIZE)
#設(shè)置標(biāo)題
pygame.display.set_caption('唯美雪景')

#設(shè)置鼠標(biāo)光標(biāo)不可見
pygame.mouse.set_visible(0)

#加載圖片坷檩,利用os模塊,實現(xiàn)跨平臺
def load_image(name):
    fullname = os.path.join(data_dir,name)

    try:
        image = pygame.image.load(fullname)
    except pygame.error as e:
        raise e
    image = image.convert()
    return image


def load_sound(name):
    class NoneSound:
        def play(self): pass
    if not pygame.mixer or not pygame.mixer.get_init():
        return NoneSound()
    fullname = os.path.join(data_dir, name)
    print(fullname)
    try:
        pygame.mixer.music.load(fullname)
        pygame.mixer.music.play()
    except pygame.error:
        print('Cannot load sound: %s' % fullname)
        raise SystemExit(str(geterror()))
    
class Snow(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.width = random.randrange(5,15)
        self.image = pygame.transform.scale(load_image('snowflake.png'),(self.width,self.width))
        self.image.set_colorkey(BLACK)
        self.rect = self.image.get_rect()
        self.rect.x = random.randrange(0,1300)
        self.rect.y = random.randrange(0,700)
        self.speedx = random.randrange(-3,5)
        self.speedy = random.randrange(3,5)
    def update(self):
        self.rect.x += self.speedx
        self.rect.y += self.speedy
        if self.rect.x > SIZE[0] or self.rect.x < 0 or self.rect.y > SIZE[1]:
            self.rect.x = random.randrange(0,1300)
            self.rect.y = 0


flow = pygame.sprite.Group()

for i in range(300):
    s = Snow()
    flow.add(s)

def main():




#加載背景
background = load_image('Lingyin0.jpg')

screen.blit(background,(0,0))

#顯示背景
pygame.display.flip()

clock = pygame.time.Clock()

snow = Snow()

load_sound('flower.mp3')

#主循環(huán)
going = True
while going:

    clock.tick(20)
    for event in pygame.event.get():
        if event.type == QUIT:
            going = False
        elif event.type == KEYDOWN and event.key == K_ESCAPE:
            going = False

        
    flow.update()
    flow.draw(screen)
    
    pygame.display.flip()   
    screen.blit(background, (0, 0))



pygame.quit()



if __name__ == '__main__':
    main()

其實和上次的代碼改抡,沒有太大的區(qū)別矢炼。最主要的就是,這次我增加了一個Snow類阿纤。下面句灌,我逐步講解。

class Snow(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.width = random.randrange(5,15)
        self.image = pygame.transform.scale(load_image('snowflake.png'),(self.width,self.width))
        self.image.set_colorkey(BLACK)
        self.rect = self.image.get_rect()
        self.rect.x = random.randrange(0,1300)
        self.rect.y = random.randrange(0,700)
        self.speedx = random.randrange(-3,5)
        self.speedy = random.randrange(3,5)
    def update(self):
        self.rect.x += self.speedx
        self.rect.y += self.speedy
        if self.rect.x > SIZE[0] or self.rect.x < 0 or self.rect.y > SIZE[1]:
            self.rect.x = random.randrange(0,1300)
            self.rect.y = 0#random.randrange(0,700) 

首先,定義了一個Snow類胰锌,它繼承自pygame.sprite.Sprite,這是pygame模塊內(nèi)部的一個類骗绕,不用管它是什么,只管用就行资昧。

load_image('snowflake.png')

這個函數(shù)和1.0版本的一樣酬土,不需要講解。
下面我們看看pygame.transform.scale()這個函數(shù)

self.image = pygame.transform.scale(load_image('snowflake.png'),(self.width,self.width))

這個函數(shù)的作用就是改變圖片的尺寸格带,所以它接受兩個參數(shù)撤缴,一個是我們加載的圖片,另一個是元組践惑,也就是要改變的大小腹泌。將改變后的圖片交給自定義的self.image.由于雪花的大小并不是一樣的,所以在實例初始化的時候尔觉,我們隨機(jī)生成了它的大小:

self.width = random.randrange(5,15)

用過貼圖做程序的同學(xué)一定知道凉袱,我們加載的圖片,是一個矩形侦铜,但是當(dāng)我們玩游戲的時候专甩,角色并不是矩形的啊钉稍?這就需要下面這條語句來處理了:

self.image.set_colorkey(BLACK)

用它處理后涤躲,我們的雪花,看起來才是一個六邊形的形狀贡未,那如果种樱,不加這條語句會是什么效果,看一下:

02.png

看見雪花周圍的黑色框框了嗎

self.rect = self.image.get_rect()
self.rect.x = random.randrange(0,1300)
self.rect.y = random.randrange(0,700)
self.speedx = random.randrange(-3,5)
self.speedy = random.randrange(3,5)

然后俊卤,通過self.image的get_rect方法嫩挤,獲取了雪花圖片本身這個矩形
并且通過隨機(jī)函數(shù)對它的起始坐標(biāo)進(jìn)行了賦值。最后消恍,對它在x和y軸的速度進(jìn)行了隨機(jī)賦值岂昭。

接下來是update()函數(shù)

def update(self):
    self.rect.x += self.speedx
    self.rect.y += self.speedy
    if self.rect.x > SIZE[0] or self.rect.x < 0 or self.rect.y > SIZE[1]:
        self.rect.x = random.randrange(0,1300)
        self.rect.y = 0

update()是用來移動雪花,也就是更新雪花的位置的狠怨。雪花的x和y分別加上各自的速度约啊。最后判斷,如果雪花移出了屏幕范圍佣赖,再將它的x隨機(jī)賦值恰矩,y賦值為0,即從屏幕最上方下落茵汰。

flow = pygame.sprite.Group()

pygame.sprite模塊有一個Group類枢里,大致應(yīng)用就是可以將我們定義的類的實例包含進(jìn)來,然后蹂午,同時進(jìn)行一個操作栏豺。具體的使用方法,可以去pygame的官網(wǎng)去查閱

for i in range(300):
s = Snow()
flow.add(s)

flow有一個add方法豆胸,將實例添加進(jìn)去奥洼。這里,我通過迭代晚胡,創(chuàng)建了300個雪花的實例灵奖,如果你想讓美女體驗一場暴雪的話,可以將它的值調(diào)到更大估盘,但是瓷患,啟動速度可就降下來了!G餐住擅编!

flow.update()
flow.draw(screen)
    
pygame.display.flip()           
screen.blit(background, (0, 0))

最后,將所有的雪花實例update()箫踩,即更新位置爱态,然后畫到屏幕上->顯示->擦除->update()->畫->....一直循環(huán)。

源碼和圖片放到了我的GitHub上:
地址:https://github.com/dmzlingyin/pygame

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末境钟,一起剝皮案震驚了整個濱河市锦担,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慨削,老刑警劉巖洞渔,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缚态,居然都是意外死亡磁椒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門猿规,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衷快,“玉大人,你說我怎么就攤上這事姨俩≌喊危” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵环葵,是天一觀的道長调窍。 經(jīng)常有香客問我,道長张遭,這世上最難降的妖魔是什么邓萨? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上缔恳,老公的妹妹穿的比我還像新娘宝剖。我一直安慰自己,他們只是感情好歉甚,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布万细。 她就那樣靜靜地躺著,像睡著了一般纸泄。 火紅的嫁衣襯著肌膚如雪赖钞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天聘裁,我揣著相機(jī)與錄音雪营,去河邊找鬼。 笑死衡便,一個胖子當(dāng)著我的面吹牛献起,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播砰诵,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼征唬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了茁彭?” 一聲冷哼從身側(cè)響起总寒,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎理肺,沒想到半個月后摄闸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡妹萨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年年枕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乎完。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡熏兄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出树姨,到底是詐尸還是另有隱情摩桶,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布帽揪,位于F島的核電站硝清,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏转晰。R本人自食惡果不足惜芦拿,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一士飒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蔗崎,春花似錦酵幕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽实胸。三九已至他嫡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間庐完,已是汗流浹背钢属。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留门躯,地道東北人淆党。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像讶凉,于是被迫代替她去往敵國和親染乌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 大家好懂讯。小編通過這段時間學(xué)習(xí)做了一個超級簡單的打飛機(jī)『杀铮現(xiàn)在貢獻(xiàn)給大家。 我們先要建兩個.py文件褐望。小編在這里是建的...
    AnHuaFeng閱讀 5,298評論 0 0
  • 總體目錄 1.1勒庄、項目準(zhǔn)備 1.2、使用 pygame 創(chuàng)建圖形窗口 1.3瘫里、理解 圖像 并實現(xiàn)圖像繪制 1.4...
    IIronMan閱讀 6,248評論 2 19
  • 這次呢实蔽,讓我們重溫一下兒時的樂趣,用Python做一個飛機(jī)大戰(zhàn)的小游戲谨读。接下來局装,讓我們一起走進(jìn)“飛機(jī)大戰(zhàn)”。 一....
    HDhandi閱讀 1,910評論 1 4
  • 1.英語老師應(yīng)該把所有語法點總結(jié)出來 2.通過編故事的方式讓學(xué)生更容易掌握
    Silvia_fa2e閱讀 158評論 0 0
  • 天冷好睡眠——俗稱:睡懶覺劳殖。 早上搜索了不少畫铐尚,看畫似乎也成了一個興趣。 啃面包闷尿,這面包太值了塑径,吃了兩餐都吃不完。...
    逆風(fēng)追夢人閱讀 193評論 0 0