ThePythonGameBook

learn Python. Create Games

User Tools

Site Tools


en:part2:pygame:step008

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
en:part2:pygame:step008 [2010/01/24 16:10]
Horst JENS
en:part2:pygame:step008 [2011/06/23 20:03]
Horst JENS
Line 1: Line 1:
-^ [[:​en:​part2:​step007| ← previous]] ^ [[en:​part2:​start| ↑ Overview]] ^ [[:​en:​part2:​step009| → next ]] ^ +^ [[:en:part2:pygame:step007| ← previous]] ^ [[en:part2:pygame:start| ↑ Overview]] ^ [[:en:part2:pygame:step009| → next ]] ^ 
-====== ​step 008 - loading images ​====== +====== ​Step 008 - Animation ​======
-==== 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.+
  
 +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 **sprites**((a 2d-object moving around is referred as a [[wp>​Sprite_(computer_graphics)]])) - not pygame sprites, but surfaces that show different images of an animation cycle, like a bird flapping its wings.
  
 +{{ :​en:​part2:​spritesheet008.jpg?​300|}}
 +Instead of painting all the single pictures of an animation cycle myself I prefer to use ready-made sprite sheets.
  
-=== catching ​file not found error ====+In the data folder, you will find a spritesheet((a graphic ​file with lots of sprites)) from Ari Feldmann Spritelib ( http://​www.flyingyogi.com ) showing several pictures of an animal. If you use Ari's sprite'​s,​ make sure to include his [[:​en:​resources:​glossary:​s:​spritelib_license|license information]] in your program.
  
-This is done using the **try:** **except:** method. +With the help of pygame'​s subsurface command, I will show you how to extract single images from the sprite sheet and use them.
-<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 ​==== +==== Code Discussion ​====
-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((left-click to zoom to original size)) / note  ^ folder ((<​key>​.</​key> ​ means the same folder as the program)) ^ source / license ^ +
-| {{filename>​babytux.png}} | {{:​en:​part2:​babytux.png|Babytux graphic file (.png) with transparent border}} |  <​key>​.</​key> ​  | [[http://​commons.wikimedia.org/​wiki/​File:​Mini-babytux.gif|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 +===== Source Code on Github ===== 
-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. +To run this example you need: 
-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. +^  file  ^  in folder ​ ^  download ​ ^ 
-"""​ +|  [[https://​github.com/​horstjens/​ThePythonGameBook/​raw/​master/​pygame/​008_animation.py|008_animation.py]]  |  ''​pygame'' ​ |  Download the whole Archive with all files from Github ​\\ ​ https://github.com/​horstjens/​ThePythonGameBook/​archives/​master ​ | 
-import pygame +|  [[https://​github.com/​horstjens/​ThePythonGameBook/​blob/​master/​pygame/data/char9.bmp|char9.bmp]] \\ [[https://​github.com/​horstjens/​ThePythonGameBook/​blob/​master/​pygame/data/char9.bmp|{{:en:part2:pygame:char9_150.jpg|Sprite sheet by Ari Feldman}}]] ​  ''​pygame/​data'' ​ |  :::  | 
-pygame.init() + 
-screen=pygame.display.set_mode((640,​480)) # try out larger values and see what happens ! + 
-try: +View/Edit/​Download the file directly ​in Githubhttps://​github.com/​horstjens/​ThePythonGameBook/​blob/​master/​pygame/​008_animation.py 
-    background = pygame.image.load("​background640x480_a.jpg"​) + 
-except: +//click reload in your browser ​if you see no code here:// 
-    print("​Errorthe image background640x480_a.jpg is not in this folder"​) +<​html>​ 
-    ​background = pygame.Surface(screen.get_size()) # create a pygame ​Surface + <script src="http://gist-it.appspot.com/​github/​horstjens/​ThePythonGameBook/​blob/​master/​pygame/​008_animation.py"> 
-    background.fill((255,​255,​255)) ​                # fill the background white  + </script></​html>​ 
-    pygame.draw.circle(background,​ (50,50,0), (300,250), 200)   # draw circle + 
-try: + 
-    ball = pygame.image.load("​babytux.png"​) +====== ​Comment this Page ====== 
-except: +~~DISQUS~~ 
-    print("​Errorthe image babytux.png is not in this folder"​) + 
-    ball = pygame.Surface((50,​50)) ​    #​create a new black surface  +^ [[:en:part2:pygame:step007| ← previous]] ^ [[en:part2:pygame:start| ↑ Overview]] ^ [[:en:part2:pygame:step009| → next ]] ^
-    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 +
-        dx *-1  +
-    elif ballx + ball.get_width() > screen.get_width():​ +
-        ballx screen.get_width() - ball.get_width() +
-        dx *-1 +
-    if bally < 0: +
-        bally +
-        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 ]] ^+