diff --git a/sushi-screensaver/sushi-screensaver.py b/sushi-screensaver/sushi-screensaver.py new file mode 100644 index 0000000..1a6ae5c --- /dev/null +++ b/sushi-screensaver/sushi-screensaver.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +# Description: Sushi Screensaver. +# Usage: python3 sushi-screensaver.py +# Author: Justin Oros +# Source: https://github.com/JustinOros + +import pygame +import random +import os +import sys + +# Initialize pygame modules +pygame.init() + +# Get the current display size to create a fullscreen window +SCREEN_WIDTH, SCREEN_HEIGHT = pygame.display.Info().current_w, pygame.display.Info().current_h +FPS = 60 # Frames per second + +# Background color (black) +BG_COLOR = (0, 0, 0) + +def load_sushi_images(): + """ + Loads sushi images from the local directory, scales them to 80x80 pixels, + and returns them as a list of pygame Surfaces. + """ + images = [] + for i in range(1, 6): # sushi1.png to sushi5.png + path = os.path.join(os.path.dirname(__file__), f"sushi{i}.png") + if not os.path.exists(path): + print(f"❌ Missing image: sushi{i}.png") + sys.exit() # Exit if any image is missing + img = pygame.image.load(path).convert_alpha() # Load image with transparency + images.append(pygame.transform.scale(img, (80, 80))) # Scale to double size (80x80) + return images + +class Sushi(pygame.sprite.Sprite): + """ + A sushi sprite that falls from the top of the screen to the bottom + at a random speed and resets its position once it moves off the bottom. + """ + def __init__(self, images): + super().__init__() + self.images = images + self.image = random.choice(self.images) # Random sushi image + self.rect = self.image.get_rect() + # Start at a random horizontal position within the screen width + self.rect.x = random.randint(0, SCREEN_WIDTH - self.rect.width) + # Start slightly above the visible screen (random y between -100 and -40) + self.rect.y = random.randint(-100, -40) + self.speed = random.uniform(2, 5) # Random falling speed + + def update(self): + """ + Update sushi position by moving it downwards. + When it moves off the bottom, reset to a new random position at the top. + """ + self.rect.y += self.speed # Move down by speed + if self.rect.top > SCREEN_HEIGHT: # If sushi is below the screen + # Reset vertical position to top off-screen + self.rect.y = random.randint(-100, -40) + # Reset horizontal position randomly within screen width + self.rect.x = random.randint(0, SCREEN_WIDTH - self.rect.width) + self.speed = random.uniform(2, 5) # New random speed + self.image = random.choice(self.images) # Pick a new sushi image + +# Create fullscreen window +screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT), pygame.FULLSCREEN) +pygame.display.set_caption("Sushi Screensaver") +clock = pygame.time.Clock() # Clock to control frame rate + +# Load sushi images into a list +sushi_images = load_sushi_images() + +# Create a group to hold multiple sushi sprites +sushi_group = pygame.sprite.Group() +for _ in range(30): # Create 30 sushi sprites + sushi_group.add(Sushi(sushi_images)) + +# Main loop to run the screensaver +running = True +while running: + screen.fill(BG_COLOR) # Fill screen with background color + + # Handle events like quit, key presses, and mouse clicks + for event in pygame.event.get(): + if event.type == pygame.QUIT: + running = False # Exit on window close + elif event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + running = False # Exit on ESC key press + # Other keys do nothing here, but could be handled if needed + elif event.type == pygame.MOUSEBUTTONDOWN: + running = False # Exit on any mouse click + + sushi_group.update() # Update all sushi positions + sushi_group.draw(screen) # Draw all sushi sprites on the screen + + pygame.display.flip() # Update the full display surface to the screen + clock.tick(FPS) # Maintain the frame rate + +pygame.quit() # Clean up and close pygame + diff --git a/sushi-screensaver/sushi.py b/sushi-screensaver/sushi.py new file mode 100644 index 0000000..10aa604 --- /dev/null +++ b/sushi-screensaver/sushi.py @@ -0,0 +1,85 @@ +import pygame +import random +import os +import sys + +# Initialize pygame +pygame.init() + +# Get display size for fullscreen +SCREEN_WIDTH, SCREEN_HEIGHT = pygame.display.Info().current_w, pygame.display.Info().current_h +FPS = 60 + +# Colors +BG_COLOR = (0, 0, 0) # Black background + +# Load sushi images +def load_sushi_images(): + images = [] + for i in range(1, 6): # sushi1.png to sushi5.png + path = os.path.join(os.path.dirname(__file__), f"sushi{i}.png") + if not os.path.exists(path): + print(f"❌ Missing image: sushi{i}.png") + sys.exit() + img = pygame.image.load(path).convert_alpha() + # Scale sushi images to 80x80 (double size) + images.append(pygame.transform.scale(img, (80, 80))) + return images + +# Sushi sprite +class Sushi(pygame.sprite.Sprite): + def __init__(self, images): + super().__init__() + self.images = images + self.image = random.choice(self.images) + self.rect = self.image.get_rect() + self.rect.x = random.randint(0, SCREEN_WIDTH - self.rect.width) + self.rect.y = random.randint(-100, -40) + self.speed = random.uniform(2, 5) + + def update(self): + self.rect.y += self.speed + if self.rect.top > SCREEN_HEIGHT: + self.rect.y = random.randint(-100, -40) + self.rect.x = random.randint(0, SCREEN_WIDTH - self.rect.width) + self.speed = random.uniform(2, 5) + self.image = random.choice(self.images) + +# Setup fullscreen display +screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT), pygame.FULLSCREEN) +pygame.display.set_caption("Sushi Screensaver") +clock = pygame.time.Clock() + +# Load sushi images +sushi_images = load_sushi_images() + +# Create sushi sprites +sushi_group = pygame.sprite.Group() +for _ in range(30): + sushi_group.add(Sushi(sushi_images)) + +# Main loop +running = True +while running: + screen.fill(BG_COLOR) + + for event in pygame.event.get(): + if event.type == pygame.QUIT: + running = False + elif event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + running = False + else: + # Optional: you can decide if any other key should exit or not + pass + elif event.type == pygame.MOUSEBUTTONDOWN: + running = False + + sushi_group.update() + sushi_group.draw(screen) + + pygame.display.flip() + clock.tick(FPS) + +pygame.quit() + diff --git a/sushi-screensaver/sushi1.png b/sushi-screensaver/sushi1.png new file mode 100644 index 0000000..1f2f09b Binary files /dev/null and b/sushi-screensaver/sushi1.png differ diff --git a/sushi-screensaver/sushi2.png b/sushi-screensaver/sushi2.png new file mode 100644 index 0000000..c39265b Binary files /dev/null and b/sushi-screensaver/sushi2.png differ diff --git a/sushi-screensaver/sushi3.png b/sushi-screensaver/sushi3.png new file mode 100644 index 0000000..5583ed4 Binary files /dev/null and b/sushi-screensaver/sushi3.png differ diff --git a/sushi-screensaver/sushi4.png b/sushi-screensaver/sushi4.png new file mode 100644 index 0000000..09b9253 Binary files /dev/null and b/sushi-screensaver/sushi4.png differ diff --git a/sushi-screensaver/sushi5.png b/sushi-screensaver/sushi5.png new file mode 100644 index 0000000..c06e43e Binary files /dev/null and b/sushi-screensaver/sushi5.png differ