使用 Pygame 创建代码雨动画

PythonBeginner
立即练习

介绍

在这个项目中,你将学习如何使用 Python 中的 Pygame 库创建一个简单的代码雨动画。像《黑客帝国》这样的电影让代码雨动画流行起来,它在屏幕上显示下落的字符,给人一种数字雨的感觉。我们将使用 Pygame 库来创建动画并在窗口中显示它。

👀 预览

代码雨

🎯 任务

在这个项目中,你将学习:

  • 如何在 Pygame 中设置动画窗口
  • 如何定义一个“雨滴”类来表示每个下落的字符
  • 如何生成并显示“雨滴”类的多个实例
  • 如何实现主循环以持续更新动画
  • 如何正确关闭动画窗口

🏆 成果

完成这个项目后,你将能够:

  • 使用 Pygame 库创建动画
  • 在 Python 中定义和使用类
  • 在 Pygame 中处理用户事件
  • 在 Pygame 中创建主动画循环
  • 在 Pygame 中正确关闭动画窗口

创建项目文件

在开始之前,请确保你已经安装了 Pygame。如果你还没有安装 Pygame,可以使用 pip 进行安装:

sudo pip install pygame

接下来,在你喜欢的代码编辑器或 IDE 中创建一个名为 code_rain.py 的文件。这将是你编写乒乓球游戏代码的主要文件。

cd ~/project
touch code_rain.py
✨ 查看解决方案并练习

设置动画窗口

code_rain.py 文件中,在代码开头导入所需的库:

import pygame
import random

然后,通过调用 pygame.init() 初始化 Pygame:

pygame.init()

接下来,通过定义宽度、高度和标题来设置动画窗口:

width, height = 800, 600
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("Code Rain")

定义动画中使用的颜色:

background_color = (0, 0, 0)
text_color = (0, 255, 0)

字体设置:

font = pygame.font.Font(None, 36)
✨ 查看解决方案并练习

定义雨滴类

接下来,我们定义 Raindrop 类,它代表代码雨动画中的每个下落字符。Raindrop 类包含每个雨滴的初始位置、文本和下落速度等属性。

class Raindrop:
    def __init__(self):
        self.x = random.randint(0, width)
        self.y = random.randint(0, height)
        self.text = chr(random.randint(33, 126))
        self.speed = random.randint(1, 5)

    def fall(self):
        self.y += self.speed
        if self.y > height:
            self.y = 0
            self.x = random.randint(0, width)

    def display(self):
        text_surface = font.render(self.text, True, text_color)
        screen.blit(text_surface, (self.x, self.y))

__init__ 方法在类实例化时被调用,用于初始化雨滴的属性,包括随机的初始位置(x, y)、随机的文本字符(ASCII 码在 33 到 126 之间)和随机的下落速度(在 1 到 5 之间)。

fall 方法用于使雨滴向下移动。它根据雨滴的速度增加 self.y 的值。如果雨滴移出屏幕(当 self.y 大于屏幕高度时),将其重置到屏幕顶部,并在屏幕上随机选择一个新的 x 位置。

display 方法用于显示雨滴。它使用 pygame 库中的 font.render 函数创建一个文本表面,并将其渲染在屏幕上雨滴的位置 (self.x, self.y) 处。

✨ 查看解决方案并练习

生成并显示雨滴

现在,我们将创建并显示 Raindrop 类的多个实例,以模拟下落的字符。以下代码生成指定数量的雨滴,并在屏幕上更新它们的位置。

num_raindrops = 100
raindrops = [Raindrop() for _ in range(num_raindrops)]
✨ 查看解决方案并练习

处理主循环

在这一步中,我们实现主循环,通过不断更新屏幕来处理动画。它还监听退出事件以正确关闭窗口。

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

    screen.fill(background_color)

    for drop in raindrops:
        drop.fall()
        drop.display()

    pygame.display.flip()

pygame.quit()

动画循环的主体是一个 while 循环,其中 running 变量控制循环。只有当 runningTrue 时,循环才会继续运行。

在动画循环中,使用 pygame.event.get() 获取 pygame 事件列表,并通过遍历事件列表来检查每个事件。在这种情况下,主要检查是否有退出事件 pygame.QUIT,当用户关闭动画窗口时会生成该事件。如果检测到退出事件,将 running 设置为 False 以退出动画循环。

screen.fill(background_color) 填充动画窗口 screen 的背景颜色,以覆盖上一帧的内容,为绘制新帧做准备。

遍历 raindrops 列表,对每个雨滴对象调用 fall() 方法使其下落,并调用 display() 方法在游戏窗口上显示雨滴。

pygame.display.flip() 用于将上述所有绘图操作刷新到屏幕上以实现动画效果。

动画循环结束后,调用 pygame.quit() 清理 pygame 库并退出动画。

✨ 查看解决方案并练习

运行项目

最后,切换到桌面并使用以下命令运行项目:

python code_rain.py
Code rain
✨ 查看解决方案并练习

总结

在这个项目中,你学习了如何使用 Python 中的 Pygame 库创建一个简单的代码雨动画。你初始化了 Pygame 模块,定义了Raindrop类,生成并显示了多个雨滴,并实现了主循环来处理动画。这个项目让你对如何使用 Pygame 创建简单动画有了基本的了解。