Using a sprite map
A sprite map is where one image has several icons drawn on it. The idea is you rotate through the icons to give the appearance of animation.
Sprite maps are easy to find online, or create your own using a site such as https://www.piskelapp.com/
There are a couple of different ways of using these in your game/app.
- Method 1 - Extract a sub-part of the image and use that. This is the best method if you only want to use parts of the sprite sheet, or different sprites are different sizes etc.
- Method 2 - I’ve written a function you can use that will automatically subdivide your image into a grid of rows and columns. This method works best when all sprites are of the same width and height (such as if you have created them yourself using piskelapp or similar)
def get_image_partial( filename, x, y, w, h ): spritesheet = pygame.image.load( filename ).convert() image = pygame.Surface( [w,h] ).convert() image.blit( spritesheet, (0,0), (x,y,w,h)) return image # Create your pygame image variable using this command instead of pygame.image.load pic = get_image_partial("sprites.gif", 0, 0, 50, 50) # within your game loop, display the same way as a normal image window.blit(pic, (x,y))
This demo uses a sprite from https://chielo.deviantart.com/art/Anna-Walking-Sprite-Sheet-357242964 (I also have a link to it on my Python page to make it easier to get)
Explanatory notes: The load_sprite_map() command takes 5 parameters:
- The filename of your jpeg or png image file
- The number of columns in your sprite map image file
- The number of rows in your sprite map image file
- The width of each column (pixels) in your sprite map image file
- The height of each column (pixels) in your sprite map image file
It then returns a list of images that you can alternate through just like any other list.
In your main game file:
import pygame, time, random from pygame.locals import * from spritemap import load_sprite_map # Other functions we'll use def constrain(val, min, max): """ Keep val within the min and max, looping to the other if it crosses""" if val < min: val = max elif val > max: val = min return val # Start PyGame pygame.init() window = pygame.display.set_mode((200,200)) fps = pygame.time.Clock() # Declare colours, fonts, sprites and sounds SPRITES = load_sprite_map("anna_walking.png", cols=7, rows=4, icon_width=32, icon_height=64) BLACK = (0,0,0) sprite_num = 21 # starting sprite number from_sprite = 21 # number of 1st sprite in the walking sequence to_sprite = 27 # number of last sprite in the walking sequence x,y = 34,34 # top-left coordinate to draw the sprite walking_left = False walking_right = False quit = False # Main game loop while not quit: # Process events for event in pygame.event.get(): if event.type == KEYDOWN: if event.key == K_RIGHT: walking_right = True elif event.key == K_LEFT: walking_left = True elif event.key == K_ESCAPE: quit = True elif event.type == KEYUP: if event.key == K_RIGHT: walking_right = False elif event.key == K_LEFT: walking_left = False # Perform calculations if walking_left: sprite_num = sprite_num - 1 elif walking_right: sprite_num = sprite_num + 1 sprite_num = constrain(sprite_num, from_sprite, to_sprite) # Draw graphics window.fill(BLACK) window.blit(SPRITES[sprite_num], (x,y)) pygame.display.update() fps.tick(20) pygame.quit()
In a file called
### File: spritemap.py import pygame def load_sprite_map(filename, cols, rows, icon_width, icon_height): images =  SS = pygame.image.load(filename).convert_alpha() for row in range(0, rows): for col in range(0, cols): x = col * icon_width y = row * icon_height image = pygame.Surface((icon_width,icon_height), pygame.SRCALPHA).convert_alpha() image.blit(SS, (0, 0), (x,y,icon_width,icon_height)) images.append( image ) return images