3.19: Drawing Images with pygame.image.load() and blit()
- Page ID
The drawing functions are fine if you want to draw simple shapes on the screen, but many games have images (also called sprites). Pygame is able to load images onto Surface objects from PNG, JPG, GIF, and BMP image files. The differences between these image file formats is described at http://invpy.com/formats.
The image of the cat was stored in a file named cat.png. To load this file’s image, the string '
cat.png' is passed to the
pygame.image.load() function. The
pygame.image.load() function call will return a Surface object that has the image drawn on it. This Surface object will be a separate Surface object from the display Surface object, so we must blit (that is, copy) the image’s Surface object to the display Surface object. Blitting is drawing the contents of one Surface onto another. It is done with the
blit() Surface object method.
If you get an error message like "
pygame.error: Couldn't open cat.png" when calling
pygame.image.load(), then make sure the cat.png file is in the same folder as the catanimation.py file before you run the program.
Line 39 of the animation program uses the
blit() method to copy
DISPLAYSURF. There are two parameters for
blit(). The first is the source Surface object, which is what will be copied onto the
DISPLAYSURF Surface object. The second parameter is a two-integer tuple for the X and Y values of the topleft corner where the image should be blitted to.
import pygame, sys from pygame.locals import * pygame.init() FPS = 30 # frames per second setting fpsClock = pygame.time.Clock() # set up the window DISPLAYSURF = pygame.display.set_mode((400, 300), 0, 32) pygame.display.set_caption('Animation') WHITE = (255, 255, 255) catImg = pygame.image.load('cat.png') catx = 10 caty = 10 direction = 'right' while True: # the main game loop DISPLAYSURF.fill(WHITE) if direction == 'right': catx += 5 if catx == 280: direction = 'down' elif direction == 'down': caty += 5 if caty == 220: direction = 'left' elif direction == 'left': catx -= 5 if catx == 10: direction = 'up' elif direction == 'up': caty -= 5 if caty == 10: direction = 'right' DISPLAYSURF.blit(catImg, (catx, caty)) for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() pygame.display.update() fpsClock.tick(FPS)
caty were set to
200 and the width of
125 and the height was
blit() call would copy this image onto
DISPLAYSURF so that the top left corner of the
catImg was at the XY coordinate (100, 200) and the bottom right corner’s XY coordinate was at (225, 279).
Note that you cannot blit to a Surface that is currently "locked" (such as when a PixelArray object has been made from it and not yet been deleted.)
The rest of the game loop is just changing the
direction variables so that the cat moves around the window. There is also a call to
pygame.event.get() to handle the