Tron Legacy Screensaver
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 108 KiB |
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 1.2 MiB |
@@ -0,0 +1,154 @@
|
||||
#!/usr/bin/env python3
|
||||
# Description: Tron Legacy Screensaver.
|
||||
# Usage: python3 screensaver-tron-legacy.py
|
||||
# Author: Justin Oros
|
||||
# Source: https://github.com/JustinOros
|
||||
|
||||
import pygame
|
||||
import sys
|
||||
import os
|
||||
import random
|
||||
|
||||
pygame.init()
|
||||
|
||||
info = pygame.display.Info()
|
||||
SCREEN_WIDTH = info.current_w
|
||||
SCREEN_HEIGHT = info.current_h
|
||||
|
||||
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT), pygame.FULLSCREEN)
|
||||
pygame.display.set_caption("Tron Disc")
|
||||
pygame.mouse.set_visible(False)
|
||||
|
||||
try:
|
||||
pygame.mixer.music.load('screensaver-tron-legacy-music.mp3')
|
||||
pygame.mixer.music.play(-1)
|
||||
except pygame.error as e:
|
||||
print(f"Error loading screensaver-tron-legacy-music.mp3: {e}")
|
||||
print("Continuing without music...")
|
||||
|
||||
try:
|
||||
wallpaper_original = pygame.image.load('screensaver-tron-legacy-wallpaper.jpg')
|
||||
except pygame.error as e:
|
||||
print(f"Error loading screensaver-tron-legacy-wallpaper.png: {e}")
|
||||
pygame.quit()
|
||||
sys.exit()
|
||||
|
||||
try:
|
||||
disc_original = pygame.image.load('screensaver-tron-legacy-disc.png')
|
||||
DISC_SIZE = 180
|
||||
disc_original = pygame.transform.scale(disc_original, (DISC_SIZE, DISC_SIZE))
|
||||
except pygame.error as e:
|
||||
print(f"Error loading screensaver-tron-legacy-disc.png: {e}")
|
||||
pygame.quit()
|
||||
sys.exit()
|
||||
|
||||
disc_x = SCREEN_WIDTH // 2
|
||||
disc_y = SCREEN_HEIGHT // 2
|
||||
disc_speed_x = 10
|
||||
disc_speed_y = 10
|
||||
disc_angle = 0
|
||||
disc_rotation_speed = -2
|
||||
base_speed = 5
|
||||
max_speed = 15
|
||||
deceleration = 0.05
|
||||
breathing_time = 0
|
||||
breathing_speed = 0.02
|
||||
breathing_scale_min = 1.0
|
||||
breathing_scale_max = 1.1
|
||||
num_bars = 10
|
||||
bar_width = SCREEN_WIDTH // num_bars
|
||||
max_bar_height = int(SCREEN_HEIGHT * 0.25)
|
||||
bar_heights = [random.randint(10, max_bar_height) for _ in range(num_bars)]
|
||||
bar_targets = [random.randint(10, max_bar_height) for _ in range(num_bars)]
|
||||
bar_speeds = [random.uniform(5, 15) for _ in range(num_bars)]
|
||||
|
||||
clock = pygame.time.Clock()
|
||||
FPS = 60
|
||||
|
||||
running = True
|
||||
while running:
|
||||
for event in pygame.event.get():
|
||||
if event.type == pygame.QUIT:
|
||||
running = False
|
||||
elif event.type == pygame.KEYDOWN:
|
||||
if event.key == pygame.K_ESCAPE or event.key == pygame.K_q:
|
||||
running = False
|
||||
|
||||
disc_x += disc_speed_x
|
||||
disc_y += disc_speed_y
|
||||
|
||||
breathing_time += breathing_speed
|
||||
breathing_scale = breathing_scale_min + (breathing_scale_max - breathing_scale_min) * (0.5 + 0.5 * pygame.math.Vector2(1, 0).rotate(breathing_time * 180 / 3.14159).x)
|
||||
|
||||
for i in range(num_bars):
|
||||
if abs(bar_heights[i] - bar_targets[i]) < 5:
|
||||
bar_targets[i] = random.randint(10, max_bar_height)
|
||||
bar_speeds[i] = random.uniform(5, 15)
|
||||
|
||||
if bar_heights[i] < bar_targets[i]:
|
||||
bar_heights[i] = min(bar_heights[i] + bar_speeds[i], bar_targets[i])
|
||||
else:
|
||||
bar_heights[i] = max(bar_heights[i] - bar_speeds[i], bar_targets[i])
|
||||
|
||||
current_speed = (disc_speed_x**2 + disc_speed_y**2)**0.5
|
||||
if current_speed > base_speed:
|
||||
speed_ratio = disc_speed_x / current_speed
|
||||
current_speed = max(base_speed, current_speed - deceleration)
|
||||
disc_speed_x = speed_ratio * current_speed
|
||||
disc_speed_y = ((current_speed**2 - disc_speed_x**2)**0.5) * (1 if disc_speed_y > 0 else -1)
|
||||
|
||||
disc_angle += disc_rotation_speed
|
||||
if disc_angle >= 360:
|
||||
disc_angle -= 360
|
||||
|
||||
if disc_x <= 0 or disc_x >= SCREEN_WIDTH - DISC_SIZE:
|
||||
disc_speed_x = -disc_speed_x
|
||||
disc_rotation_speed = -disc_rotation_speed
|
||||
disc_x = max(0, min(disc_x, SCREEN_WIDTH - DISC_SIZE))
|
||||
current_speed = (disc_speed_x**2 + disc_speed_y**2)**0.5
|
||||
speed_ratio_x = disc_speed_x / current_speed
|
||||
speed_ratio_y = disc_speed_y / current_speed
|
||||
disc_speed_x = speed_ratio_x * max_speed
|
||||
disc_speed_y = speed_ratio_y * max_speed
|
||||
|
||||
if disc_y <= 0 or disc_y >= SCREEN_HEIGHT - DISC_SIZE:
|
||||
disc_speed_y = -disc_speed_y
|
||||
disc_rotation_speed = -disc_rotation_speed
|
||||
disc_y = max(0, min(disc_y, SCREEN_HEIGHT - DISC_SIZE))
|
||||
current_speed = (disc_speed_x**2 + disc_speed_y**2)**0.5
|
||||
speed_ratio_x = disc_speed_x / current_speed
|
||||
speed_ratio_y = disc_speed_y / current_speed
|
||||
disc_speed_x = speed_ratio_x * max_speed
|
||||
disc_speed_y = speed_ratio_y * max_speed
|
||||
|
||||
scaled_width = int(SCREEN_WIDTH * breathing_scale)
|
||||
scaled_height = int(SCREEN_HEIGHT * breathing_scale)
|
||||
wallpaper = pygame.transform.scale(wallpaper_original, (scaled_width, scaled_height))
|
||||
wallpaper_x = (SCREEN_WIDTH - scaled_width) // 2
|
||||
wallpaper_y = (SCREEN_HEIGHT - scaled_height) // 2
|
||||
screen.blit(wallpaper, (wallpaper_x, wallpaper_y))
|
||||
|
||||
for i in range(num_bars):
|
||||
bar_x = i * bar_width
|
||||
bar_y = SCREEN_HEIGHT - int(bar_heights[i])
|
||||
bar_height = int(bar_heights[i])
|
||||
|
||||
bar_surface = pygame.Surface((bar_width, bar_height), pygame.SRCALPHA)
|
||||
|
||||
for y in range(bar_height):
|
||||
alpha = int(255 * (y / bar_height))
|
||||
color = (125, 253, 254, alpha)
|
||||
pygame.draw.line(bar_surface, color, (0, y), (bar_width - 2, y))
|
||||
|
||||
screen.blit(bar_surface, (bar_x, bar_y))
|
||||
|
||||
rotated_disc = pygame.transform.rotate(disc_original, disc_angle)
|
||||
rotated_rect = rotated_disc.get_rect(center=(disc_x + DISC_SIZE // 2, disc_y + DISC_SIZE // 2))
|
||||
screen.blit(rotated_disc, rotated_rect)
|
||||
|
||||
pygame.display.flip()
|
||||
|
||||
clock.tick(FPS)
|
||||
|
||||
pygame.quit()
|
||||
sys.exit()
|
||||
Reference in New Issue
Block a user