135 lines
5.0 KiB
Python
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() |