The Python Game Book

code games. learn Python.

User Tools

Site Tools




This is an old revision of the document!

step 008 - animation and sprite sheet

Remember the Subsurfaces from the last step ? And remember that the snake had always the same grinning facial expression ? Now, let's make some animated sprites1) - not pygame sprites, but surfaces that show different images of an animation cycle, like a bird flapping it wings.

Instead of painting all the single pictures of an animation cycle myself i prefer to use ready-made sprite sheets. In the data folder, you will find a spritesheet2) from showing several pictures of an animal. With the help of pygame's subsurface command, i will show you how to extract single images from the sprite sheet and use them.


additional resources

source code

# -*- coding: utf-8 -*-
animation & spritesheet

spritesheet from
import pygame
import random
import os
screen=pygame.display.set_mode((800,480)) # try out larger values and see what happens !
screenrect = screen.get_rect()
background = pygame.Surface((screen.get_size()))
backgroundrect = background.get_rect()
background.fill((255,255,255)) # fill white
background = background.convert()
# mypicture = pygame.image.load("picturefile.jpg") # simple method if picture in same folder
folder = "data" # replace with "." if pictures lay in the same folder as program
spritesheet = pygame.image.load(os.path.join(folder, "char9.bmp")).convert() # all in one line
lions = [] # a list for the lion images
# the spritesheet has lions, 128 x 64 pixels
for nbr in range(1,5,1): # first line contains 4 picutres of lions
for nbr in range(5,7,1): # second line contains 2 pictures of lions
print "len:",len(lions)

for nbr in range(len(lions)):
   lions[nbr].set_colorkey((0,0,0)) # black transparent
   lions[nbr] = lions[nbr].convert_alpha()
   print "converted nbr", nbr

for nbr in range(len(lions)):
    screen.blit(lions[nbr], (nbr*127, 0))  #blit the ball surface on the screen (on top of background)
    print "blitted nbr", nbr

screen.blit(lions[nbr], (nbr*127, 0))  #blit the ball surface on the screen (on top of background)
#screen.blit(lions[1], (x, 
clock = pygame.time.Clock()        #create pygame clock object
mainloop = True
FPS = 60                           # desired max. framerate in frames per second. 
playtime = 0
cycletime = 0 
newnr = 0 # index of the first lionimage to display
oldnr = 0 # needed to compare if image has changed
interval = .15 # how long one single images should be displayed in seconds 
while mainloop:
    milliseconds = clock.tick(FPS)  # milliseconds passed since last frame
    seconds = milliseconds / 1000.0 # seconds passed since last frame (float)
    playtime += seconds
    cycletime += seconds
    if cycletime > interval:
        cycletime = 0
        newnr += 1
    picnr = int(newnr % 5) # the remainder of a division by 5, because 6 pictures are present (0...5)
    mypicture = lions[picnr]
    if newnr > oldnr:
        #print "change to picture nr %i" % picnr
        # clean dirty rec (a bit larger than original rect):
        # blit new lion picture:
        screen.blit(mypicture, (300,300)) 
    oldnr = newnr # save oldnr 
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            mainloop = False # pygame window closed by user
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                mainloop = False # user pressed ESC
    pygame.display.set_caption("[FPS]: %.2f picture: %i" % (clock.get_fps(), picnr))
    #this would repaint the whole screen (secure, but slow)
    #screen.blit(background, (0,0))     #draw background on screen (overwriting all)

    pygame.display.flip()          # flip the screen 30 times a second
print "This 'game' was played for %.2f seconds" % playtime

a 2d-object moving around is referred as a Sprite_(computer_graphics)
a graphic file with lot's of sprites
en/part2/pygame/step008.1276593063.txt.gz · Last modified: 2014/01/09 11:07 (external edit)