Add a pygame sprite example
This commit is contained in:
		
							parent
							
								
									f8015b753f
								
							
						
					
					
						commit
						3ace82b6a7
					
				
							
								
								
									
										135
									
								
								PyGame/Basics/020_sprite.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								PyGame/Basics/020_sprite.py
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -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()
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user