BigSteve/PyGame/Basics/020_sprite.py

135 lines
5.0 KiB
Python

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