Sprites & Characters
Sprites are 2D images that represent game characters, enemies,
and items. PyGame's Sprite class lets you organize game objects with their own
image, position, and behavior.
Learning Objectives
- 12.5.2.2 Create characters for the application
- 12.5.3.5 Code sprite management
Conceptual Anchor
The Actor Analogy
A Sprite is like an actor in a play: it has a costume
(self.image), a position on stage (self.rect), and a
script (update() method). A Group is the cast list —
it manages all actors at once.
Rules & Theory
Loading Images
| Method | Purpose |
|---|---|
pygame.image.load("file.png") |
Load image from file |
.convert() |
Optimize for display (no transparency) |
.convert_alpha() |
Optimize with transparency support (PNG) |
pygame.transform.scale(img, (w,h)) |
Resize image |
pygame.transform.flip(img, H, V) |
Flip horizontally/vertically |
pygame.transform.rotate(img, angle) |
Rotate by degrees (counter-clockwise) |
The Sprite Class Template
class Player(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
# self.image = the visual appearance
self.image = pygame.Surface((40, 40))
self.image.fill((255, 50, 50))
# self.rect = position and collision box
self.rect = self.image.get_rect(center=(x, y))
self.speed = 5
def update(self):
"""Called every frame by the group."""
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
self.rect.x -= self.speed
if keys[pygame.K_RIGHT]:
self.rect.x += self.speedSprite Groups
| Method | Purpose |
|---|---|
group = pygame.sprite.Group() |
Create an empty group |
group.add(sprite) |
Add a sprite to the group |
group.remove(sprite) |
Remove a sprite from the group |
group.update() |
Call update() on ALL sprites |
group.draw(surface) |
Draw ALL sprites onto surface |
sprite.kill() |
Remove sprite from ALL groups |
Worked Examples
1 Player Sprite with Image
import pygame, sys
pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
# Load image OR create colored surface
self.image = pygame.Surface((50, 50))
self.image.fill((0, 200, 100))
self.rect = self.image.get_rect(center=(400, 300))
self.speed = 5
def update(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]: self.rect.x -= self.speed
if keys[pygame.K_RIGHT]: self.rect.x += self.speed
if keys[pygame.K_UP]: self.rect.y -= self.speed
if keys[pygame.K_DOWN]: self.rect.y += self.speed
self.rect.clamp_ip(screen.get_rect())
# Create sprite and group
player = Player()
all_sprites = pygame.sprite.Group(player)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
all_sprites.update()
screen.fill((30, 30, 30))
all_sprites.draw(screen)
pygame.display.flip()
clock.tick(60)
pygame.quit()
sys.exit()2 Spawning Enemies
import pygame, sys, random
class Enemy(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((30, 30))
self.image.fill((255, 50, 50))
# Spawn at random x, above screen
self.rect = self.image.get_rect(
center=(random.randint(30, 770), -30)
)
self.speed = random.randint(2, 5)
def update(self):
self.rect.y += self.speed
if self.rect.top > 600:
self.kill() # remove when off screen
# Usage in game loop:
enemies = pygame.sprite.Group()
# Spawn enemy every 60 frames
frame_count = 0
# inside loop:
frame_count += 1
if frame_count % 60 == 0:
enemies.add(Enemy())
enemies.update()
enemies.draw(screen)Common Pitfalls
Forgetting super().__init__()
Always call super().__init__() in your Sprite subclass. Without it, the sprite won't
work with groups.
Missing .convert_alpha()
When loading PNG images with transparency, use .convert_alpha(). Plain
.convert() loses the transparent background.
Tasks
Create a Player sprite that moves with arrow keys and stays within screen bounds.
Add 10 randomly positioned "coin" sprites (yellow circles) to the screen using a Group.
Create enemies that spawn at the top and fall down. Use kill() to remove them
when they exit the screen.
Self-Check Quiz
Q1: What two attributes must every Sprite have?
self.image (the
visual surface) and self.rect (position and collision box).Q2: What does group.update() do?
update()
method on every sprite in the group — used to move, animate, or update state for all objects at
once.Q3: How do you remove a sprite from the game?
sprite.kill() —
removes it from all groups it belongs to, effectively removing it from the game.