Creating a Rain Animation with Python and Pygame
This article provides a step‑by‑step guide to building a realistic rain animation in Python using the Pygame library, covering environment setup, raindrop physics, drawing techniques, full source code, and suggestions for customization such as color, density, wind, and depth effects.
The article introduces a simple yet effective way to simulate rain on a computer screen by using Python together with the Pygame library, making it accessible for beginners who want to explore graphical programming or game‑style visual effects.
Environment preparation : It recommends Python 3.6+ and the Pygame package, which can be installed via pip install pygame . If installation issues arise, upgrading pip with pip install --upgrade pip is suggested.
Rain‑drop simulation principle : Each raindrop is represented by an object with attributes for position (x, y), length, and speed. The y‑coordinate is increased by the speed each frame; when a drop moves beyond the window height it is reset to the top with new random attributes, creating a continuous rain curtain.
Implementation steps : The tutorial walks through initializing Pygame, defining a Raindrop class with __init__ , reset , fall , and draw methods, creating a list of raindrop instances, handling the main loop (event processing, background fill, updating and drawing each drop, screen refresh, and frame‑rate control), and cleanly exiting the program.
Full script :
<code>import pygame, random, sys
class Raindrop:
def __init__(self, screen_width, screen_height):
self.screen_width = screen_width
self.screen_height = screen_height
self.reset()
def reset(self):
self.x = random.randint(0, self.screen_width)
self.y = random.randint(-self.screen_height, 0)
self.length = random.randint(5, 15)
self.speed = random.uniform(4, 10) * (self.length / 10)
def fall(self):
self.y += self.speed
if self.y > self.screen_height:
self.reset()
def draw(self, surface):
end_y = self.y + self.length
pygame.draw.line(surface, (180, 180, 255), (self.x, self.y), (self.x, end_y), 1)
def main():
pygame.init()
screen_width, screen_height = 800, 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Python 雨滴模拟")
clock = pygame.time.Clock()
raindrops = [Raindrop(screen_width, screen_height) for _ in range(300)]
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill((10, 10, 30))
for drop in raindrops:
drop.fall()
drop.draw(screen)
pygame.display.flip()
clock.tick(60)
pygame.quit()
sys.exit()
if __name__ == "__main__":
main()
</code>Running effect and customization : Executing the script opens an 800×600 dark window where dozens of light‑blue lines fall at varying speeds, forming a layered rain curtain. The article suggests changing the line colour, adjusting the number of drops, adding horizontal motion for wind, or separating drops into foreground, mid‑ground, and background layers to achieve depth and parallax effects.
Conclusion : By repeatedly resetting and redrawing raindrop positions with randomised attributes, the tutorial demonstrates a core technique for creating dynamic visual effects in Python, encouraging readers to experiment further and integrate additional features such as splash particles or wind.
Python Programming Learning Circle
A global community of Chinese Python developers offering technical articles, columns, original video tutorials, and problem sets. Topics include web full‑stack development, web scraping, data analysis, natural language processing, image processing, machine learning, automated testing, DevOps automation, and big data.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.