Unit 12.3A · Term 3

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

Lesson Presentation

12.3A-sprites-characters.pdf · Slides for classroom use

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.speed

Sprite 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

Apply

Create a Player sprite that moves with arrow keys and stays within screen bounds.

Apply

Add 10 randomly positioned "coin" sprites (yellow circles) to the screen using a Group.

Create

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?

Calls the 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.