91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python?Pygame如何制作雪夜煙花景

發布時間:2022-01-31 08:32:04 來源:億速云 閱讀:168 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關Python Pygame如何制作雪夜煙花景,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

    運行截圖

    運行效果:

    Python?Pygame如何制作雪夜煙花景

    什么?你說你看不清煙花?那我換一種顏色,請點開看。

    Python?Pygame如何制作雪夜煙花景

    實現過程

    準備工作

    使用語言和框架:python、pygame。

    安裝pygame:

    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn pygame

    你需要知道的基礎知識

    首先,pygame渲染是同步的,所以同屏渲染的點過多之后,就會造成卡頓的情況。

    其次,pygame的代碼邏輯是,周期性渲染一系列的屏,從而產生連續的動畫。

    你需要掌握的框架基礎知識:

    初始化過程

    import pygame
    pygame.init()
    pygame.mixer.init()
    pygame.font.init()

    獲取字體

    myfont = pygame.font.SysFont('simHei', 30)
    textsurface = myfont.render(a[i], False, random_color(150, 255))
    screen.blit(textsurface, (80, 30))

    畫圈

    pygame.draw.circle(screen, (snow_list[i][4], snow_list[i][5], snow_list[i][6]), snow_list[i][:2],
                               snow_list[i][3] - 3)

    加載背景音樂

    screen = pygame.display.set_mode(bg_size)
    pygame.display.set_caption("新年快樂")
    bg = pygame.image.load(bg_img)
    pygame.mixer.music.load('D:\\CloudMusic\\小時姑娘 - 霞光-《精靈世紀》片尾曲.mp3')

    核心代碼

    基礎架子

    首先,需要實現一個基礎的事件循環的架子,如下:

    def main():
        global show_n
        global fk_list
        bg_size = (WIN_W, WIN_H)
        screen = pygame.display.set_mode(bg_size)
        pygame.display.set_caption("新年快樂")
        pygame.mixer.music.load('D:\\CloudMusic\\小時姑娘 - 霞光-《精靈世紀》片尾曲.mp3')
        font_values = ['新年快樂']
    
        grand_has = set()
        clock = pygame.time.Clock()
    
        while True:
            if not pygame.mixer.music.get_busy():
                pygame.mixer.music.play()
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    exit()
            screen.fill((0, 0, 0))
            ... ...
            pygame.display.update()
            time_passed = clock.tick(50)
    
    
    if __name__ == '__main__':
        main()

    下雪的過程

    現在,需要實現下雪的過程,首先,考慮定義定義一堆初始化的下雪點

    def init_xue(bg_size):
        snow_list = []
        for i in range(200):
            x_site = random.randrange(0, bg_size[0])  # 雪花圓心位置
            y_site = random.randrange(0, bg_size[1])  # 雪花圓心位置
            X_shift = random.randint(-1, 1)  # x 軸偏移量
            radius = random.randint(4, 6)  # 半徑和 y 周下降量
            xxxxx = random_color(150, 255)
            snow_list.append([x_site, y_site, X_shift, radius, 255, 255, 255])
        return snow_list

    然后實現渲染雪的過程

    def draw_xue(snow_list: [], screen, bg_size: [], grand_has: set, grand_list: []):
        # 雪花列表循環
        # todo 空中的雪
        for i in range(len(snow_list)):
            # 繪制雪花,顏色、位置、大小
            pygame.draw.circle(screen, (snow_list[i][4], snow_list[i][5], snow_list[i][6]), snow_list[i][:2],
                               snow_list[i][3] - 3)
            # 移動雪花位置(下一次循環起效)
            snow_list[i][0] += snow_list[i][2]
            snow_list[i][1] += snow_list[i][3]
            # 如果雪花落出屏幕,重設位置
            if snow_list[i][1] > bg_size[1]:
                # tmp = []
                snow_list[i][1] = random.randrange(-50, -10)
                snow_list[i][0] = random.randrange(0, bg_size[0])
                x = snow_list[i][0]
                y = bg_size[1]
                while (grand_has.__contains__(x * 10000 + y)):
                    y = y - snow_list[i][3]
                grand_has.add(x * 10000 + y)
                grand_list.append(
                    [x, y, snow_list[i][2], snow_list[i][3], snow_list[i][4], snow_list[i][5],
                     snow_list[i][6]])

    集成到上面的架子中,效果如下:

    Python?Pygame如何制作雪夜煙花景

    不過目前的下雪沒有質感,可以考慮在底部堆一些雪,只需要在雪落到地上做特判即可。

    雪落到地上堆起來的過程

    在前面的下雪過程的代碼中,我們維護了一個Grand_list的數組,目的就是維護堆雪的效果

    min_height = 100000
    # todo 地上的積雪
    for i in range(len(grand_list)):
        if grand_list[i][0] < 375:
            min_height = min(min_height, grand_list[i][1])

    然后進入維護程序:

    draw_xue(snow_list, screen, bg_size, grand_has, grand_list)

    最后再將雪畫出來

    for i in range(len(grand_list)):
        pygame.draw.circle(screen, (grand_list[i][4], grand_list[i][5], grand_list[i][6]), grand_list[i][:2],
                           grand_list[i][3] - 3)

    Python?Pygame如何制作雪夜煙花景

    效果圖如上。

    實現煙花的過程

    首先定義出煙花類:

    class Fireworks():
        is_show = False
        x, y = 0, 0
        vy = 0
        p_list = []
        color = [0, 0, 0]
        v = 0
    
        def __init__(self, x, y, vy, n=300, color=[0, 255, 0], v=10):
            self.x = x
            self.y = y
            self.vy = vy
            self.color = color
            self.v = v
            for i in range(n):
                self.p_list.append([random.random() * 2 * math.pi, 0, v * math.pow(random.random(), 1 / 3)])
    
        def run(self):
            global show_n
            for p in self.p_list:
                p[1] = p[1] + (random.random() * 0.6 + 0.7) * p[2]
                p[2] = p[2] * 0.97
                if p[2] < 1.2:
                    self.color[0] *= 0.9999
                    self.color[1] *= 0.9999
                    self.color[2] *= 0.9999
                if max(self.color) < 10 or self.y > WIN_H + p[1]:
                    show_n -= 1
                    self.is_show = False
                    break
            self.vy += 10 * t1
            self.y += self.vy * t1

    然后,我們需要畫出煙花釋放前上升的過程點,這部分與下雪的初始化差不多。

    def init_yanhua(bg_size):
        yanhua_list = []
        for i in range(5):
            x_site = random.randrange(0, WIN_W)  # 雪花圓心位置
            y_site = WIN_H  # 雪花圓心位置
            X_shift = 0  # x 軸偏移量
            radius = random.randint(6, 10)  # 半徑和 y 周上升降量
            xxxxx = random_color(150, 255)
            red = xxxxx[0]
            green = xxxxx[1]
            blue = xxxxx[2]
            yanhua_list.append([x_site, y_site, X_shift, radius, red, green, blue])
        return yanhua_list

    然后是畫上升過程

    def draw_yanhua(yanhua_list: [], screen, bg_size: []):
        global fk_list
        for i in range(len(yanhua_list)):
            # 繪制雪花,顏色、位置、大小
            pygame.draw.circle(screen, (yanhua_list[i][4], yanhua_list[i][5], yanhua_list[i][6]), yanhua_list[i][:2],
                               yanhua_list[i][3] - 3)
            
            yanhua_list[i][0] += yanhua_list[i][2]
            yanhua_list[i][1] -= yanhua_list[i][3]
    
            if yanhua_list[i][1] <= 0:
                # tmp = []
                yanhua_list[i][1] = WIN_H
                yanhua_list[i][0] = random.randrange(0, bg_size[0])
            if yanhua_list[i][1] <= random.randint(200, 400):
                # todo 放煙花
                fk = Fireworks(yanhua_list[i][0], yanhua_list[i][1], -20, n=300, color=red_random(1, 150), v=10)
                fk_list.append(fk)
                yanhua_list[i][1] = WIN_H
                yanhua_list[i][0] = random.randrange(0, bg_size[0])

    效果圖如下:

    Python?Pygame如何制作雪夜煙花景

    圈出來的就是上升過程的煙花。

    最后就是綻放部分,其實在上升過程的代碼中有維護,如果超過某個隨機高度,就會生成一個煙花,只是沒有渲染,現在我們把渲染加上。

            for fk in fk_list:
                fk.run()
                for p in fk.p_list:
                    x, y = fk.x + p[1] * math.cos(p[0]), fk.y + p[1] * math.sin(p[0])
                    if random.random() < 0.055:
                        screen.set_at((int(x), int(y)), (255, 255, 255))
                    else:
                        screen.set_at((int(x), int(y)), (int(fk.color[0]), int(fk.color[1]), int(fk.color[2])))
            tmp = []
            for fk in fk_list:
                for p in fk.p_list:
                    x, y = fk.x + p[1] * math.cos(p[0]), fk.y + p[1] * math.sin(p[0])
                    if y < WIN_H - 1000:
                        tmp.append(fk)
                        break
            fk_list = tmp

    最終的運行效果就如最頂上的效果一樣。

    完整代碼

    將上述過程進行組合,結果如下,感興趣的朋友可以按自己的需求進行優化。

    import pygame
    import random
    import math
    
    pygame.init()
    pygame.mixer.init()
    pygame.font.init()
    
    WIN_W = 2200
    WIN_H = 1300
    
    t1 = 0.18  # 時間流速
    show_n = 0
    show_frequency = 0.0015  # 煙花綻放頻率,數值越大頻率越高
    
    
    color_list = [
        [255, 0, 0]
    ]
    
    yanhua_map = {}
    fk_list = []
    
    
    class Fireworks():
        is_show = False
        x, y = 0, 0
        vy = 0
        p_list = []
        color = [0, 0, 0]
        v = 0
    
        def __init__(self, x, y, vy, n=300, color=[0, 255, 0], v=10):
            self.x = x
            self.y = y
            self.vy = vy
            self.color = color
            self.v = v
            for i in range(n):
                self.p_list.append([random.random() * 2 * math.pi, 0, v * math.pow(random.random(), 1 / 3)])
    
        def run(self):
            global show_n
            for p in self.p_list:
                p[1] = p[1] + (random.random() * 0.6 + 0.7) * p[2]
                p[2] = p[2] * 0.97
                if p[2] < 1.2:
                    self.color[0] *= 0.9999
                    self.color[1] *= 0.9999
                    self.color[2] *= 0.9999
                if max(self.color) < 10 or self.y > WIN_H + p[1]:
                    show_n -= 1
                    self.is_show = False
                    break
            self.vy += 10 * t1
            self.y += self.vy * t1
    
    
    def random_color(l, r):
        return [random.randint(l, r), random.randint(l, r), random.randint(l, r)]
    
    
    def red_random(l, r):
        return [255, random.randint(l, r), random.randint(l, r)]
    
    
    def init_yanhua(bg_size):
        yanhua_list = []
        for i in range(5):
            x_site = random.randrange(0, WIN_W)  # 雪花圓心位置
            y_site = WIN_H  # 雪花圓心位置
            X_shift = 0  # x 軸偏移量
            radius = random.randint(6, 10)  # 半徑和 y 周上升降量
            xxxxx = random_color(150, 255)
            red = xxxxx[0]
            green = xxxxx[1]
            blue = xxxxx[2]
            yanhua_list.append([x_site, y_site, X_shift, radius, red, green, blue])
        return yanhua_list
    
    
    def init_xue(bg_size):
        snow_list = []
        for i in range(200):
            x_site = random.randrange(0, bg_size[0])  # 雪花圓心位置
            y_site = random.randrange(0, bg_size[1])  # 雪花圓心位置
            X_shift = random.randint(-1, 1)  # x 軸偏移量
            radius = random.randint(4, 6)  # 半徑和 y 周下降量
            xxxxx = random_color(150, 255)
            # red = xxxxx[0]
            # green = xxxxx[1]
            # blue = xxxxx[2]
            snow_list.append([x_site, y_site, X_shift, radius, 255, 255, 255])
        return snow_list
    
    
    def draw_xue(snow_list: [], screen, bg_size: [], grand_has: set, grand_list: []):
        # 雪花列表循環
        # todo 空中的雪
        for i in range(len(snow_list)):
            # 繪制雪花,顏色、位置、大小
            pygame.draw.circle(screen, (snow_list[i][4], snow_list[i][5], snow_list[i][6]), snow_list[i][:2],
                               snow_list[i][3] - 3)
            # 移動雪花位置(下一次循環起效)
            snow_list[i][0] += snow_list[i][2]
            snow_list[i][1] += snow_list[i][3]
            # 如果雪花落出屏幕,重設位置
            if snow_list[i][1] > bg_size[1]:
                # tmp = []
                snow_list[i][1] = random.randrange(-50, -10)
                snow_list[i][0] = random.randrange(0, bg_size[0])
                x = snow_list[i][0]
                y = bg_size[1]
                while (grand_has.__contains__(x * 10000 + y)):
                    y = y - snow_list[i][3]
                grand_has.add(x * 10000 + y)
                grand_list.append(
                    [x, y, snow_list[i][2], snow_list[i][3], snow_list[i][4], snow_list[i][5],
                     snow_list[i][6]])
    
    def draw_yanhua(yanhua_list: [], screen, bg_size: []):
        global fk_list
        for i in range(len(yanhua_list)):
            # 繪制雪花,顏色、位置、大小
            pygame.draw.circle(screen, (yanhua_list[i][4], yanhua_list[i][5], yanhua_list[i][6]), yanhua_list[i][:2],
                               yanhua_list[i][3] - 3)
            # 移動雪花位置(下一次循環起效)
            yanhua_list[i][0] += yanhua_list[i][2]
            yanhua_list[i][1] -= yanhua_list[i][3]
            # 如果雪花落出屏幕,重設位置
            if yanhua_list[i][1] <= 0:
                # tmp = []
                yanhua_list[i][1] = WIN_H
                yanhua_list[i][0] = random.randrange(0, bg_size[0])
            if yanhua_list[i][1] <= random.randint(200, 400):
                # todo 放煙花
                fk = Fireworks(yanhua_list[i][0], yanhua_list[i][1], -20, n=300, color=red_random(1, 150), v=10)
                fk_list.append(fk)
                yanhua_list[i][1] = WIN_H
                yanhua_list[i][0] = random.randrange(0, bg_size[0])
    
    
    def show_shi(a: list, n, screen):
        i = 2 * n - 1
        j = 2 * n
        if i >= len(a):
            i = len(a) - 2
            j = len(a) - 1
        if i >= 0:
            myfont = pygame.font.SysFont('simHei', 30)
            textsurface = myfont.render(a[i], False, random_color(150, 255))
            screen.blit(textsurface, (WIN_W / 2, 30))
        if j >= 0:
            myfont = pygame.font.SysFont('simHei', 100)
            textsurface = myfont.render(a[j], False, red_random(1, 1))
            screen.blit(textsurface, (WIN_W / 2 - 200, 50))
    
    
    def main():
        global show_n
        global fk_list
        bg_size = (WIN_W, WIN_H)
        screen = pygame.display.set_mode(bg_size)
        # bg_img = "./1.png"
        pygame.display.set_caption("新年快樂")
        # bg = pygame.image.load(bg_img)
        pygame.mixer.music.load('D:\\CloudMusic\\小時姑娘 - 霞光-《精靈世紀》片尾曲.mp3')
        grand_list = []
        font_values = ['新年快樂']
    
        grand_has = set()
    
        clock = pygame.time.Clock()
        yanhua_list = init_yanhua(bg_size)
        snow_list = init_xue(bg_size)
        # 游戲主循環
        while True:
            if not pygame.mixer.music.get_busy():
                pygame.mixer.music.play()
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    exit()
            screen.fill((0, 0, 0))
            draw_yanhua(yanhua_list, screen, bg_size)
            if len(fk_list) != 0:
                print(len(fk_list))
            # # 放煙花
            show_shi(font_values, 0, screen)
            for fk in fk_list:
                fk.run()
                for p in fk.p_list:
                    x, y = fk.x + p[1] * math.cos(p[0]), fk.y + p[1] * math.sin(p[0])
                    if random.random() < 0.055:
                        screen.set_at((int(x), int(y)), (255, 255, 255))
                    else:
                        screen.set_at((int(x), int(y)), (int(fk.color[0]), int(fk.color[1]), int(fk.color[2])))
            tmp = []
            for fk in fk_list:
                for p in fk.p_list:
                    x, y = fk.x + p[1] * math.cos(p[0]), fk.y + p[1] * math.sin(p[0])
                    if y < WIN_H - 1000:
                        tmp.append(fk)
                        break
            fk_list = tmp
            min_height = 100000
            # todo 地上的積雪
            for i in range(len(grand_list)):
                if grand_list[i][0] < 375:
                    min_height = min(min_height, grand_list[i][1])
    
            draw_xue(snow_list, screen, bg_size, grand_has, grand_list)
            for i in range(len(grand_list)):
                pygame.draw.circle(screen, (grand_list[i][4], grand_list[i][5], grand_list[i][6]), grand_list[i][:2],
                                   grand_list[i][3] - 3)
            pygame.display.update()
            time_passed = clock.tick(50)
    
    
    if __name__ == '__main__':
        main()

    關于“Python Pygame如何制作雪夜煙花景”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    彭阳县| 隆安县| 桐庐县| 察雅县| 长治市| 响水县| 牙克石市| 大同市| 曲松县| 仪征市| 贵州省| 凤台县| 昭通市| 五华县| 双城市| 黔西县| 礼泉县| 怀安县| 汶川县| 牟定县| 曲阳县| 准格尔旗| 南康市| 平塘县| 凯里市| 巴塘县| 平度市| 吴川市| 广昌县| 静安区| 伊春市| 晋中市| 曲靖市| 鄢陵县| 准格尔旗| 兴海县| 济源市| 花莲市| 拉萨市| 通榆县| 鲜城|