tabnation

python snow screensaver

Dec 20th, 2025
28
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.39 KB | None | 0 0
  1. import math
  2. import random
  3. import sys
  4. import pygame
  5.  
  6.  
  7. class Snowflake:
  8. __slots__ = ("x", "y", "r", "vy", "vx", "layer", "phase", "amp")
  9.  
  10. def __init__(self, W, H, layer):
  11. self.layer = layer
  12. self.reset(W, H, random_y=True)
  13.  
  14. def reset(self, W, H, random_y=False):
  15. if self.layer == 0:
  16. self.r = random.uniform(1.0, 2.0)
  17. self.vy = random.uniform(25, 50)
  18. elif self.layer == 1:
  19. self.r = random.uniform(1.8, 3.0)
  20. self.vy = random.uniform(55, 90)
  21. else:
  22. self.r = random.uniform(2.8, 4.8)
  23. self.vy = random.uniform(90, 140)
  24.  
  25. self.x = random.uniform(0, W)
  26. self.y = random.uniform(0, H) if random_y else random.uniform(-H * 0.2, 0)
  27. self.vx = random.uniform(-8, 8)
  28. self.phase = random.uniform(0, math.tau)
  29. self.amp = random.uniform(8, 28) * (0.4 + 0.4 * self.layer)
  30.  
  31. def update(self, W, H, dt, wind, t):
  32. self.y += self.vy * dt
  33. self.x += (self.vx + wind) * dt
  34. self.x += math.sin(t + self.phase) * self.amp * dt * 0.15
  35.  
  36. if self.x < -20:
  37. self.x = W + 20
  38. elif self.x > W + 20:
  39. self.x = -20
  40.  
  41. if self.y > H + 10:
  42. self.reset(W, H)
  43.  
  44. def draw(self, surf):
  45. alpha = 120 if self.layer == 0 else 180 if self.layer == 1 else 230
  46. pygame.draw.circle(
  47. surf, (255, 255, 255, alpha), (int(self.x), int(self.y)), int(self.r)
  48. )
  49.  
  50.  
  51. def main():
  52. pygame.init()
  53. screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
  54. pygame.display.set_caption("Snowfall Screensaver")
  55. clock = pygame.time.Clock()
  56.  
  57. W, H = screen.get_size()
  58. pygame.mouse.set_visible(False)
  59. pygame.event.set_grab(True)
  60.  
  61. snow_layer = pygame.Surface((W, H), pygame.SRCALPHA)
  62.  
  63. area = W * H
  64. base = int(area / (1920 * 1080) * 260)
  65.  
  66. flakes = (
  67. [Snowflake(W, H, 0) for _ in range(int(base * 0.4))]
  68. + [Snowflake(W, H, 1) for _ in range(int(base * 0.35))]
  69. + [Snowflake(W, H, 2) for _ in range(int(base * 0.25))]
  70. )
  71.  
  72. t = 0.0
  73. last_mouse = pygame.mouse.get_pos()
  74.  
  75. running = True
  76. while running:
  77. dt = clock.tick(60) / 1000.0
  78. t += dt
  79.  
  80. for event in pygame.event.get():
  81. if event.type in (
  82. pygame.QUIT,
  83. pygame.KEYDOWN,
  84. pygame.MOUSEBUTTONDOWN,
  85. pygame.MOUSEWHEEL,
  86. ):
  87. running = False
  88. elif event.type == pygame.MOUSEMOTION and event.rel != (0, 0):
  89. running = False
  90.  
  91. if pygame.key.get_pressed()[pygame.K_ESCAPE]:
  92. running = False
  93.  
  94. if pygame.mouse.get_pos() != last_mouse:
  95. running = False
  96. last_mouse = pygame.mouse.get_pos()
  97.  
  98. # Pure black background
  99. screen.fill((0, 0, 0))
  100.  
  101. # Gentle wind
  102. wind = 14 * math.sin(t * 0.25) + random.uniform(-1.5, 1.5)
  103.  
  104. snow_layer.fill((0, 0, 0, 0))
  105. for flake in flakes:
  106. flake.update(W, H, dt, wind * (0.4 + 0.35 * flake.layer), t)
  107. flake.draw(snow_layer)
  108.  
  109. screen.blit(snow_layer, (0, 0))
  110. pygame.display.flip()
  111.  
  112. pygame.event.set_grab(False)
  113. pygame.mouse.set_visible(True)
  114. pygame.quit()
  115. sys.exit()
  116.  
  117.  
  118. if __name__ == "__main__":
  119. main()
  120.  
Advertisement
Add Comment
Please, Sign In to add comment