From 821773a037974cfaac3ef09d45ec45b9cfe803d8 Mon Sep 17 00:00:00 2001
From: Junior <junior@jaj.com>
Date: Wed, 19 Jun 2024 12:38:28 -0400
Subject: [PATCH] add sprite demo

---
 PyGame/Basics/020_sprite.py | 135 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 135 insertions(+)
 create mode 100644 PyGame/Basics/020_sprite.py

diff --git a/PyGame/Basics/020_sprite.py b/PyGame/Basics/020_sprite.py
new file mode 100644
index 0000000..e3f994c
--- /dev/null
+++ b/PyGame/Basics/020_sprite.py
@@ -0,0 +1,135 @@
+import os
+os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide"
+import pygame
+import random
+import sys
+
+pygame.init()
+
+# Some variables used to initialize the window
+# These are in all caps to indicate they are global
+# constants and should not ever be changed programatically
+# - The width and height are in pixels
+# - The colors are (Red, Green, Blue) tuples
+WIN_WIDTH = 600
+WIN_HEIGHT = 480
+WIN_BG_COLOR = (26, 110, 43)
+TEXT_COLOR = (242, 238, 10)
+PIXEBOY_200 = pygame.font.Font(os.path.join("font", "Pixeboy.ttf"), 200)
+PIXEBOY_20 = pygame.font.Font(os.path.join("font", "Pixeboy.ttf"), 20)
+SPRITE_STEP_SIZE = 3
+
+# The object class for our sprite (inherits from pygame.sprite.Sprite)
+class Sprite(pygame.sprite.Sprite):
+    def __init__(self, image: pygame.Surface, start_x: int, start_y: int):
+        super().__init__()
+        self.image = image
+        self.next_x = 1
+        self.next_y = 1
+        self.rect = self.image.get_rect()
+        self.rect.x = start_x
+        self.rect.y = start_y
+    
+    def move(self):
+        self.rect.x += self.next_x * SPRITE_STEP_SIZE
+        if (self.rect.x + self.image.get_width()) > WIN_WIDTH:
+            self.rect.x = WIN_WIDTH - self.image.get_width()
+            self.next_x = -1
+        elif self.rect.x < 0:
+            self.rect.x = 0
+            self.next_x = 1
+        self.rect.y += self.next_y * SPRITE_STEP_SIZE
+        if (self.rect.y + self.image.get_height()) > WIN_HEIGHT:
+            self.rect.y = WIN_HEIGHT - self.image.get_height()
+            self.next_y = -1
+        elif self.rect.y < 0:
+            self.rect.y = 0
+            self.next_y = 1
+    
+    def collidepoint(self, p_x: int, p_y: int):
+        if self.rect.collidepoint(p_x, p_y):
+            return True
+        else:
+            return False
+
+def draw_background():
+    window.fill(WIN_BG_COLOR)
+    title_text_1 = PIXEBOY_200.render("HELLO", True, TEXT_COLOR)
+    title_text_2 = PIXEBOY_200.render("WORLD", True, TEXT_COLOR)
+    text_x = (WIN_WIDTH // 2) - (title_text_1.get_width() // 2)
+    text_y = 25
+    window.blit(title_text_1, (text_x, text_y))
+    text_x = (WIN_WIDTH // 2) - (title_text_2.get_width() // 2)
+    text_y = 25 + title_text_2.get_height() + 25
+    window.blit(title_text_2, (text_x, text_y))
+    click_text = PIXEBOY_20.render("Click The Deuce", True, TEXT_COLOR)
+    text_x = (WIN_WIDTH // 2) - (click_text.get_width() // 2)
+    text_y = WIN_HEIGHT - 5 - click_text.get_height()
+    window.blit(click_text, (text_x, text_y))
+
+window = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
+pygame.display.set_caption('PyGame Sprites')
+icon = pygame.image.load(os.path.join("img", "melon_icon_64.png"))
+icon.convert_alpha()
+pygame.display.set_icon(icon)
+
+# Import image
+emoji = pygame.image.load(os.path.join("img", "poop_emoji_sm.png"))
+emoji.convert_alpha()
+# Let's place the image 25 pixels from the bottom of the window
+emoji_start_x = (WIN_WIDTH // 2) - (emoji.get_width() // 2)
+emoji_start_y = WIN_HEIGHT - 25 - emoji.get_height()
+draw_background()
+
+all_sprites = pygame.sprite.Group()
+deuce_sprite = Sprite(emoji, emoji_start_x, emoji_start_y)
+all_sprites.add(deuce_sprite)
+
+# We can import audio files with mixer.Sound()
+# Only .ogg (Ogg Vorbis) format files should be used
+# The audio program Audacity can be used to convert files to .ogg
+# Here we will import several and put them in a list
+audio = []
+audio.append(pygame.mixer.Sound(os.path.join("snd", "toot.ogg")))
+audio.append(pygame.mixer.Sound(os.path.join("snd", "toot_echo.ogg")))
+audio.append(pygame.mixer.Sound(os.path.join("snd", "toot_trip.ogg")))
+audio.append(pygame.mixer.Sound(os.path.join("snd", "toot_wet.ogg")))
+clock = pygame.time.Clock()
+
+# Some run-time variables handling the state of the program
+running = True
+emoji_hover = False
+# The main loop. This while loop runs until "running" is False
+while running is True:
+    # We'll get the current mouse cursor position
+    mouse_x, mouse_y = pygame.mouse.get_pos()
+    # If the rectangle bounding the emoji is currently
+    # colliding with the current mouse cursor position
+    # Then change cursor
+    if deuce_sprite.collidepoint(mouse_x, mouse_y):
+        pygame.mouse.set_cursor(pygame.SYSTEM_CURSOR_HAND)
+        emoji_hover = True
+    else:
+        pygame.mouse.set_cursor(pygame.SYSTEM_CURSOR_ARROW)
+        emoji_hover = False
+    for event in pygame.event.get():
+        if event.type == pygame.QUIT:
+            running = False
+        # pygame.MOUSEBUTTONDOWN happens the moment a mouse button is clicked
+        if event.type == pygame.MOUSEBUTTONDOWN and emoji_hover is True:
+            audio[random.randrange(0, len(audio))].play()
+        # pygame.KEYDOWN happens the moment a key is pressed down
+        if event.type == pygame.KEYDOWN:
+            # If the pressed key is "ESC" button, then let's exit
+            if event.key == pygame.K_ESCAPE:
+                running = False
+    draw_background()
+    all_sprites.draw(window)
+    pygame.display.flip()
+    deuce_sprite.move()
+    clock.tick(60)
+
+# We get to this poince once "running" is False.
+# Clean up pygame with the quit() method, then exit program.
+pygame.quit()
+sys.exit()
\ No newline at end of file