This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
en:part2:pygame:step008 [2010/01/24 14:17] Horst JENS |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ^ [[:en:part2:step007| ← previous]] ^ [[en:part2:start| ↑ Overview]] ^ [[:en:part2:step009| → next ]] ^ | ||
- | ====== step 008 - loading images ====== | ||
- | ==== discussion ==== | ||
- | === loading images === | ||
- | Using pre-fabricated images instead of painting all images yourself with the [[http://www.pygame.org/docs/ref/draw.html|pygame.draw - functions]] comes very handy. This example shows you how to load images into pygame. Note that in this example, the images must be in the same folder as the python program ! In this example, if pygame can not find the images, it will print an error message and use the image-drawing methods from the previous code example. | ||
- | |||
- | |||
- | |||
- | === catching file not found error ==== | ||
- | |||
- | This is done using the **try:** **except:** method. | ||
- | <code python> | ||
- | try: | ||
- | #do something risky that may not work like loading files | ||
- | #... | ||
- | except: | ||
- | #do that if an error occurs inside the try block | ||
- | #... | ||
- | # continue here if no error | ||
- | </code> | ||
- | |||
- | Also see the official documentation: | ||
- | ==== documentation ==== | ||
- | * python 2.x | ||
- | * http://docs.python.org/reference/compound_stmts.html#the-try-statement | ||
- | * python 3.x | ||
- | * http://docs.python.org/3.1/reference/compound_stmts.html#the-try-statement | ||
- | |||
- | ==== additional resources ==== | ||
- | Put those 2 graphic files in the same folder as **part2step008-loading-image.py** to make the program run correctly. If one or both of those files are not found you will see a brown and a blue circle instead: | ||
- | ^ filename ^ preview / note ^ file must be in folder ^ source / license ^ | ||
- | | ::: | left-click to zoom to original size,\\ then right-click to download | <key>.</key> means the same\\ folder as the program | ::: | | ||
- | | {{filename>babytux.png}} | {{:en:part2:babytux.png|Babytux graphic file (.png) with transparent border}} | <key>.</key> | wikimedia commons | | ||
- | | {{filename>background640x480_a.jpg}} | {{:en:part2:background640x480_a.jpg?150|background.jpg file}} \\ | <key>.</key> | Horst JENS / public domain | | ||
- | | {{:en:part2:part2step008.zip|}} | all files except the source code\\ in a zipped package | | | | ||
- | |||
- | |||
- | |||
- | |||
- | ==== source code ==== | ||
- | |||
- | <code python| part2step008-loading-image.py> | ||
- | # -*- coding: utf-8 -*- | ||
- | """ | ||
- | part2step008-loading-image.py | ||
- | |||
- | loading images from harddisk and using convert_alpha() | ||
- | This program try to load 2 image files from the harddisk. Both files must be in the | ||
- | same folder as the program itself. If the image files are not found, images are | ||
- | created by code instead and an error message is printed. | ||
- | Note that convert_alpha() is only necessary when the loaded image had | ||
- | a transparent color. Some .png and .gif files have this, but never .jpg files. | ||
- | """ | ||
- | import pygame | ||
- | pygame.init() | ||
- | screen=pygame.display.set_mode((640,480)) # try out larger values and see what happens ! | ||
- | try: | ||
- | background = pygame.image.load("background640x480_a.jpg") | ||
- | except: | ||
- | print("Error: the image background640x480_a.jpg is not in this folder") | ||
- | background = pygame.Surface(screen.get_size()) # create a pygame Surface | ||
- | background.fill((255,255,255)) # fill the background white | ||
- | pygame.draw.circle(background, (50,50,0), (300,250), 200) # draw circle | ||
- | try: | ||
- | ball = pygame.image.load("babytux.png") | ||
- | except: | ||
- | print("Error: the image babytux.png is not in this folder") | ||
- | ball = pygame.Surface((50,50)) #create a new black surface | ||
- | ball.set_colorkey((0,0,0)) | ||
- | pygame.draw.circle(ball, (0,0,255), (25,25),25) # paint blue circle | ||
- | #finally: | ||
- | background = background.convert() # jpg can not have transparency | ||
- | ball = ball.convert_alpha() # png image has transparent color | ||
- | ballx, bally = 550, 240 # start position of ball surface | ||
- | dx, dy = 60, 60 # ball speed in pixel per second ! | ||
- | screen.blit(background, (0,0)) # blit background on screen (overwriting all) | ||
- | screen.blit(ball, (ballx, bally)) # blit the ball shape | ||
- | clock = pygame.time.Clock() # create pygame clock object | ||
- | mainloop = True | ||
- | FPS = 60 # desired max. framerate in frames per second. | ||
- | while mainloop: | ||
- | milliseconds = clock.tick(FPS) # milliseconds passed since last frame | ||
- | seconds = milliseconds / 1000.0 # seconds passed since last frame | ||
- | 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 X:%.1f Y:%.1f Speed" | ||
- | " [pixel/sec] dx:%.2f dy:%.2f" % (clock.get_fps(), ballx, bally, dx, dy)) | ||
- | # only blit the part of the background where the ball was (cleanrect) | ||
- | dirtyrect = background.subsurface((round(ballx,0), | ||
- | round(bally,0), ball.get_width(), ball.get_height())) | ||
- | # comment out the next line for a funny effect ! | ||
- | screen.blit(dirtyrect, (round(ballx,0), round(bally,0))) | ||
- | #calculate new center of ball | ||
- | ballx += dx * seconds # time based movement | ||
- | bally += dy * seconds | ||
- | # bounce ball if out of screen | ||
- | if ballx < 0: | ||
- | ballx = 0 | ||
- | dx *= -1 | ||
- | elif ballx + ball.get_width() > screen.get_width(): | ||
- | ballx = screen.get_width() - ball.get_width() | ||
- | dx *= -1 | ||
- | if bally < 0: | ||
- | bally = 0 | ||
- | dy *= -1 | ||
- | elif bally + ball.get_height() > screen.get_height(): | ||
- | bally = screen.get_height() - ball.get_height() | ||
- | dy *= -1 | ||
- | # paint the ball | ||
- | screen.blit(ball, (round(ballx,0), round(bally,0))) | ||
- | pygame.display.flip() # flip the screen 30 times a second # flip the screen 30 (or FPS) times a second | ||
- | </code> | ||
- | ^ [[:en:part2:step007| ← previous]] ^ [[en:part2:start| ↑ Overview]] ^ [[:en:part2:step009| → next ]] ^ | ||