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()