📜  在Python中使用 Pygame 显示降雪(1)

📅  最后修改于: 2023-12-03 15:23:26.155000             🧑  作者: Mango

在Python中使用Pygame显示降雪

简介

Pygame是一个Python的库,它提供了用于开发2D游戏的功能,包括音频处理和绘图。在这篇教程中,我们将使用Pygame来展示如何实现降雪的特效。

安装Pygame

在开始之前,你需要确保已经安装了Python,如果没有安装,请先下载并安装。接下来,你需要安装Pygame库。可以使用pip命令来安装Pygame。

pip install pygame
实现

我们将做出以下的实现:

  1. 在窗口中创建画布
  2. 加载雪花图片
  3. 设置雪花的位置和速度
  4. 在画布上绘制雪花
  5. 更新雪花的位置
  6. 处理退出操作
创建窗口

在Pygame中通过创建一个窗口(REQUIRED 参数:宽和高),可以显示雪花特效。下面的代码展示了如何创建一个宽为640像素,高为480像素的画布。

import pygame
import random

pygame.init()

# 设置窗口的尺寸
WINDOW_WIDTH = 640
WINDOW_HEIGHT = 480
# 创建一个窗口
SCREEN = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
加载雪花图片

我们将使用一个简单的白色圆点作为雪花图片。我们将在主循环中使用它来绘制每一个雪花。

SNOW_IMAGE = pygame.Surface([4, 4])
SNOW_IMAGE.fill(pygame.Color(255, 255, 255))
设置雪花的位置和速度

下一个步骤是设置雪花的位置和速度。我们将使用一个列表snow_list存储每一个雪花的位置和速度。在每次循环中,我们将更新每一个雪花的位置并将其绘制到画布上。

SNOW_LIST = []
for i in range(50):
    x = random.randrange(0, WINDOW_WIDTH)
    y = random.randrange(0, WINDOW_HEIGHT)
    speed_x = random.randint(-1, 1)
    speed_y = random.randint(3, 6)
    SNOW_LIST.append([x, y, speed_x, speed_y])
在画布上绘制雪花

在主循环中,我们将使用pygame.draw.circle()函数在画布上绘制每一个雪花。我们将雪花的位置和速度存储在SNOW_LIST中,并且随着时间的推移不断更新这些值。

def draw_snow(snow_list):
    for snow in snow_list:
        pygame.draw.circle(SCREEN, pygame.Color(255, 255, 255), snow[:2], 2)

注意:我们使用pygame.Color(255, 255, 255) 创建白色,因此将使用其作为绘制每一个雪花的颜色。

更新雪花的位置

在主循环的每一次迭代中,我们将更新每一个雪花的x和y坐标。因为雪花是从屏幕上方下落的,因此我们需要确保当雪花超过画布的底部时将其重置到画布的顶部。下面的代码展示了如何实现。

def update_snow(snow_list):
    for idx, snow in enumerate(snow_list):
        snow[0] += snow[2]
        snow[1] += snow[3]

        if snow[1] > WINDOW_HEIGHT:
            y = random.randrange(-50, -10)
            snow_list[idx] = [random.randrange(0, WINDOW_WIDTH), y, random.randint(-1, 1), random.randint(3, 6)]
处理退出操作

在每次循环的最后检查是否接收到了退出事件。如果是,我们将设置退出标志来退出程序。

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    SCREEN.fill((0, 0, 0))
    draw_snow(SNOW_LIST)
    update_snow(SNOW_LIST)
    pygame.display.flip()

pygame.quit()
完整代码
import pygame
import random

pygame.init()

# 设置窗口的尺寸
WINDOW_WIDTH = 640
WINDOW_HEIGHT = 480
# 创建一个窗口
SCREEN = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))

SNOW_IMAGE = pygame.Surface([4, 4])
SNOW_IMAGE.fill(pygame.Color(255, 255, 255))

SNOW_LIST = []
for i in range(50):
    x = random.randrange(0, WINDOW_WIDTH)
    y = random.randrange(0, WINDOW_HEIGHT)
    speed_x = random.randint(-1, 1)
    speed_y = random.randint(3, 6)
    SNOW_LIST.append([x, y, speed_x, speed_y])


def draw_snow(snow_list):
    for snow in snow_list:
        pygame.draw.circle(SCREEN, pygame.Color(255, 255, 255), snow[:2], 2)


def update_snow(snow_list):
    for idx, snow in enumerate(snow_list):
        snow[0] += snow[2]
        snow[1] += snow[3]

        if snow[1] > WINDOW_HEIGHT:
            y = random.randrange(-50, -10)
            snow_list[idx] = [random.randrange(0, WINDOW_WIDTH), y, random.randint(-1, 1), random.randint(3, 6)]


running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    SCREEN.fill((0, 0, 0))
    draw_snow(SNOW_LIST)
    update_snow(SNOW_LIST)
    pygame.display.flip()

pygame.quit()