Anonymous avatar Anonymous committed 0f3a0f7

Comments (0)

Files changed (68)

             return None
         raise AttributeError
 
+    def __copy__(self):
+        f = SDL_PixelFormat()
+        f._palette = self._palette
+        f.BitsPerPixel = self.BitsPerPixel
+        f.BytesPerPixel = self.BytesPerPixel
+        f.Rloss = self.Rloss
+        f.Gloss = self.Gloss
+        f.Bloss = self.Bloss
+        f.Aloss = self.Aloss
+        f.Rshift = self.Rshift
+        f.Gshift = self.Gshift
+        f.Bshift = self.Bshift
+        f.Ashift = self.Ashift
+        f.Rmask = self.Rmask
+        f.Gmask = self.Gmask
+        f.Bmask = self.Bmask
+        f.Amask = self.Amask
+        f.colorkey = self.colorkey
+        f.alpha = self.alpha
+        return f
+
 class SDL_Surface(Structure):
     '''Read-only surface structure.
 
     '''
     title, icon = c_char_p(), c_char_p()
     _SDL_WM_GetCaption(byref(title), byref(icon))
-    return title.value.decode('utf-8'), icon.value.decode('utf-8')
+
+    if title.value:
+        title = title.value.decode('utf-8')
+    else:
+        title = None
+
+    if icon.value:
+        icon = icon.value.decode('utf-8')
+    else:
+        icon = None
+    return title, icon
 
 _SDL_WM_SetIcon = SDL.dll.private_function('SDL_WM_SetIcon',
     arg_types=[POINTER(SDL_Surface), POINTER(c_ubyte)],

examples_pygame/aliens.py

+#! /usr/bin/env python
+
+import random, os.path
+
+#import basic pygame modules
+import pygame
+from pygame.locals import *
+
+#see if we can load more than standard BMP
+if not pygame.image.get_extended():
+    raise SystemExit, "Sorry, extended image module required"
+
+
+#game constants
+MAX_SHOTS      = 2      #most player bullets onscreen
+ALIEN_ODDS     = 22     #chances a new alien appears
+BOMB_ODDS      = 60    #chances a new bomb will drop
+ALIEN_RELOAD   = 12     #frames between new aliens
+SCREENRECT     = Rect(0, 0, 640, 480)
+SCORE          = 0
+
+
+def load_image(file):
+    "loads an image, prepares it for play"
+    file = os.path.join('data', file)
+    try:
+        surface = pygame.image.load(file)
+    except pygame.error:
+        raise SystemExit, 'Could not load image "%s" %s'%(file, pygame.get_error())
+    return surface.convert()
+
+def load_images(*files):
+    imgs = []
+    for file in files:
+        imgs.append(load_image(file))
+    return imgs
+
+
+class dummysound:
+    def play(self): pass
+
+def load_sound(file):
+    if not pygame.mixer: return dummysound()
+    file = os.path.join('data', file)
+    try:
+        sound = pygame.mixer.Sound(file)
+        return sound
+    except pygame.error:
+        print 'Warning, unable to load,', file
+    return dummysound()
+
+
+
+# each type of game object gets an init and an
+# update function. the update function is called
+# once per frame, and it is when each object should
+# change it's current position and state. the Player
+# object actually gets a "move" function instead of
+# update, since it is passed extra information about
+# the keyboard
+
+
+class Player(pygame.sprite.Sprite):
+    speed = 10
+    bounce = 24
+    gun_offset = -11
+    images = []
+    def __init__(self):
+        pygame.sprite.Sprite.__init__(self, self.containers)
+        self.image = self.images[0]
+        self.rect = self.image.get_rect(midbottom=SCREENRECT.midbottom)
+        self.reloading = 0
+        self.origtop = self.rect.top
+        self.facing = -1
+
+    def move(self, direction):
+        if direction: self.facing = direction
+        self.rect.move_ip(direction*self.speed, 0)
+        self.rect = self.rect.clamp(SCREENRECT)
+        if direction < 0:
+            self.image = self.images[0]
+        elif direction > 0:
+            self.image = self.images[1]
+        self.rect.top = self.origtop - (self.rect.left/self.bounce%2)
+
+    def gunpos(self):
+        pos = self.facing*self.gun_offset + self.rect.centerx
+        return pos, self.rect.top
+
+
+class Alien(pygame.sprite.Sprite):
+    speed = 13
+    animcycle = 12
+    images = []
+    def __init__(self):
+        pygame.sprite.Sprite.__init__(self, self.containers)
+        self.image = self.images[0]
+        self.rect = self.image.get_rect()
+        self.facing = random.choice((-1,1)) * Alien.speed
+        self.frame = 0
+        if self.facing < 0:
+            self.rect.right = SCREENRECT.right
+
+    def update(self):
+        self.rect.move_ip(self.facing, 0)
+        if not SCREENRECT.contains(self.rect):
+            self.facing = -self.facing;
+            self.rect.top = self.rect.bottom + 1
+            self.rect = self.rect.clamp(SCREENRECT)
+        self.frame = self.frame + 1
+        self.image = self.images[self.frame/self.animcycle%3]
+
+
+class Explosion(pygame.sprite.Sprite):
+    defaultlife = 12
+    animcycle = 3
+    images = []
+    def __init__(self, actor):
+        pygame.sprite.Sprite.__init__(self, self.containers)
+        self.image = self.images[0]
+        self.rect = self.image.get_rect(center=actor.rect.center)
+        self.life = self.defaultlife
+
+    def update(self):
+        self.life = self.life - 1
+        self.image = self.images[self.life/self.animcycle%2]
+        if self.life <= 0: self.kill()
+
+
+class Shot(pygame.sprite.Sprite):
+    speed = -11
+    images = []
+    def __init__(self, pos):
+        pygame.sprite.Sprite.__init__(self, self.containers)
+        self.image = self.images[0]
+        self.rect = self.image.get_rect(midbottom=pos)
+
+    def update(self):
+        self.rect.move_ip(0, self.speed)
+        if self.rect.top <= 0:
+            self.kill()
+
+
+class Bomb(pygame.sprite.Sprite):
+    speed = 9
+    images = []
+    def __init__(self, alien):
+        pygame.sprite.Sprite.__init__(self, self.containers)
+        self.image = self.images[0]
+        self.rect = self.image.get_rect(midbottom=
+                    alien.rect.move(0,5).midbottom)
+
+    def update(self):
+        self.rect.move_ip(0, self.speed)
+        if self.rect.bottom >= 470:
+            Explosion(self)
+            self.kill()
+
+
+class Score(pygame.sprite.Sprite):
+    def __init__(self):
+        pygame.sprite.Sprite.__init__(self)
+        self.font = pygame.font.Font(None, 20)
+        self.font.set_italic(1)
+        self.color = Color('white')
+        self.lastscore = -1
+        self.update()
+        self.rect = self.image.get_rect().move(10, 450)
+
+    def update(self):
+        if SCORE != self.lastscore:
+            self.lastscore = SCORE
+            msg = "Score: %d" % SCORE
+            self.image = self.font.render(msg, 0, self.color)
+
+
+
+def main(winstyle = 0):
+    # Initialize pygame
+    pygame.init()
+    if pygame.mixer and not pygame.mixer.get_init():
+        print 'Warning, no sound'
+        pygame.mixer = None
+
+    # Set the display mode
+    winstyle = 0  # |FULLSCREEN
+    bestdepth = pygame.display.mode_ok(SCREENRECT.size, winstyle, 32)
+    screen = pygame.display.set_mode(SCREENRECT.size, winstyle, bestdepth)
+
+    #Load images, assign to sprite classes
+    #(do this before the classes are used, after screen setup)
+    img = load_image('player1.gif')
+    Player.images = [img, pygame.transform.flip(img, 1, 0)]
+    img = load_image('explosion1.gif')
+    Explosion.images = [img, pygame.transform.flip(img, 1, 1)]
+    Alien.images = load_images('alien1.gif', 'alien2.gif', 'alien3.gif')
+    Bomb.images = [load_image('bomb.gif')]
+    Shot.images = [load_image('shot.gif')]
+
+    #decorate the game window
+    icon = pygame.transform.scale(Alien.images[0], (32, 32))
+    pygame.display.set_icon(icon)
+    pygame.display.set_caption('Pygame Aliens')
+    pygame.mouse.set_visible(0)
+
+    #create the background, tile the bgd image
+    bgdtile = load_image('background.gif')
+    background = pygame.Surface(SCREENRECT.size)
+    for x in range(0, SCREENRECT.width, bgdtile.get_width()):
+        background.blit(bgdtile, (x, 0))
+    screen.blit(background, (0,0))
+    pygame.display.flip()
+
+    #load the sound effects
+    boom_sound = load_sound('boom.wav')
+    shoot_sound = load_sound('car_door.wav')
+    if pygame.mixer:
+        music = os.path.join('data', 'house_lo.wav')
+        pygame.mixer.music.load(music)
+        pygame.mixer.music.play(-1)
+
+    # Initialize Game Groups
+    aliens = pygame.sprite.Group()
+    shots = pygame.sprite.Group()
+    bombs = pygame.sprite.Group()
+    all = pygame.sprite.RenderUpdates()
+    lastalien = pygame.sprite.GroupSingle()
+
+    #assign default groups to each sprite class
+    Player.containers = all
+    Alien.containers = aliens, all, lastalien
+    Shot.containers = shots, all
+    Bomb.containers = bombs, all
+    Explosion.containers = all
+    Score.containers = all
+
+    #Create Some Starting Values
+    global score
+    alienreload = ALIEN_RELOAD
+    kills = 0
+    clock = pygame.time.Clock()
+
+    #initialize our starting sprites
+    global SCORE
+    player = Player()
+    Alien() #note, this 'lives' because it goes into a sprite group
+    if pygame.font:
+        all.add(Score())
+
+
+    while player.alive():
+
+        #get input
+        for event in pygame.event.get():
+            if event.type == QUIT or \
+                (event.type == KEYDOWN and event.key == K_ESCAPE):
+                    return
+        keystate = pygame.key.get_pressed()
+
+        # clear/erase the last drawn sprites
+        all.clear(screen, background)
+
+        #update all the sprites
+        all.update()
+
+        #handle player input
+        direction = keystate[K_RIGHT] - keystate[K_LEFT]
+        player.move(direction)
+        firing = keystate[K_SPACE]
+        if not player.reloading and firing and len(shots) < MAX_SHOTS:
+            Shot(player.gunpos())
+            shoot_sound.play()
+        player.reloading = firing
+
+        # Create new alien
+        if alienreload:
+            alienreload = alienreload - 1
+        elif not int(random.random() * ALIEN_ODDS):
+            Alien()
+            alienreload = ALIEN_RELOAD
+
+        # Drop bombs
+        if lastalien and not int(random.random() * BOMB_ODDS):
+            Bomb(lastalien.sprite)
+
+        # Detect collisions
+        for alien in pygame.sprite.spritecollide(player, aliens, 1):
+            boom_sound.play()
+            Explosion(alien)
+            Explosion(player)
+            SCORE = SCORE + 1
+            player.kill()
+
+        for alien in pygame.sprite.groupcollide(shots, aliens, 1, 1).keys():
+            boom_sound.play()
+            Explosion(alien)
+            SCORE = SCORE + 1
+
+        for bomb in pygame.sprite.spritecollide(player, bombs, 1):
+            boom_sound.play()
+            Explosion(player)
+            Explosion(bomb)
+            player.kill()
+
+        #draw the scene
+        dirty = all.draw(screen)
+        pygame.display.update(dirty)
+
+        #cap the framerate
+        clock.tick(40)
+
+    if pygame.mixer:
+        pygame.mixer.music.fadeout(1000)
+    pygame.time.wait(1000)
+
+
+
+#call the "main" function if running this script
+if __name__ == '__main__': main()
+

examples_pygame/arraydemo.py

+#!/usr/bin/env python
+
+import os
+try:
+    import pygame
+    import Numeric as N
+    from pygame.locals import *
+    surfarray = pygame.surfarray
+    if not surfarray: raise ImportError
+except ImportError:
+    raise ImportError, 'Error Importing Pygame/surfarray or Numeric'
+
+
+pygame.init()
+print 'Press the mouse button to advance image.'
+print 'Press the "s" key to save the current image.'
+
+
+def surfdemo_show(array_img, name):
+    "displays a surface, waits for user to continue"
+    screen = pygame.display.set_mode(array_img.shape[:2], 0, 32)
+    surfarray.blit_array(screen, array_img)
+    pygame.display.flip()
+    pygame.display.set_caption(name)
+    while 1:
+        e = pygame.event.wait()
+        if e.type == MOUSEBUTTONDOWN: break
+        elif e.type == KEYDOWN and e.key == K_s:
+            #pygame.image.save(screen, name+'.bmp')
+            #s = pygame.Surface(screen.get_size(), 0, 32)
+            #s = s.convert_alpha()
+            #s.fill((0,0,0,255))
+            #s.blit(screen, (0,0))
+            #s.fill((222,0,0,50), (0,0,40,40))
+            #pygame.image.save_extended(s, name+'.png')
+            #pygame.image.save(s, name+'.png')
+            #pygame.image.save(screen, name+'_screen.png')
+            #pygame.image.save(s, name+'.tga')
+            pygame.image.save(screen, name+'.png')
+        elif e.type == QUIT: raise SystemExit
+
+
+
+
+#allblack
+allblack = N.zeros((128, 128))
+surfdemo_show(allblack, 'allblack')
+
+
+#striped
+striped = N.zeros((128, 128, 3))
+striped[:] = (255, 0, 0)
+striped[:,::3] = (0, 255, 255)
+surfdemo_show(striped, 'striped')
+
+
+#imgarray
+imagename = os.path.join('data', 'arraydemo.bmp')
+imgsurface = pygame.image.load(imagename)
+imgarray = surfarray.array2d(imgsurface)
+surfdemo_show(imgarray, 'imgarray')
+
+
+#flipped
+flipped = imgarray[:,::-1]
+surfdemo_show(flipped, 'flipped')
+
+
+#scaledown
+scaledown = imgarray[::2,::2]
+surfdemo_show(scaledown, 'scaledown')
+
+
+#scaleup
+size = N.array(imgarray.shape)*2
+scaleup = N.zeros(size)
+scaleup[::2,::2] = imgarray
+scaleup[1::2,::2] = imgarray
+scaleup[:,1::2] = scaleup[:,::2]
+surfdemo_show(scaleup, 'scaleup')
+
+
+#redimg
+rgbarray = surfarray.array3d(imgsurface)
+redimg = N.array(rgbarray)
+redimg[:,:,1:] = 0
+surfdemo_show(redimg, 'redimg')
+
+
+#soften
+soften = N.array(rgbarray)*1
+soften[1:,:]  += rgbarray[:-1,:]*8
+soften[:-1,:] += rgbarray[1:,:]*8
+soften[:,1:]  += rgbarray[:,:-1]*8
+soften[:,:-1] += rgbarray[:,1:]*8
+soften /= 33
+surfdemo_show(soften, 'soften')
+
+
+#crossfade (50%)
+src = N.array(rgbarray)
+dest = N.zeros(rgbarray.shape)
+dest[:] = 20, 50, 100
+diff = (dest - src) * 0.50
+xfade = src + diff.astype(N.Int)
+surfdemo_show(xfade, 'xfade')
+
+
+
+#alldone

examples_pygame/blit_blends.py

+#!/usr/bin/env python
+
+# fake additive blending.  Using Numeric.  it doesn't clamp.
+# press r,g,b
+
+import os, pygame
+from pygame.locals import *
+
+try:
+    import pygame.surfarray
+    import Numeric
+except:
+    print "no surfarray for you!  install Numeric"
+
+import time
+        
+
+def main():
+    pygame.init()
+    screen = pygame.display.set_mode((640, 480))
+
+    im1= pygame.Surface(screen.get_size())
+    #im1= im1.convert()
+    im1.fill((100, 0, 0))
+
+    
+
+    im2= pygame.Surface(screen.get_size())
+    im2.fill((0, 50, 0))
+    # we make a srcalpha copy of it.
+    #im3= im2.convert(SRCALPHA)
+    im3 = im2
+    im3.set_alpha(127)
+
+    images = {}
+    images[K_1] = im2
+    images[K_2] = pygame.image.load(os.path.join("data", "chimp.bmp"))
+    images[K_3] = pygame.image.load(os.path.join("data", "alien3.gif"))
+    images[K_4] = pygame.image.load(os.path.join("data", "liquid.bmp"))
+    img_to_blit = im2.convert()
+    iaa = img_to_blit.convert_alpha()
+
+
+
+    blits = {}
+    blits[K_a] = BLEND_ADD
+    blits[K_s] = BLEND_SUB
+    blits[K_m] = BLEND_MULT
+    blits[K_EQUALS] = BLEND_MAX
+    blits[K_MINUS] = BLEND_MIN
+
+
+    screen.blit(im1, (0, 0))
+    pygame.display.flip()
+    clock = pygame.time.Clock()
+    print "one pixel is:%s:" % [im1.get_at((0,0))]
+    
+    while 1:
+        clock.tick(60)
+
+        for event in pygame.event.get():
+            if event.type == QUIT:
+                return
+            if event.type == KEYDOWN:
+                usage()
+
+            if event.type == KEYDOWN and event.key == K_ESCAPE:
+                return
+
+            elif event.type == KEYDOWN and event.key in images.keys():
+                img_to_blit = images[event.key]
+                iaa = img_to_blit.convert_alpha()
+
+            elif event.type == KEYDOWN and event.key in blits.keys():
+                t1 = time.time()
+                # blits is a dict keyed with key -> blit flag.  eg BLEND_ADD.
+                im1.blit(img_to_blit, (0,0), None, blits[event.key])
+                t2 = time.time()
+                print "one pixel is:%s:" % [im1.get_at((0,0))]
+                print "time to do:%s:" % (t2-t1)
+
+            elif event.type == KEYDOWN and event.key in [K_o]:
+                t1 = time.time()
+                # blits is a dict keyed with key -> blit flag.  eg BLEND_ADD.
+                im1.blit(iaa, (0,0))
+                t2 = time.time()
+                print "one pixel is:%s:" % [im1.get_at((0,0))]
+                print "time to do:%s:" % (t2-t1)
+
+
+            elif event.type == KEYDOWN and event.key == K_SPACE:
+                # this additive blend without clamp two surfaces.
+                #im1.set_alpha(127)
+                #im1.blit(im1, (0,0))
+                #im1.set_alpha(255)
+                t1 = time.time()
+
+                im1p = pygame.surfarray.pixels2d(im1)
+                im2p = pygame.surfarray.pixels2d(im2)
+                im1p += im2p
+                del im1p
+                del im2p
+                t2 = time.time()
+                print "one pixel is:%s:" % [im1.get_at((0,0))]
+                print "time to do:%s:" % (t2-t1)
+
+            elif event.type == KEYDOWN and event.key in [K_z]:
+                t1 = time.time()
+                im1p = pygame.surfarray.pixels3d(im1)
+                im2p = pygame.surfarray.pixels3d(im2)
+                im1p16 = im1p.astype(Numeric.UInt16)
+                im2p16 = im1p.astype(Numeric.UInt16)
+                im1p16 += im2p16
+                im1p16 = Numeric.minimum(im1p16, 255)
+                pygame.surfarray.blit_array(im1, im1p16)
+
+                del im1p
+                del im2p
+                t2 = time.time()
+                print "one pixel is:%s:" % [im1.get_at((0,0))]
+                print "time to do:%s:" % (t2-t1)
+
+            elif event.type == KEYDOWN and event.key in [K_r, K_g, K_b]:
+                # this adds one to each pixel.
+                colmap={}
+                colmap[K_r] = 0x10000
+                colmap[K_g] = 0x00100
+                colmap[K_b] = 0x00001
+                im1p = pygame.surfarray.pixels2d(im1)
+                im1p += colmap[event.key]
+                del im1p
+                print "one pixel is:%s:" % [im1.get_at((0,0))]
+
+            elif event.type == KEYDOWN and event.key == K_p:
+                print "one pixel is:%s:" % [im1.get_at((0,0))]
+
+
+
+
+
+            elif event.type == KEYDOWN and event.key == K_f:
+                # this additive blend without clamp two surfaces.
+
+                t1 = time.time()
+                im1.set_alpha(127)
+                im1.blit(im2, (0,0))
+                im1.set_alpha(255)
+
+                t2 = time.time()
+                print "one pixel is:%s:" % [im1.get_at((0,0))]
+                print "time to do:%s:" % (t2-t1)
+
+
+        screen.blit(im1, (0, 0))
+        pygame.display.flip()
+
+def usage():
+    print "press keys 1-5 to change image to blit."
+    print "A - ADD, S- SUB, M- MULT, - MIN, + MAX"
+
+if __name__ == '__main__': 
+    usage()
+    main()

examples_pygame/chimp.py

+#!/usr/bin/env python
+"""
+This simple example is used for the line-by-line tutorial
+that comes with pygame. It is based on a 'popular' web banner.
+Note there are comments here, but for the full explanation, 
+follow along in the tutorial.
+"""
+
+
+#Import Modules
+import os, pygame
+from pygame.locals import *
+
+if not pygame.font: print 'Warning, fonts disabled'
+if not pygame.mixer: print 'Warning, sound disabled'
+
+
+#functions to create our resources
+def load_image(name, colorkey=None):
+    fullname = os.path.join('data', name)
+    try:
+        image = pygame.image.load(fullname)
+    except pygame.error, message:
+        print 'Cannot load image:', fullname
+        raise SystemExit, message
+    image = image.convert()
+    if colorkey is not None:
+        if colorkey is -1:
+            colorkey = image.get_at((0,0))
+        image.set_colorkey(colorkey, RLEACCEL)
+    return image, image.get_rect()
+
+def load_sound(name):
+    class NoneSound:
+        def play(self): pass
+    if not pygame.mixer or not pygame.mixer.get_init():
+        return NoneSound()
+    fullname = os.path.join('data', name)
+    try:
+        sound = pygame.mixer.Sound(fullname)
+    except pygame.error, message:
+        print 'Cannot load sound:', fullname
+        raise SystemExit, message
+    return sound
+        
+
+#classes for our game objects
+class Fist(pygame.sprite.Sprite):
+    """moves a clenched fist on the screen, following the mouse"""
+    def __init__(self):
+        pygame.sprite.Sprite.__init__(self) #call Sprite initializer
+        self.image, self.rect = load_image('fist.bmp', -1)
+        self.punching = 0
+
+    def update(self):
+        "move the fist based on the mouse position"
+        pos = pygame.mouse.get_pos()
+        self.rect.midtop = pos
+        if self.punching:
+            self.rect.move_ip(5, 10)
+
+    def punch(self, target):
+        "returns true if the fist collides with the target"
+        if not self.punching:
+            self.punching = 1
+            hitbox = self.rect.inflate(-5, -5)
+            return hitbox.colliderect(target.rect)
+
+    def unpunch(self):
+        "called to pull the fist back"
+        self.punching = 0
+
+
+class Chimp(pygame.sprite.Sprite):
+    """moves a monkey critter across the screen. it can spin the
+       monkey when it is punched."""
+    def __init__(self):
+        pygame.sprite.Sprite.__init__(self) #call Sprite intializer
+        self.image, self.rect = load_image('chimp.bmp', -1)
+        screen = pygame.display.get_surface()
+        self.area = screen.get_rect()
+        self.rect.topleft = 10, 10
+        self.move = 9
+        self.dizzy = 0
+
+    def update(self):
+        "walk or spin, depending on the monkeys state"
+        if self.dizzy:
+            self._spin()
+        else:
+            self._walk()
+
+    def _walk(self):
+        "move the monkey across the screen, and turn at the ends"
+        newpos = self.rect.move((self.move, 0))
+        if self.rect.left < self.area.left or \
+            self.rect.right > self.area.right:
+            self.move = -self.move
+            newpos = self.rect.move((self.move, 0))
+            self.image = pygame.transform.flip(self.image, 1, 0)
+        self.rect = newpos
+
+    def _spin(self):
+        "spin the monkey image"
+        center = self.rect.center
+        self.dizzy = self.dizzy + 12
+        if self.dizzy >= 360:
+            self.dizzy = 0
+            self.image = self.original
+        else:
+            rotate = pygame.transform.rotate
+            self.image = rotate(self.original, self.dizzy)
+        self.rect = self.image.get_rect(center=center)
+
+    def punched(self):
+        "this will cause the monkey to start spinning"
+        if not self.dizzy:
+            self.dizzy = 1
+            self.original = self.image
+        
+
+def main():
+    """this function is called when the program starts.
+       it initializes everything it needs, then runs in
+       a loop until the function returns."""
+#Initialize Everything
+    pygame.init()
+    screen = pygame.display.set_mode((468, 60))
+    pygame.display.set_caption('Monkey Fever')
+    pygame.mouse.set_visible(0)
+
+#Create The Backgound
+    background = pygame.Surface(screen.get_size())
+    background = background.convert()
+    background.fill((250, 250, 250))
+    
+#Put Text On The Background, Centered
+    if pygame.font:
+        font = pygame.font.Font(None, 36)
+        text = font.render("Pummel The Chimp, And Win $$$", 1, (10, 10, 10))
+        textpos = text.get_rect(centerx=background.get_width()/2)
+        background.blit(text, textpos)
+
+#Display The Background
+    screen.blit(background, (0, 0))
+    pygame.display.flip()
+    
+#Prepare Game Objects
+    clock = pygame.time.Clock()
+    whiff_sound = load_sound('whiff.wav')
+    punch_sound = load_sound('punch.wav')
+    chimp = Chimp()
+    fist = Fist()
+    allsprites = pygame.sprite.RenderPlain((fist, chimp))
+    
+#Main Loop
+    while 1:
+        clock.tick(60)
+
+    #Handle Input Events
+        for event in pygame.event.get():
+            if event.type == QUIT:
+                return
+            elif event.type == KEYDOWN and event.key == K_ESCAPE:
+                return
+            elif event.type == MOUSEBUTTONDOWN:
+                if fist.punch(chimp):
+                    punch_sound.play() #punch
+                    chimp.punched()
+                else:
+                    whiff_sound.play() #miss
+            elif event.type == MOUSEBUTTONUP:
+                fist.unpunch()
+
+        allsprites.update()
+
+    #Draw Everything
+        screen.blit(background, (0, 0))
+        allsprites.draw(screen)
+        pygame.display.flip()
+
+#Game Over
+
+
+#this calls the 'main' function when this script is executed
+if __name__ == '__main__': main()

examples_pygame/cursors.py

+
+import pygame
+
+
+arrow = ( "xX                      ",
+          "X.X                     ",
+          "X..X                    ",
+          "X...X                   ",
+          "X....X                  ",
+          "X.....X                 ",
+          "X......X                ",
+          "X.......X               ",
+          "X........X              ",
+          "X.........X             ",
+          "X......XXXXX            ",
+          "X...X..X                ",
+          "X..XX..X                ",
+          "X.X XX..X               ",
+          "XX   X..X               ",
+          "X     X..X              ",
+          "      X..X              ",
+          "       X..X             ",
+          "       X..X             ",
+          "        XX              ",
+          "                        ",
+          "                        ",
+          "                        ",
+          "                        ")
+
+
+no = ("                        ",
+         "                        ",
+         "         XXXXXX         ",
+         "       XX......XX       ",
+         "      X..........X      ",
+         "     X....XXXX....X     ",
+         "    X...XX    XX...X    ",
+         "   X.....X      X...X   ",
+         "   X..X...X      X..X   ",
+         "  X...XX...X     X...X  ",
+         "  X..X  X...X     X..X  ",
+         "  X..X   X...X    X..X  ",
+         "  X..X    X.,.X   X..X  ",
+         "  X..X     X...X  X..X  ",
+         "  X...X     X...XX...X  ",
+         "   X..X      X...X..X   ",
+         "   X...X      X.....X   ",
+         "    X...XX     X...X    ",
+         "     X....XXXXX...X     ",
+         "      X..........X      ",
+         "       XX......XX       ",
+         "         XXXXXX         ",
+         "                        ",
+         "                        ",
+        )
+
+def TestCursor(arrow):
+    hotspot = None
+    for y in range(len(arrow)):
+        for x in range(len(arrow[y])):
+            if arrow[y][x] in ['x', ',', 'O']:
+                hotspot = x,y
+                break
+        if hotspot != None:
+            break
+    if hotspot == None:
+        raise Exception("No hotspot specified for cursor '%s'!" %
+cursorname)
+    s2 = []
+    for line in arrow:
+        s2.append(line.replace('x', 'X').replace(',', '.').replace('O',
+'o'))
+    cursor, mask = pygame.cursors.compile(s2, 'X', '.', 'o')
+    size = len(arrow[0]), len(arrow)
+    pygame.mouse.set_cursor(size, hotspot, cursor, mask)
+
+def main():
+    pygame.init()
+    pygame.font.init()
+    font = pygame.font.Font(None, 24)
+    bg = pygame.display.set_mode((800, 600), 0, 24)
+    bg.fill((255,255,255))
+    bg.blit(font.render("Click to advance", 1, (0, 0, 0)), (0, 0))
+    pygame.display.update()
+    for cursor in [no, arrow]:
+        TestCursor(cursor)
+        quit = 0
+        while not quit:
+            pygame.event.pump()
+            for e in pygame.event.get():
+                if e.type == pygame.MOUSEBUTTONDOWN:
+                    quit = 1
+    pygame.quit()
+
+main()
+
Add a comment to this file

examples_pygame/data/alien1.gif

Added
New image
Add a comment to this file

examples_pygame/data/alien2.gif

Added
New image
Add a comment to this file

examples_pygame/data/alien3.gif

Added
New image
Add a comment to this file

examples_pygame/data/arraydemo.bmp

Added
New image
Add a comment to this file

examples_pygame/data/asprite.bmp

Added
New image
Add a comment to this file

examples_pygame/data/background.gif

Added
New image
Add a comment to this file

examples_pygame/data/bomb.gif

Added
New image
Add a comment to this file

examples_pygame/data/boom.wav

Binary file added.

Add a comment to this file

examples_pygame/data/car_door.wav

Binary file added.

Add a comment to this file

examples_pygame/data/chimp.bmp

Added
New image
Add a comment to this file

examples_pygame/data/danger.gif

Added
New image
Add a comment to this file

examples_pygame/data/explosion1.gif

Added
New image
Add a comment to this file

examples_pygame/data/fist.bmp

Added
New image
Add a comment to this file

examples_pygame/data/house_lo.wav

Binary file added.

Add a comment to this file

examples_pygame/data/liquid.bmp

Added
New image
Add a comment to this file

examples_pygame/data/oldplayer.gif

Added
New image
Add a comment to this file

examples_pygame/data/player1.gif

Added
New image
Add a comment to this file

examples_pygame/data/punch.wav

Binary file added.

Add a comment to this file

examples_pygame/data/secosmic_lo.wav

Binary file added.

Add a comment to this file

examples_pygame/data/shot.gif

Added
New image
Add a comment to this file

examples_pygame/data/whiff.wav

Binary file added.

Added
New image
+P5
+752 864
+255
+����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
+
 %&&)+/51<?87@EDPQTVTPSXZZ\]YVX]YX^a[WY[X`f_UX^\]cf^V[cbcd`abbhggjh_]cgfcgbW\]OL\llYKv��fGy��``ld\]`hnjkkhkla[bjjfgiffjlghggheeikgfdcfifigffghgfhmlhijijinolkklnomllmlkkmponolkqqllnnmmkloonoppqpnnoonmnhfjmhjnlbZSQWequvuurrvg`ohapztuvrsrsvvtuwvtsrsuwvutvxvv{wuwywvwxyzxxzzxy{wwxy{|y��������������������������������4Yf\^a_a``_^\[YX]\\\\\[\\[[]`aa``dghghknnqrt~�����������������½������������������������þ��������}�����}{{|}}{yxxyyz{xxwuuvssvutuvuptutrqqompooonleb__[SROMYkpmlkoodURVTQVXZY[ZY\_^\[[]`_]`dkllkijnrqpopqrqpurppsutrqrrsuvtqorqooqqonljklkfcmljhgffeffgilnml������������������������������������������¿�������������}ww}yuz������wqqssuvsstw{zwuvuv|r_etpeinrohegfikmmjgjnonnlgfjoqojhfhnpnjigfkqmkhddmqnmohegmqkaURK8,)"$'%! !% "$"
 >TOLZjkXKx��`K���`cld\]ahnjkogfg`]emjkmliloliklifkokjgikhhklhjlkihjmjhikkmnlnnmnnlknqoopponnmoqomnqqprrqpkkpoopoklmjmoqqppmjidgjhkmic[SRWdpttywtyyeasofntrvwtuwtrwzwtsrtwywtuxvsuz{|wwxwvwyxx|zwy{yvxw{�������������������������������������3JRLORSVSSUVXZ[\^]\^`bbaccdfhijkgijlmmmmllmnopqqoqsuuutsqppoonnnkkjhgeddgfdba_]\^^]]]\\\[ZYXVUTSTTTTTTTTLLLLLLMLNMLLKJIIJJJJKKKKHHIIIIIIGGGGGGGGGFEEEDB@F>?AA<9EV]Z^^^g\F=FGBFDAEIQZbimowx~�������������¾�����������������������������������������������z��{~~xz~|y{wqqrtw{}{upwwwwwxxxursvwtsvutsqqrtutuuronqtosvtqopsprrttvwlmlv~vrw{tifkkiihgjlkkklkhjle^cg`^hopomhflpnjljfgqmmnkhhjlpqlfekpmkjigimnpnlhffjmrpe]dnolh`X`nppzyku�sejp{��t]X`Y^`^`iia`d]]fid___]diaXZ_adikhda`bcefaYUVQOJD=73032-$! 
  
 !!"#%&&'))',++*)(('(((''&&&%$#%)&&++/#7SMG\mkXP|��dI|��cbke^_cjjhrsmml^[hkkkkklnmkigikigikjgghihhijmmihlkglmlklmnpnmoqommmjknpnjloooomnppnrrpostqprqppqpoqqomoqnllmkjihjnmd[XWYdquytvw{ufgqjarzwvwvttuutuursuuttuwwwyywvvttvwwyzyxxw{{wy��|ndb_]^_��������������������������������$8=79<9:==<<;::9;:9:<=<;<<;;;;;;<==>=<;;;;<<===>@@?>=<::99999999:;::9:997889:;;;???@@@AA?@@AABBCFFFGFGFFHIIJJJJKNNMMLLKKKLLLMMNNMNMNNNNNMMMMMMMMMLKJJHFDFFB=>85G]jb`hfglY=9D@<@D@@@@@@@?@?@CA?AECB@??@ACEFEDCDCBDEEDBCEHABCEEDCDDGHIGHIKIORXfkb[[dkvz��������������������������������������¶������������������|}}{yxy{xwz|{wmlu�����~}tpmlmsvtostqoopppswn`htqbfqtljjbjqqnnkggnoqojhjmknqne`hsrolifhlmlmkedimnimkgjljjikpomxzjjmrwreajoz�ugebaa`aa^WSRMJKH@851-,*$#"
 ! 
+Rw������~���������vYZo}��������o^R:.AY][G'(/+=Y\VG0&.+-+3;:9::@ED@K^X?04.
 4h�������~~���kVhzypqz�yr[?,2D>/(@IFLED[`G<KJDGGEB?>>@A>:AAAWY8/4.$9QOJ`vsXL{��]J���hkqhbfd_gosrqrqd\hqrqqqooonmnnooonnrh^v������������������������ÿ��������������������������������’wurrttrolmmlkmopf\WX\ix}zxtx~wdr�udx�zururqtwwuuttuvxwwvxwtwxy{qh{����������׶��Ъ�����怀������������������������������f�ŷ���̿�{~}zy����{y{y~�{{}~�zvty������������������������������������������������������������Ü���������������������������������ҽ���������������������������������������������������������������զ\Lba[`caWVWXYZ[^`defgilkimh`ZQIN\SEHNMWZMSJk�����������������������۱�������������������������������������������ʑ�������������������ž�ԝnj`^w����ĕ��Ȼ�dmrigempkimjegknonidejlnlihfgknlighjkkkihidemm\O:..-%!#$%&')***'&'$
 
 !"&(*--..+*)$
 &_�|rm`fm�gOBKURW]N?N^YYZY[[]W[_M/*&&,#"@cqgimkiSF=2,,)(1/5+
 F~�hXW_\T]^RP[acd^[`]USQX[]^VY_O,#%*.)5][><@:.&3HF.$+'#%17-6TQKaws[P{��`J��gmpiagd^gqvxttte]kwvrooprrprpoooonlshc{���Ǹ�������Ƽ���������������ÿ���������������������������Ɠquurqrpmrqmpplooe]YZ_juwuyutxsct�sbv{sruwyyusuvtsruwttutxywyvwypf{��������������ζ�����退������������������������������m�����}������}~�������������������}}���������������������������������������������������������������������������������������������������������ſ�����������������������������������~rsuj[a[OQWWSY[\[[]]ZX]WIDHKIJYcfigee`bflnjghjlmkloqpookkj[NQOJVWQ��ٸ�����������������٬���������������������������������������������t}���{����������������۟rke]x�¶��������agtlhimnomkhggkklkgcdgkmlgdehklkjjgehntigl_=%()$'(!
 !#'*,/1.-.-)''''#
 '& '/+\t]A766@YYXa[TWda`^ZVPINONLFMWJ0.2*%.-)-)&?fpjo\:'(''++09/
-2($**!%% 
 ';@>78605=1-6?AGPE?FX^PJQYQOXZ[\H/+/*.HbrmlmmiZB-.0/,)&&+58,
  "$&),+)''"
  $*/0/*(!!*,--+*-));LLSQB=JRJNTZYW]`\Z\]]W[bQ2&*-*($'(-,&&*.0,-14346626+
+CX]]\\\\\\^\Z[\]ZXRTUTOLKLGFEDDDDE;;:87543....----.-+*)+,-11) 7UTLdxt^Rx��aM~��jorhchaYfsxxvuse\jwtomnoqrpmoqrrqnmrkay���������������������������½���������������������Ľ������‘ousoqqmlmnopppoofZXYapuvtwut}{`o��lkwutvsvywqqsuuwxvsstuwutzxuwod�������׸�������������р�������������������������������l�̰��������}y|���}~������������{��������������������������������������������������������������������������������������������������������������������������ȿ�t}��|��}m[NT_`\WTUVTTTTSXWI:<GGNUXWUWYXWWUVVXX]_]YZ^]XA4-1535;567:>BGIKKMNMIHIG@@ABGKHPQOESOK����������û�~�����������������������������������������ڼ�{����������ž����������כnjcTw����˪���БciphjjinonokiklmmkkhgiimnjfefglmkggfhmlkkcZchYC:'"%&+'%)(')&""$&()*+,-+)$
-;65420/.-,./.+*+-*+,,+*)).-,***++*++,--..***++++,.///-*'&'+&
 "7q���|a~���������sgw~}���tiqw|s``cbdmja^\[XYZVW[WX[[\\[YZWUY[ZXZ\_`a_[XTRORSSPB54COOKGIJOMKRWRKTPKNW]`fns{~}���|squqmotprw}{|�xZSslZ`d]]`YS[dkdfjg]Y^eghhggggfhebbdffef]Xo���������������������������������������������´������»��Ûf`lhgheecbfdcaeg]SLOZ]_ejhb`lj^r��dktmpokkmnnnoonmknpnsvroptqtyi]���β������������������Ԁ�������������������������������=`s���������������������������������������������������������������������������������������������������������������������������������������������Öhgmbadgdinnqtphfb]]agljomd`^]_ikptiVTblnsreVWbloppstqoqrrrqrsurvtrtustvsvyvtvuvwz|socD:Nr|xhVj{~{vxxuyyxwuv{{u{wttxzzyyuun`bqxuwiZ`h`TU\_\[\[ZVPJIJMOPROONGRdbXV^[STXaaYa^Y������������������ؽkUcST�ķθ���Ź��lsrhktuvz|vmmsoooooooorkuuT4.04/'4B<53*(""
 
  
  
 
 
 
 
 
 !!#&(/010001334;MXY^\WVZVR[cghhi`QP]ecegfdbcd_acefffffXVp{������������������������������������������������·��������a`jecdadcgfaa`bd\QOLMVaffe``eeZv��^gomklhgopjgkljlghllmnlmqsmmxb_��ȿ�������������������̀�������������������������������J��������nr��������������������������������wylt�������}��������~���}qt|�������������Ȓ����������|����������������������������¾�����|feb_[XWUKPVWUSSTcehknnjg^\_hprlcZ^ccadhgbgecgg_YQFN][Y^ab_`a`cffffeddfikgpslgimmrY@899:=?>:<CDBEECCGLOPPRMNUUMLPOetsqvxvpsvurqtvtxvsw{xtuquzyvwxoc`mna\\\]_`_ZY]abccdedafbYPX^WXYUZ_]dmhc��̶����������ͪm\eNIs����������rTZ\UTVUUUUVVVVUM[fJ&
 :?38C(
 "%)+.--02320407GSV[b\Z\VQ[chb]aaTPZehfgjiecedcccddddcTYw�����������������������������������������������������Ⱦ����edibce`aaccbcaad\RQOPX`a^dfaceYw�`ipnkkkkjjjkmmnlmnljmnjinmiksZ]�����������������������ǀ�������������������������������O��������s{���{����������Ž���������������‹sts{}|����wlr������������wsw~�������~�����В|���Ǹ}��������������������������������ı�����mnje_ZUSQPNLLNPRSSYbhkkkkga_chmnjb_`bbceeffa_gkaUJFP]\Z^a^]`dfhgdhgd_\_hpklnomgc`SF:7878;9:==?BDABDEEHMSTTMLPPIIONWlxsnontsrrsssrutvyxtu|xrpswzulrtm^ZhjNR]_\``\[_aa^]]^^^\WS\^W[]V]ia]jkf��ϸ�������ü�үp^hQLv����������qSZ]WVYTTTTTTTTTMW[? 
 
 #&(-./12433445:GV^_ZWYVT]abidb]TUZZcdcccedcgecccca_fVYu~����������������������������������������������������ļ����a_e_bfcefacacaacZLKKOXbeccb_cbWw�y`kokikmmomllllnnllmnmmmlmmknsZ_�����������������������Ҁ�������������������������������I�������ߛx��}�����������������������������ʖsq|wzyy����������������{ws{}~|zz{xs�ӽ���������Ɋs�������������������������������������{lnjd^ZWWWVTRQPPONSSUY_ehidbbegjjgb`abaaefdd`[_faT@HW`_\^_a_adefgd_^][[]adkh`WVWRJ<:;;:778>;?B?>@>@?@BGIJIFIJFGJJGAWszssywuutsrsuv{wvrrx|vrnpttrqppgc]Yit_R]`^`^[]Z\]]_a_]_dbY\^VWWZX]^dsih��˾����������֯o[eOKs����������rT[^XWYUUTTSSSRVUNNUI1%+$1HC369(
 "&',.013344722:FQ[bZVYUT\ab`ci`PO[bcffaadgebcdcbabceUWt~������������������������������������������������º��ü����`dibce`ba`bbcaabZONMOW`b_cb_dbXy�{bmokillimmkmjhliklkkllmrrrqtw_e�����������������������Ԁ�������������������������������F�������ˢ��������������������������»����������������������������������������������������������|������������������������ƿ������÷���xnokd^YXXYTSRSUUSPTUVWZ_fkfdcccgklf``eb_ae]``]_f^MBMZ^[\`caadfddca^]\[ZYZ[]]XSTWPF9:;<;988<:;?>=>>?>>BFIHEBGGCCGFBA_wxtvwtutrrrsssvuuvvxxxrmnttqpplc]a`chbX[[]_`^^`bb_^^_^\baZ\^Y^bf[aa_mmb��ɻ�������º�˰nZdOKr����������tV\^WVXVVUUTSRRPNOQTVNAABJO=2::'
 
 #%'+-/112359779BNX^YVWQNX_cfabaVU]bcfgd__ae_bdcaacedTVs~�����������������������������������ø���������������ž����abhacebcc`aacaabYNMLOW`b_c`_daXz�}bknlmmiillkljghjkllmllpnllmoqYa�����������������������ր�������������������������������G�����������������������������������������������������������������������������������������������������������������������������������śrjsmf]XVWWSTVVUTTTTUWXZ_fkgdcefjlkebbcbaba_^\X\e_J@P^a^]_acdgfa_`_Z[\ZXXY[\ZUQPOH?89::::::=<::>>======@FHGFECA@?>?Snystwtsuvvvutssruuvxtptrnptsqpnjg]^d_`e`\\\]^_\\^_^]^__Z[[Y\YVb�~\Ya^knh��ȹ����������βpZeQLs����������vW]^VUVWWVUUSSSQQWWQSXVTV[S:0<;&
 #%'),/1113539:8>O\^ZX[TPYageac_SQZ_fcbdfca_`abbbbcceUWt����������������������������������������������������ľ����`_e`bfcff_aacbaaXMLKNW`c`b^^c`Wz�z`ilkmniigjkjkkhkkjkmjhmommnrrZc�����������������������Ӏ�������������������������������K�����������������������������������������������������������������������������������������������������������������������������������Ɩmlvqg^WTTUWWVUTSSRSRQUZ`celd`cinojacc`agf]\[[Y_h]CDT_^[\`dgfgd]\_aY]`^YUUWXURQOJA;88889;;;AB<9>?<;;88=@@CJQF><96:Ci}{ntwsvqtutqqtxwuvvtvyxqqstpoomlf]]\[`ba\\\Z^b_\^^^`a`]_[[]_XVh��nV[`mhd�����������Ž�ϵr\fRNt����������wX]^VTUXXWVUTSSUSSTSPQUNNVV>1:8&
 Kpj`eda^ZY[]ae^bfeiz���yv~|rmg`\YXYYWUWWWXYYYYZXYZXYYVUQRUQNMLDGCEOUTS[]][[]]\VSV\\UNLOONLGFKSQXZZ[]]``^[YPSbe\WB)!%%$'()+-023568856?INWXPNY`_dba\RQ[dddddcbbc_baacb`bhTSq����������������������������������������������������Ŷ����Xad_ba^b_]ab]]ecVLLKOW`b_`_\`_Z{�x^hlhfiihhiiijjjfjljhilnlnlkppXg�����������������������ˀ�������������������������������&|���������������������������������������������������������������������������������������������������������������������������������Œn]a]YY]_agjfhbWTQVcefc]YYWTZcaYUMN\gi]TUV]b_STZZMFRSMIKLJKNNQTSNJKMJGBAAA?=7447;<;:>><;;98:<92046454138;@FHINME@CLPctxvvsrlpooqsrrswvrsuvxrgaiqrolnnh`XZ\[`he_`jmigbcff`Y[`^\_bb_^]\[\\Z`f\t�����������ú�ʮn\hSLt����������qPWYSSQQQRRSRQPYXVTTTUVPNQUE247'
 
 Dkh`fg^_`YQU_ehda`cn~���yuqnkd_^[XUVY]Y[\ZXWZ]ZYYZYYXWWURQQPKEDECENWVPX\a^SKSb]ZWXZZXXTQNLIFGKVWX\]Z\c_^[[UT^b\V?( #%&''(+-0245689648?JTVOOY_^Z[^\TRY]cdddbbbcdea_``_bbRTr}����������������������������������������������������������]cfbdcadaa^^`_`]WMLKNV_a^b\Za_Y{�v^jlhgihhiklhddhifglnmlnknkjopWf�����������������������΀�������������������������������">���������������������������������������������������������������������������������������������������������������������������������vegkwxnbbededhf`]XQLU_hie_XSXX]]SKKJUgeXSTYZNFNXVJDMNLJKLNOOSSQMGCAA>?@AAA@@87669::9;;;<=85777559:8853358:>BMKLNPOPRNYnyvoqynpssrrtvouxytqtrjgkjjnnohjwuc`g`\aaahllmhdcec]\`^`ec]]a`\[]]]``Yz��¿����������ƫq_ePOw����������nMVWOOOPPPQSTUVQRSRQOMLMTZVA9@8(
 @jiaeecbbYLN\eea_`bgt���}trpne^^]YWUWXYZZYWWY\YXXXZYXXVVTRRPMJG@@HQUTQWZ`aVJP_ba^WVX[ZVSPMIDEGSVYZ\[]b\[XYUT\a[R;&!$&'&'(*-0346677536<GQUNOY`]\_b\RQZ`bdd`bdd`dea^a`_b`QTs~����������������������������������������������������¶���~Xdfbdd`da]`a\\cbUKKLOX__[`\]b]W|�v_kmiijhijkihggggjkkkkjijmkjooWf�����������������������̀�������������������������������"/u��������������������������������������������������������������������������������������������������������������������������������q`m��h\aadjfbddeec^[OT]fjf]WVS]cTJKJUddXNR\ZKDMUOFAGMHHNQPRVOPNIA=>A><<>AA@=;;:99975;:76889<><647:;?775588<BQKIMONNPOUjwurqxqqsuropsqtvxvuvqhhmlinnnqrxzh[ag^`bcgmolgeefb\Z\abca^_`^[Y\\\a_[|������¾�¿���Ȫr`dOQx����������mLTUPONSSRQQRRSRRPPPRSTU^dY@<D9#
 
 
  
  $
 
+303BQWRNo������������������������������������������������������������������������������������������������������������������������gS[XYXWX[afjjjgcekoomlklic]ZSOLLJKLJ=A@>?@AB??@CC@>>=@BA><>AA><<?AA@A?A@<=AA=ABBBDB?A;533234/01220-,-*)--(!
+1,,9FKTVKe�������������������������������������������������������������������ľ���ļ�����������������������������������������û���`[VXYXWVWY[]^[XY\WF5?ILE@BB?BDFC@CEC>CC@?@@AED@>=@BCAAA?>>?@CAAC@<=B@;986:=<@@?@AA@?:7554100-,,-048:?J:
  
+2-/=KPQRGe��������������������������������������������ǰ������������������������������������������������������������������������ݘ[SUSPPOMJGDB9744:@>8??@CCA?><=@@@DC=BBABEC@ACCB??ACBABDDCA?><AA;8:943135320+0/132/-.3223226:HJLNONLKOOR;
 &>buropnkmsustsqkhouspuustrrvo\U^efdbfnqqronqox|ulhgekimo`QZqmfifca\bZ[\YX^^W��˿ļ������ƺ���racPQx����������jJTYQQUWFCF;3@PB$
 
 
 !##%%&%+))),-.-*++-82%+IYUKRXX[XYYTOOUWacb`b`^`^\^]`_[a^PVt����������������������������������������������������������rUed^acab\_Z^a_a^SLKILUWWXWU[\QX~b_jdbdffcdddefecgeedeghegkgflgRl�ɷ��þ�������������������������������������������������!((*:IKG.X���������������������������������������������پ�������������������������������ٱ������������������������������������������I19=A=989;:9::9:9:9:9::;;<<=?<=??<;=<>>@ACBADDB@@CBA?@??<9535653464/,/241..0/0//14546645756=LNPRRSTUQOXV4
 %'%%(*('),.-,.+,01-$ 7V\KMWXXXYYUPSXZa^^_]_a_^[]^__\a]NSs����������������������������������������������������������mXdd_ab`a]]XX\^b\NKJINVZY[ZVY]QY�`_kggifcbcddfhhghihfcehkhkgglgQm�ö������������������ļ���������������������������������*((<KB67����������������������������������������������Կ��������������������������������ǽ����������������������������������������O;JG=:88;<;:889898888899;;<<<??<<==:==?AB@>>BCC@?@AA=;989864121/020-/230.-///./245448547846>JLOONORUSNUV9
 
+**:@3*V����������������������������������������������շ��������������������������������������������������������������������������[VgR;978:;97776767776779:;<<<>=<;=<;@??AA@@B?AA><===<<;:8743310220/1231.-00.0/144348425:948BHKMMKLPUTNSW@"#>fzossnkmrtqrrsqlmsuqprqpruqa[ce`\[Zhonnkc]_fd\^ikdfehe`hiZOaa\^\YXXXYWU[\T}������ù���û���racPQx����������lLVZSRVXO>315>KE%
 !"
+8) 9Z]X\^\ZYY[]\[ZVUUVTRSQSUTSUWYWVSQRQPQTVTOPUTNQPPRW\^]RRTSNKIFFMMLSVUV\`^\aa[YVPOSQIFJJLG4"
 &Jnslnrmjosssrqrvskqrqrtsruq_VZ^`dga_TEBJMHXfbVZcbaga]]\[[\TFN^\XXTUUUSRZ^Zs�����������ź���s][PYu����������lPX\[\WYQKIFBFOA$
+6(-Q_[Z\_][[[\ZYUUVXVSSUVVUUWXYXVURPPPPRTSSUVVSQNQTVVXZ[WUWWRMNNILQTRRTVSTVXZ^]XRLLPNHFJKME2!
 
+4+
 #" &*)&*+-,)'*.-380 # !
 !!!%&&&((''()*),66(
 #" "')&'*))(*-,+.51$
 2IUWUVX[^^[YVWZ]\XVWYUTVVRSVVWTPPPSXRVYWUUTSPMNQQNQWWOMPSVUQIIFA>=>@JOQPOONMPNKGEEFGFD/
 " !! %&%%()('(**(25,!  
 "$&''&'&%$),*+12) ## !
 -DX^RUWPPRPT^b_Z]_^__``][\^_aOTn|���������������������������������������������������������lV`ba_`ca\ba`^ae^ONLHJT[[ZZZZRH`|kXdhbficeiebadggfigeffeefjiikn^Th�������������������������������������������������������� .Z�������������������������������������������������������Ш����������������������T<OYOT\Y[ZQXg~������ķ����t}������{oro[z���������w:463//021100/.-+))/0/-.24313456654440022//2/-022/-.,.1235731233576688;@@=<>==?BCCC=>?ACEEFHJKNUVVYX[a_`dM%
  #"##$%&&'''$&)*0<</ 
  .HQKNUULNMPUQLNKMNOOOPQWTSROOQQNOPONNPSROLLJHHKLLMPNHFHF><>>?DFLRTROQRQLJB>CCCOL4!
-7859;:;==946<91101578;@CLYafhhglfaa`]\]dabdirmXO]bYXekg`\TJB=>A8CLMJHD>@50/.,+(%# 
 ##"##&()%'+*)(*5EWmiD$
 ""!
+JWQUSQMLPI6##%''%&(''&&'*-/7@JQb���������������������������������������������������������iUUTTSSSSSSNOPNNMHA>DJRWTWVSVWM`{j[hkc^VQT[ZXXZXY^ZWX\YUYcddegjZSp�������������������ț�����������������������������������
 *Hhngnn]]ionnonmimlkoqpqpdVKDCFHDFHGGGKNILLD==BEADFB=;BIGIPW\^R?DGPZREKRQPHCFF?<BB9/-+&%!
-a�������zqePCM]jy�pqqqnjfcbccc`\XVUUVWXZ[[RVUONQPKJKLKJKOTJNXZTRUROOTSXv����vlk___UW�����������rm�����rkkedklfejsogls]</4579986551130/00/,-.+,.-*02120.2//001111-,+.4:?A>=====<<7<>?AAADECFLNLNTNQRQQSTSQUWWVUROORPMNMMPU[[VY^^d^."*Jkpid^\hppqqnmkonjjlnqmjh\HEICCDFFFGJLINOIBADFC??BA>BKSXTJDBHSP;B_\KPVY``XLEQfsiVLQSLFJDD@775*&&$ 
 %0/:HB-%,,5;<95>O[NHJLMKF<5JL30:;;;BINU[[QEGNONWlw����xsvxksc5%/"
 
 "*-'"# 
 !""#%%%&'&'&'&'$*-5JbcWEO_^F4+!&.)7VG,4KSKGJMOTOGA?>93/,,4ANSU_ipmaUJC4*"#').33K^U>9?CB?CGEDHJHJJJIJLMRRRPPQSTPSTRNNPQLNPPLLPRKNPQUXWSRKKNLOL@;>AIRTQQTPURJazjV`cb`UOW[YWZ]WWb`ZZ^][]bb_cij[Wt���|~��xv}yxysz��e]ZLd���������������������������������
 !*,'""!!&+:NMKJIKOSVTUSQV]]YH?AUmwlYRSSSROMKCDFHHGFEFHLNPONMRSOHHNRPOONLQVUOIQOOSM]�����okqrccecbo�����������}rg`dccdbccdc^`^`f`I600123344110.1440210000.-/,*,.-,-0/..07@GEHHEBB@>@?=<<>@BABA@FIKMLOQOPRUTOQSTUVTQSUWWYYXTTRPMLLMNOUYWX^`]h]1
+QkhfeU[lqjlmkklnoqpnlv}{hSLMMIHIJKJKKOROJNWXTRNLLLKNTUYXWZZXX`^]]^]_ce`_gh_n����eG813.1/,./--,+-00.-.-/3565567<<;@BDIC::@B=5+.+@JCCEB87;?AEJIJIIDDKMQgol`YTPPGDIJ<-$
 
 (HinbKRhpijjfnjikjhimdKCF@=CGCGIJLORSNPNGDEGEEEHIGCFKOOPSUUSQPSTRSVWVZQPUUSawyvuxwiUIKPPIGLLFIGGKMKHFB??AB?==ADEIMJHKD:2242246+7VVCELAAACIOOKKCEJJKSZW���c^bm��R'!$ 
 :XXNRZYP@AHB9>IUULIPUUUVTUUUVVTPUVY[[YXY\WTUXWTRYWUUVVUTWVWXUTRNJIIJIFFIGNaZ2
 !%&$'*''$%%"#&&'&&').38++05418CRPPRQOOQMJKOQMJIIJKLLLKKFKHHYt����{xvttvvwxuppohdcgiVn�Š������������������]LHSg���������������o]PLPLJMPJJGEFDAAC@BB>?B@?EFFIIINLKJJMPSTNRVVTSUXTUTPOPPNORTUVWTPRQONOQOLNQUXWX\b`adL 
 &$&$#%&&'(($$&'.2-"#("!>YWDR`D#8PGJ:!%FOIVM18@5FWC/88422.-1//641Fbs���y���z���}���������������~~��}ry�zjemk\W`cXOPRLEEE>=>;89:<86:@B?;69AHKMI@8;>EPTRSRRSMJfzdXbaa]OLQRUVD7FQOPPQQQRUWU[[[VLPdmdYV]ebZ[aZ`pij��ώQ__Na�������������������������������� #"!""!)2+%-#4r�]t��H"2TF3/563521/-,,,,*)'$%)06987544442230J������������������������������������������������~�v�����±����������������������������������������bHFHGIGFHIDADECB@ADGIIHGJJLPPNOQSUUVVVURONMKMPSSRRUUQRUUVTVXTSTQPQRQOMNPNPTWVSY``X^bG
+L]]aeilhdefggiijkdQHG?3*#"!(17AJPPNPKB?>@DADB@EHJKKNTWY\afhmoorurkjlcWZgg[^_\URPMHLLKIHGFECBA?ACGIHFFFDBCFKDCMVSMJEGIJIEA>973/,*++)-268<BGFKOLIHKMPQTUTQUZaU4
 $ 
 1ZbVU\TNPICFJFDIJONSOCDOSOUYZYYWTVUVVWYZWUVXYZYWVVUUUSQRSRQRTRMLNKIHEEJC2#!!$%""$"$%$##%(&%+.-$&AMQJAEKGAAD8).63,+'#--',5=:6?FA=21123;FOH;5536>?>@GE>CNMJKPPIJOOMHLPLLOOLLJJNNLMNQPPTURQVVY^a``cljkonklqoutswnUBNOKGJIINHHKNNOKA<<=DMNMPPMPKJgu^Raa_ZNMRRPRNF?8:<;9524;BCBDC;6@MWPJIHEDE?@CFHHGECUnud\{���������������������������������
 "
 
 ;ZbZZ^RJG?BIIBDLMJILIBDPUPSVWXXXWTUXWVWYX[[ZYXVTSRRTUSQQSRTSPMKIHIEEEFE:)!##"#$$$)&#"$&&%##//-8AFNKC?CB>=?@A5&&/1'
 ##(+.114<BBA=3&(5.6:?HE9311;A>@B=>;<:69932<916844668:=?AAABFIKKLMJLMNNNNLSSSQQQQONMPPMMRTONGFT\WOGEGGGJH@9;>FPOLMOMPJIhv]U`^][QMPRRVOE=9=<=;879>BBCDKI<Mxumotvvwuiaaeikrnfc������������������������������������"#
 
 %'%)(.AWV;! %%';Yg[7Ah|�������������w��sqwsgdih]VZ\QIKKDA@CA;8;<:88;<:7?<::>DFBEGFNbfXI>?EJKMI?<<=CMNMPNMQHHhv[Raa_ZNMRNTR=5BKNFKMKKMLJFDKOG>J\d]VSSU]fec`]\\^`[~���qX��������������������������������#!
-PjkejiaYbddffibI9<CEHJJOFLQOMHEFQSLIJHGGJJHGIHFFIHGGIIGFFECBDFGFGFEFFEFGFHHFGJJHGGFFIKJFIKMLJIIKHGFEDCDDECCDCDDACCBCEDBBFDCDEFDBDBER``]``^_bghhhhijjhku~X- "
+Na_WVSNOIHFJJA@INLNONLKMORPPSTRPOOQTTSTUSRRSSTTTTVRPRVUSQRPNLIFFHEEDD@/#$$"!"#$')%&())(''#V�|H:?<GD=<A?<>C@=98>=1" 
 
 &!#Fa[WXWRRPGDGQTGAJSNNRSQQSQQSUUUUVXVSQTVVVVSSTUUTRQRUUQPSUSQOKHGHFDDDE>,!"#!$%&(*-(")*)&#4\���a<A7/3>C><=;B?>:;<9A:$!"
 #'/9GI;(!
 ,-:Xkr�������������������������������������������������������vA5??@>:9AKIHHFFKG;99:BMQNOJMSGJnrUV`^^ZLJPNOH=9<:4679;=@ABCACDCKYb`fffifbea`_bfhge`Z]hfXRV��������������������������������$.-'%)/2-*38456,F��Qt���������������������������������������������������������������{qosw{yvw~�����ǫ�����|tsqicq���y�������GAEFGFEFIKMKNTYZ^chlppoqy}{}������������_GGE>3.5>@@ACFGGFKKNNLJKJMQQQUTRSTPNPQOOPQORSQRUTRTUTVVTRQRRQRQNJKRTUXVTW[\\ZWdc?!<^e`^[`a^acc`RB<DHGCFFGLLPNIIG?8ALLJKIIJFHJIGEGIFEEFGFFGEEEEEEFFGFEEFFFFGFDEGGFHIHHIKKJHIGHGGHJHGFGHEDDBCED?@CDA@BEDBCC@FFB>?@BGDFDIX^]^_cghhiihmgiogm{o<# !
 !% .SfYYYTPSQFEFQTH@JTPPQRPQTTRSTUVWXXSRSTUSTUUUVUUTSRVTRQSTSPPMJJJGEDEFD7' "$$%&&&&'((%'),$%Ey���k7:C2).<?=<:C=<:=<9B<$%()A><=$
+Qqz��������������������������������������������������������uD>B==CHHHIBGIGDIG=9;;BMQNNONOBHotVWb`^YMKOMSRH>>??@<87:=??>=?>86@MGD@AFIFEFP[a``di_ZNBEc����������������������������������
-<F2(+4<84A:%5&
 /Wsy��������������������������������������������������������qB>FA@FKJHGBEIFABEB<9:CONLOLMQELpsSVca]XMKNKOQME>>@===>@AAAC@?D=,I���wcUMHCBAABFGGFGIKUt����������������������������������� .0)(&"#0117:797:.C����������������������������������������������������������������yibdgvoe_]^^^����������~{wzvk]i����u������wMCLMLJFEFHGDDJQXaiaXMHHIHE==B?=>:>�¬��yiOKHJMMMMBBCDFGGEDFEGKMKMMKMNMORPPSTSQTUUTVTRSRQURQOPSTTWTTQNNQSSNOTWRRTRYYUUTY`U)
 .IP>-&'35(")5Wrv�������������������������������������������������������tFFOD=CKMIEIIKH?>@?<99DONKOMNQEInsUVca\WMJLMLNQNHDDA@??@ACDKLGIE4Q���������rne\USUXRf��������������������������������������!./))% #-46::9;7.2f���������������������������������������������������~z~���}|~�vaX^bkhdaabcc�����ǥ���~~�xh`l���|r������tE>EGGFEFIKLIIMQTY`OKHHJKJGINSNV[Vc�����wp`JJIGHLNMNJDACGKMEHHIOPNOPPQRSTUTYXWUTTVVXVTUWWURVWVVXVTSSTUSRRRQJMRTSRSSWXTUTV]V0#@Z^^^YWYXPGFDCEAEJLNPOJLPSMFGD9=IKJJHHHLJGFFFFEFHGEEFFDGGFFFFFFFFFFEEFGGHHHHEDHGHIIIHIIIHHGFHIGEEHHEDDCCCCBABBA?BDA>@DC?ADEDBA?ACCDM\cabeimkgedjkkkgqnJ#"$
 .!&6;*#" %59))>=!$F?
 %&&%$%'('&",-"/c������S936;96;;5/
 ##3HTUXE4KS;Pw~��������������������������������������������������������sLGG@>??@>8=A@<=@?:9;<ALPMKKKQHLmqSU`_^ZNKOILQRPRSRRQLGJRUSPPLNJ<S���������������������������������������������������������&24132--*399:;71F���TA=>>K`����������������������������������������������������������}������~������ݽ������������������������bOTVSVXVVXYXWY[[ZY\\\\\\\\^]_Za^Zz�����RGJIFFJJIJMRPPTVSOMFJJJOUSKGIJIFEFGGJJGFHJIOQSUVVUTY_a^\\ZW[UNKKLKJJPWZVRRUVUPMNLOY?!,GWWZ__mbG5;A><?BBDJLMPOONMLIECHJLJIIHFHHGHGFFHGEFFDDEDFFEDEFFEDIIEEHHDHFFGFHIGGGHJIGGHFJKIFFHIIIGFDCAAAABCCBA@CCCBACDDEB?ADEEDECDEIV`ahifeiihjhjjhlnQ'!#
  
+$'0552.3')CNGCRWPE6'
 # #8@>Ro���������������������������������������������������������qNRYWYYVVXVUUSQSTK???>CMOKKHKLDQqpW^f]X]^^\WW]a]Z]aa^\]`_[WZ\[_ZI\���������������������������������������������������������.=DEF@62+&(394,)BSG4;>68=:8;D87h��������������������������������������������������������������������Ū������������������������cKTUQRTRTVWY[[XUVZYYYYYYYYVUW[TT{���vdWROPMRTRRSQLMONJGHJJEJMMOVZZYYYYYXWVWSQPLFEICDEGGHGGHHILMLHFGIKIGGKOLJIJJKQZVWTUXX[ffP*
-G[V?2:<@GH>1+,4:AHJJMNMLNOOLIIJKIFIKHDFEFGDBFFGEDFEDEEFEDDFFDFFFCCEFEFHFEHIEDJGEEFEEEJFCEFFFGJJHFDBA@@AABAABB@@AA?@BB?CDCC?AHBCECDRckllgfjhddijmo`>$ 
--#0711=;*7B=4'%105<<79@EU[G- "&$+Ny���������������������������������������������������������iMU[VX[XVXWSTVTXVHBA>?EJKLMQNN>MypEPc_Y]YX\[YX]c^Z\\\^^ZWX]`]\`XH\���������������������������������������������������������g�Ļ����R.%0..21FYSFA>;3;==5;=6B{������������������������������������������������������������������ɻ�������������������������aIQSQRTRTURTUVVWWXYXWWXXWUWYX^SX����nYPTPMRSQNIGGIJMPOJHILFEGKMNORXXYZ[[[[YZ[[ZZ[\XWUUTRNKIKJHHJKIEGIMOQRRWWWXY[\\`cdbceebaS.E`K/3>ADJI9**+0:CHJLOONOQQNMNIHIJIGGJIIHFEFHGEEEFFFEEGFEEFFB=DBACEEB@DCDFECEIGFEFIJHDGGFGIJIEFFFHHDAA@??ACCA=@AAA@ABCDAEF@CGBAACCGWfkhgghecdhihir^4"!#
 #".b~urxfXWXVTQPPPQPOQTQGFOTSSTSRQSTPPQMNSTQPQSSSRPSQPPRRQONLKMLJGFIE?9/&""
-8<>@98GPMPWSD857<DLSY`eYI>8IF-;w����������������������������������������������������dHVYTVYVTUUUUURVVIDD><CLOMKLOOCTuhJV_^]^^^Y]\[]_ZY_]__]]``^d^Z\TG]���������������������������������������������������������R����������jG3*&  !""#
 (49>DD8)  *7>CLPLIJ>>FFEGGHKLJHHHGCEGGFFGICEFECCEHGFDDEEDBDCBCFFDACDEFFEDEGFFFFGFEIGEGIJIGIGEEDBAA@B?=AB@@C??B@@BCBDCAACCACKPPQX`e_`ejjeejjmnU."$
  
 
    !!""!#&()(&$'/Ch������������������������������������������������������������������������������������������bJOQNPQNNNRRQNNPQPSQPQSTSRQSRL\���iPNQMLJMPNNOPRTXUUZ\XWWUQRTTPLOTTSNKMLHHIHLUZZZ\b]YXWSPONLJIHEEFFEFIJLNPPLIKLKOTVQPUZYTQNOVH#
 !
 ! !!!!! !$&'(''())=cy|~{������������������������������������������������������������������������������������dJLRONOPPMNQSSRQPPOQRRPOQRRSOJ`���fPLONMIHKJJKNPSTQWXW[[VTXXWWTQQSUURQQOKJFEHOUX[]Z[[\]^\ZWURPMKJJMHGJKIHJJGFGHIKNMORSOJKPPTaX0
 !
 #%/43CTURPQUTPNPMPLLPLEIQQPOMOPQRRQRQRRRUVSRWTNORQPQRQNLIFFIIHEB7-&#   
 "
 
+32?SVUQOQPNOSRPMQVLFMRSRONNPPKOSSQPSURSRRTTPNSQONNMKIFGHFEHE:3'#$"!"##""! 
 
 "$%#!  "
 ""(1BQO@77?atqqtuxkt}�����������������������������������������������������������������������������������\INQMNQQPNOOONNOQRPPONMMLLJRFS����cNKQOLKPSOJHIKKKNLLNPQTW[[\]^]\ZYWTTUWXXXUTUTQQTOKIKKKNSXWXZ\[XU[XXYYWX[``acgkoqqlkopmklqa[`P%
  !""'7IRQORRQPRQNRMLRSIEITPMOSROONNLLNMOUSQQQQQRSQQQNLJKLFIKHB:0)$#"!!!"#
   ""
 ""  !"#%$(#'Lollmonow������s5&0,,-,++(*00!$-&/3&")
 ('#,2.&%*,+).:FNZs�zI0?C2:W~����������������������������������������������������������������������~~}{xusqpmmnnnprs|~}y�wR@LOLLONOMNOPONMMMOONMMLKKMOBS����eSMLKNOPMNPOMKLMQNKJKMQTYZZZ[\_b____^[VSSZ^[XXYXWWVRQONLKQW[[YYYU]fkorrnlkkklmoqsrmhd`YSQNQXO.
   !"
-.-1.2:=68:6587?:DQTTVRBB\v���������������������������������������������������������^JUWWWVVUUTTTRSVQF@@>=GLJKJILL@WwhPY`Z]\YW\]\][YZ^^Y\^^]]]\[[^cSFf���������������������������������������������������������%&-CU[cmnhdWKXknr�������sI63Bj����������������������������������������������������������|xzxrrxpooonmmllkkkjjiimjghlopoz}xwTBJOLMONNLLMNNMMMNNNMMKKJJLNBU����eSNMJMOQNPPOLJIIONMMMMNORSTWY\^```__]YTPMTY\[\ZYX[[YWXVRPSWYYXWW[UT[djmpqnjhhjnqfe`XTSOHFEBC>+
  !!
   
 "!  !"#"$%###)'*Lkmlmnmmu~�����i-)-)*(%+-&
 
 
 !""#%##"*(,Ljmlmnlls}������z;
 
 
 
 
 !"###$%%!!&$%@amekmmnkq�����|��h5-;C=.1.%%1+$F?#
 
  "%$! "&'$"$#"$&5Yndcmkjokm������~�v<*;G;'2>3)51(MJ,#7DFEE?;>EFCHSOPQQONPQSMKPRONRD9\z��vSUomXn������������������������������������������������YJWUQSVTSTTSTRSTNE@?;<CJKHGDIJCYo_U\^WVY[]\Y\\ZXYZXYXVY]ZX\Z]a`MEd���������������~�����������������������������������������"*228FDHTO;0@QKKNMKLOLGWR7-48;743.(),,)'())('((-?ezrovtuvuttx����������������������������������{uoiebdb`]ZVTSUUWTQUWQTo�wtu\ADGKKHHHHLJJJJIIKFFFFGGGGLCGs����~WJJIOPSQPONNNNONOOQW^a`aaa`\WUVWUOJJNMJPQTX[\_ce_]]ZYZ[USTXZXWW\_dhjhc_fif\WYZWXWW\hrrlh\UQLJF< (Ww[11BBBEKQNFCGGB@GHNSE:@IEANYRFMQFCMK@JP=-571779988=CGLTWUUUSQTOOV^^YSQNNLMIITX\XPLFBDLPOKJNNKLMLJJMOOQKFDA>=>DOJ=?DB>BA:8;;77;GH?=]nH 
 ($
 
 $ 
 !"!""$%! "%%#$#%'%0Nehdegkkhgq}�~��|��t;*?H7(/7.+-"
 #'#
 !""##!
 "'%,Daicbifeijmry�}z�~z��b60>:3/3/,+)
  #%#
 !!#!
 !'$
 ",0+(,)'*-.--,.CRKEIHLJIIJJJIEKIFIKKLNLKKLMMKMMLMPNLLPONNNOOOOSUSRSTTTVWUTSRPIFUion_HCEFCCEIJGD@;H[_ZYYZZZZYY[VWz��gnlNIILQOMNQOKMTSUYXSSUTPNORTTW\`ddcghgfbb`\YWVUUYXTUUTTRPTYYTV[[XUUUTPMQX\^```aa^_`\VOIDBDGMG>BI25j|^;.33:GMB9:FFA;44:6:9=EHFGEEJQRRRNFENH3/1,,15712?HDMSSOQSRQSOOTZZWTMKGCEFFP`]YWTI?>@AA@A?>@BB@ACB><?@@?>?>=ALJ?>?=;<5378314>GF;>Tioc;#" $'"
 !$!
 
 
 
 (,((('((&$% )>KIIKIJKKKJJJKIJLKKLLJHKLJKOMJNOKKNPMNMMMOPPPOPPPPQRQOSWVTSRPKDSimfYF>BFFGHGECBA=GY[V][YXWWXYYRVz���jp�xWJNONOMMNMLLOSSXZXX[[UNLOQOORUZ^_egffjghjib`b`]WUWWUWUVWUSSVYVVWXYWSPOPU[`a^ZZ[\[UQKC?@HKJC=AJ;'VxjH7.3BRN82>?:GJ5'1;JPGBIMNEEOWQJIF==FE2*-*)15834@HDLRTQSTSQUQPU\]ZWNKGCJJFM`bZPOIAADDA@A@?AAA@>?BA>>?@>>??=CPN@<>=<88742100;EI>>SgfnV+
 )E_c]^dceghjnsw��||~�n?"%%%&')(&#''$))
 #
 
+4:9'
  # $7JFEHJIHJJIIHHIJJJJLJKLKIJLJKKLKKLMOOPPMMNMMONNQRPPSSRQRRPMMHKWfaJ=DC@AEFCCD@=@IVXQWXVTSUVU\PSx���}^\zvSJNQUTRMJJMPSSTWZ_cf`][ZVVVTTSQOOQSUX[YZbgedbcdehhc]_^[YYWUUUVUUXVSRVLHOVVTTMLJHECABCCA?>ACCAE8)_{`<:@=:978688867=;::;;;BDAINC7GVJ;6:EC3),,&340*0@IIKSSRRSUONRVXZ^^[VNE@@GMNXYPIKH@>BCB?>=<<?@@>=>??C><?@@>??FD;8:979?DKLMNF@EG=7J`dbke9
 "
-FGDGIHIKLKJJIIJKJIIKMNMKIILMMLKJKKPOPMKLOMNONOSRQRRPPRTSRQIGGRfeL@@DDCCBBFB@?AIW]ZWVWXXVTU]TUw����fWpuUINSLPSSOMNPOPRTX[^`c`_\XWXWTTRMLOPNNVXTX\`db`adggeda_]ZWXZZ[[XVVURRPLILSVTQOLD@C@AGGDABDCA@?G@%Uzd:*246988325997:?;:9=<?GKON@3DVF57;C@2)++%-1/+0=CAKPPPRTVPQRVZ_`[TYSH@CHIHONIGIE?@B@@@>>AD@@A@><=A>BDAAA@=@A?9648?MOONJJNIBBE?:I_fdhlK
 #%&# 
 "($ "&-6=ELLLMONNPQQPOOOLNPPONMMPQQOOOPOQOMMNLJHB?.
-GD%
 6O^M( &;ZaYY[`chhhklns}���M&))%.1&'-'#&
  
 *3:?8, 
 $%(/8HUPJOIONKGKSN<Edw��wy����������������������������������������������������jGMXSNQUQOPOVTOMOKB<<>CFFFGD@KCEejSS]YXZYXYXWWXZ[ZXWZZZYY[[Z]^]RAP{���������������������������������������������������������
  
 )1BZjdOFLILTH6Bbv��{�����������������������������������������������������gGOXKPTQOQSRMMNPNG@A<9<CFIJHDK@DehPO\WVWVUUTYVUWWWWXWZ\[YZ[\YZ]SBX����������������������������������������������������������0N>
 
 ! 
 "/LZN'!
 
 '1?A/
 4@?0).1.,/%
  3@<0)-1/.0-  
   
 #%%+7?@ADBEIFCLPEBED=@VfcdfgecekqupR<DH?=@>;AFJNKJKMMLLLMOONQUURRTQQUTQORSRPQSMJPNNOONPOJKLKMJGF9*!
 %.7<@9*
 !
 !"#!!##!+&+105>?=DD<AXhfeffdcejousYBEE==GN6.GOIIKLLLKKMNLNPORSUVRPQSSPQRRRPPRNKNOMLOPKHKIKIJGFH?-" %+4=?A7)
 "!-EH3# 
  
  !&%'" !"&)(8EF<AXhhffedceimsy`CBE?=JK51EKHMKLLLKKMOPOLMRVTQSSSRQPOPRRQOPSOHKONMONKKIJHIFGLD1%$,1;CC>4'
 (4=>2*.20/1028;3# 
  
 '%0'
+GME>6EFKSULIRPI>55995011-/@JF@ELEFH><561/7>@A8% *&
 #'2=81-/341/12873;8#
 
 #"$"!#&'$!$% 
 #%""""!"$%$#"+>JJHEFECCDDBBFDCEDBEEEGGGFFEJHFEEEFFJIHHGFGHIHIIFGJIKIIKLKLNJLNLNMHNe]GCLKKFBAA@@ABCA=;<CR[YRRW^^UXej^d���]Obi\MLMPNQSSSUUUVUSOPROOUXTQQOMMPJLNQTZ`ehhkoqooonhaZTQU\^ZVTTRPMOLJKNKJMQPQMILPMRTQMMNOSW^eiknprqolkkwrI4=68FPN</NdW>CZ_ZZ[\YRS[ZQTWOQWO@A4'(*462+-:CB2;@FMH:14=A?BJKE>JMIF?:=5>QNFX_P?IK?0*097@B<+
 #'"
 
 "" "$&!"""""#$"#0BIHGFBDDDCEDCBDDEIKGBHHFEDDEFHHIIJJJJJKKKHGGHGLKGIKJHIJJJIKLNLMOMNNKOgdLBHIHD@@???@??C?;:APXUVXWRPValh\c���^Ocj]QNJJKNOOQRSSUPQPOQRQSTSSSQONOOOOOQU[_ccgnponpomicZUX_^][YWVTSRPOQQLKRXWTNGIOQVTQOOPRVZdmqstrommkkjsoN
+(
 
 .9+!),$4CG=AXhhdfhgddhltpQ68>>DOO<;JLMMMNNOMJJMONOPNMOQPQRQONNOONONLMOONPRRONMNMNMMNPPOPNLJIJC8-05<FPQKLONLNTY[Z]_^\^`a_eihhmqs{|��v2
 $&# !'4<4$ #(17E]q��x�����������������������������������������������������Z>LULQQLLRRMNNNOMC=>:9@HGEDCHG<IhcNQZTSUUVXXSSTTTTVXVVWXYYYYVV\NBe����������������������������������������������������������
 
 #! "" #&'%!'7DJLJHGDCGDDDDDBAADEB@CGFDBDHHFDDDEFGHGFFFHJIFEFIKKJGDEJLGHJJIIJKJKKMJILKKdmP=JQKBAAB@?>?@A>;=@BABCCHJHHID>@Ru��iP[tjPHHIKOMOQPQTROQTTTUURSWYXUSQONNOONORTVXYZ]befikpqmedfmoojc][\YXVVYYWYUSOJKQ\g_USWY`jnmnqttpkinqpplhh^5
 #!# 
 $%"!"$,6?HMJCHGFEEDDDAABCCCCCCCBBBDFGGFEEEEFIFFFFFGGFHHHIIGGFFGHGHJJJIIJKMNLKKKMIHKLNdmX@FQNC:?@?AAAA><<?A>:7<<;:86549BRm~xiXWloYLKHKRPNORROLOQONQSTVSUXXURQQOPOLKMLHNPOMPX^^a`dkomlmuropqng`\XVXZ[^b_WRSW`hjeZT[fnppsojiousnmngadefjG
-.#$*/15+5LI@A5+4CHD7-:<=>FQY[a]ZVJ;7<F@ELIGLOLEBELZM$,(,-
+#!../-"'/430.05:<83*!
  
 $1AG<970.,"+T[3
+8%6EH>@WgghfdddfghwrW?=83<HG::HNLGPQPOORRQOKJNSRRSPQQPQPOOLKKNMJJNRQPONNMLKNNMMMMMONNOMNNLOSSRUVRPNMNPTXYYZ]]_bb`aeghihjosw}|��a$
 
-3+
 +161130&
 "%0/86%"*-.2('-$#5D@3--.21*/-+12+&&.735HH,5;?9@L<$01/--,*+(,/.+***,,++.2317EJ>=ThgbcdddfjmuoN4:=0)$"$2GQNMLLLLMMMMURNMMKLQPNORPNOPMOSSNNOOJMNMIIJMLMNNMLKJIKLMORTTWUSUY\]\ZYXXY[]_^^^^_`abbehijmquv���p/
+3'
 ,92# $!
 '61$"&"1IJ@;4379?GKIIJIFEFF>537DRc����������������������������������������g?FLPQPRQPNLMOPMJMLNQLB<<::@DCBCCFB:QgVGUTSURRYVQSQTUQPQQOQVXTSSQZXXUTHCe��������������������������������������������������������1.
  &41&$($
+22252142/39@DCA@ACEBBBACEDDEEEDCEHFEEFEDCDACEDBABC<=<>A@@CCBBDDCBCBCCCCDFGFFEDGJIFIIFGJHFHGGJIDEGFJHGGHHIKKKIHIKJHR_gaIFWR<=A>>@>><8:<:;??FC=98?Wsu���zjRJIIIIJJJIJLPRRSTSVUTVTST[[XX[XUXZXWXZ[ZXWVTV]^\\Z[]aba`abghdabbaab`YSRRRSTUPJNY`a``__bb]YWY`fhggdfeaaccadf^4!/%$;1&5(1?.0--?:'.2&)-0/-3=3-;<) *9/*//+-.20% "$)-/'49*,<B?9($***)+2:84;B@<BA>AEFHC92'!),)',.,+)*/-,.1/)')$,0/.10.8AE?>PchdeffeegivsQ-$"
 .41123565429@CABCB@CBBCDBBDFFFEEEGHFEDEFFDBBCDCBABC@??@AA@>ADBAEC@CCCDEDDFIHGGGGGFDJKIGIHGHJHGGFEEFIJJGHKKHGKKHGJIESflfPFTO<;?>=@????88>4##3Ytr����pTMLLKIIHFCGMPQRUWVVUTTUWYYTRTUUW[WWYXRRWYXXWVWYZYXY[\]_abefeccddbda]XUUTNWQLMQQV^ac`[^`][YZ^cddehfccffa`bacbA
 -:/#"#!$! 5LPHGLLKJIIJKLGHHIJKKLIIGEDB@@::998777778:>CHKT\ekw��������������yQ:=IMNNMLLMNOMLLMMMLLLNMGA>?99?DCBBBHB8SkVITVRWZVWWQOOUVSSRSRRUURRUUTWWTTUK=l�������������������������������������������������������"0,
 .4122222333:@B@@ABCCBBDCBCEEDDEGIIIHFDCDDCACCCBA@@@>@BBAABD@BBBBDCBCBDGGFDCAFJJGFHLIKIHIHEFIFEFGGFEJIGHHHHHGJKHGJIFSaghTHTR>;?@?A?@?;46<0 &A_sq~����w]PLIIJJIGHJLMNPSVVWXXWWXZTSSVXVUUW^ZSUWWZ[YXXXWX[^\ZZ\_abefgfdcdfc_^]VSTVRUVVTPT`b^]]\\ZTUZ`cddddegihc__b_cdG
 (34(!!#2BNPKHLJGJLKIIHJKLJJJJIIIIJJJJJKKKHHHIIIJJKKLLKKJINLKLKIHIJEINLMLGEKPPKIMRLMMMKLLNNNLKJJKKJKMLF>::45;AAABBE>;YjVLTSSTUWWVTQTWRPUWUPTUUSSUXTUUUVWWVL?O|����������������������������������������������������+$(5444431149>@ABCDCBCCCCBDFECCDEDDDFGGGFEDDCCDCBBBB@?@@AAAAAACADC>@EDCBABEHGDEFGGHIKLHGIHDEIIFDBDFFEEIGFFGFFFGGGHHGFFUdfi\JOQ?8?@:=?;@@86<4#
 &$':HUedt�����oheVIIJIKMLJKLOQRNORUXYYYSUX\ZWVYZWVXZ[\\^\\]^^`d`aa_[Z[]beijiijlkikjd\ZYZYTRTTQPXXXSNRZ]bbdfhhfefhjhc^^a_^ea@(33:89>:26>><=<:76:99<==<99==95331.,,**-+*/0/01/,**/-'#$%$"&'"
 ! ##"&#)''*-3;=:@H@:Qhfbdfc__dirncZ^f_PWUKGPPHILMNPPPMJRNJLPMLQPNNQRPMKMNONNOOMNQSSRQSTLKLNNMNPOPPPQTTRPOSVVSU[YTWZUW^^^[`d__dcabdgjkkknvy��q4" 
+100432359=?@@@A@@@@ABDEEEDCADGGFDCCEEDDCCCC@@??@BA?>ABB@A@?AABBBDEBDCBEGIGEHHHIJKJIIJIGGHHEEFDEGFDHGGGIIGFGFGHJKJIHO_be_OMN@<@>;=;;A>89?2#$
 "%)-)(+)(*++-1112209AG@;Qgfbdec``dirhVKOUVZdXTWQGFJMOOLLOOMMHIOOKMSUPQTQQQNONPONOPNLOPPPRTUPNMNPQPOQPPRRQQSRQRTUVWY[XTUZ^][^bbbea`fdccceiklnx{��x:!!
-22255679;=>EDCA@???DDEEEDCCDEGFDBABDDDCCBBB@@@?@@@?=@BBBBA@ABCCABDCCDFFFEFGKLLJGGJLLJIIIHGFHDGHEEGEEGFGJFDGMJHGIIHGTddebTPM>:?=<>>=>>96=3$ANRQVdplirwqde[MJIGGJKHJRQNSTTRONPTVWX[\ZXXVWSRV\\\_][[]`_^\]]\[YYZ[]`bdhhiklhhie_YRVVURNKIIORV[_][]]bccddcchfeegheb`a`h_3
  
 &!"$')+,,*'##%'&%$$##&*,**+,-,+-/./,*,//1210/-+)'#&%" !
 #$$'*.00/..255445413344442010,**,*'(-.+))+/)/04;4&#3BF>>Qada`__`begvpL4<;-/716FNJJONLMQOJKQKOOMPPMLQRSQPPQQPSOKNNMPROMOQOOQORTTRQPPRPOQQPOPSQQTWWVUZYTU[ZVZ_`cc_`baegijhhikqox���\*$##
+.+)+0541241*)-0/.157778:5/*)*+($"$$! "$$"%# "''"(++,2789>@A<635940154//475453002133026620100241,)+.--44*3D=,/4,%1BF=@Q_c^][\^acdniQAC9#&$,IOGNONLMNNNNPOPQNNOLNSPLPPOQTPRQLOSNLPPNNPPMONOQPNNPSRONQSPLRTSPQVXVXXVTW[\\_fc^abaffghgfgkoinzz��m3%%#
 !  "&'*'*/34423347:;97:;@?63671/1564223762112451/1233550.351..,.+.29B=6IZ? ,7/3AE@=Nc_\ZZ[ZY]bumN73/(
 !!,82%!'4980-/035211,&$&-6>CEFHFFIKJIHHFFGJIHGIJIFFHHHJIGHIIIJIHJMJJJJIHHHHKKLNMJKJJKKKKKJJKKJJLLJMJLNMLLLJKLLKJIHKJJLE<<:88AECA?@F=?ZbMLXUSQQRSRRTTTTTTSRSVTSTUTUUSSUVTTVRUWVVVUTUSQRTRLFEEEDCCBB��������������������������������"$".>BB?<BEA?AB@1)
 ####"$" !&-/.0343355531147:98<>EC8146..16863203446521544332/,/230/0/,,++8AADD@9:-
 #3A@@?@<;@FA3'#2AIBCEECBBC@@@??@CDE@>@@>>@ABBCDEECEFEEGHGFJMMLLJIMKJJKJGEFEFHGEEGFEGGDEFGFDIJGGJIEK]WO`gVHC<<>===;<=64<5 +HRNNRMNOQTVWWWRPNKIGGFHJMNOOPQPTWVTSVWVVVWVUVWUUTUWYXUTX\]^_^\]_`___aa]_`agihfjkhfe^SNJLMNPUY[c`_^adc^aefddfjjia^de`]aa]__gkI
 *60$&376003431,5GB.''-=JIFEJKIJFHHHHJJHHIHHHJJHFIIHIGGJIIHHJLJFIHGHJKKJKIIJHJLKKKJIJJKLKJJKKJJLMIJLKKMNJKJKMHEIIJJIB<<826@BACA@C;>[bMJURQPPRSRQSSRRQQRRQTSRTUTTRRRSTUUUTTUWVSRRXURTWYVSUUUUVVWW��������������������������������-@?-
 (AQLLOKHHKMMKKLOQPOPSRPNNNNNONONLKKLLOOOPRRPNKOQPPNMPONOPRTTSTSTVWVTTZYUSVVUW]]]]`efegeeeffjnonux~��A#
 *-',12//34230/38:8775566325751123542+%$&'(*-//-,.-+(+-)%+48/3,#4F8'95"
-8;>>>=<<>@@AA@?=952-(%%&-8<?AA?>?BBCCABDDBCDGHJJKJJKLLLKJJMLIJKHFIGFFGFCCEDEGFDCEFDGECGGEGKLHDHW\M>>==>?=:9;9284
  )3.#!)586//565335579407DPHFHHHIHGGFGIJJJHHHHHHGGJKJHIJJJGHIJKIHJKHGJKJIIJHIJIJKJJJJLKIIIMNLKNLHHJIKMJGHMIIIIGFGJEEFKD:8629CC?>=AE=BabJMVPRSSQPPQPPQSRQQQTSRTVVSQRSRSSSRRURRUURRVUTSQRUVVRTUTSSTT��������������������������������
 """""!&'))(2CNHHHHHIJKGFGHGHHGHKHEEHGFHHIIGHIHJJIHGIIIIJKKJIGFKLJJJJIKJIJJIHILKIGIKKKNJIGIKMLKJIHHHHHJFGKJB;9858?@@B@CD8Cc^FHQPPQSSSRRRRSRPOPRQRQPQSRPURRUUSPPRRRRSRQQTVSPSUTSTTTUUUUV��������������������������������
 &-1159;::;=<<;:<>???>>===>>BBB@BBA@EFDFJHDHKHHKLMLGIHFCDEEDFDBBDEDBFCABEFDBEEEEHGEECBABBAML@:>;>?>78;8425GVTKKLMLJNMJKMKIIGFGHIJIHHMIHHGILJGIGFKJHJPMKNSTTUV[_^\]^\_`bc`ZXYXX[ceb`aba`^ZVVXUTQLJJJJORTTX^_[`_ab`adccaadebbf^]`dcabc\`c__b`anh:
 ! 
 !$(,05:<<;::>=;::==<=<<>??>=>@B?<@DB@ACBDIKGFIIJKIHIIFCBBBBBCAABBBDFACEEEDDEEEBBEFFGFA@CC?KOB9=>=9;<;=6325DOLEJNNKFJMLKLMJFGIFGGEFHGFHHHIIIKFEEDADIKMHJNPRTRXX[\Y\`a^bd`\[ZWX[^`bdca]]ZVUWVRWTOJLQQMPSWXZ]^^`cc`_]^c_^ac`beddaceccc`a^^_cebdmj>%2+#,.+').-(&*'*,**--%'(%$)+'&&'('&).&)'##%$%$$$$#)/2<?:684.02.-/,()*.22,*-1244202552440+)*++'&%&'))'),*
-@C=<CLMKGHMLGJRXU=%
 !"#*0:=99;:9::;;<<=<<===>>?>?@@>?AACDDEEFHIJGHJHFFGHECCCBBCDDCDECBCDCBCEFEDECFIFDFHHFCD@@IND99>=<:;<;9117GQPJKKJJGJLLNNLMMKHHHHHHHHKLMKJJJHIHHHFDDEGIHHMRQORUYZZZ]`]\^]ZY[\Y[]`cc_YVWVTRTWXVVURNMNOPUX[_`^]^bfebbcb`acccdb^_baaega[bcdd`]^bjoT#"-0,+,,)&*32,,*))*+))(&%&$%()+%#(.10/01-'&*)#$')*.9<73:59DA6-.,)&&(**-+*-24432235652021/../,(*'&'('()+'$
 !"# !)-167:DKKGIKIGGHIHHHHHHHGHIHGGIIHHGFFHIIHIIHGGFFIGIJJKHGGILKJJKJILKJIJJIGJJIHJIIJJKKJKLKINLIJLJHIHEIIB<;919BBBA?CD8D^VEMUTQQMPROPSRONQQPRONRUTOOQTRPQTVUTQSTSRTTTUUTRTVWVRRTVVSSU��������������������������������!%'##0=?:;;;:::;<=;=>=<<>@A>>B@?ACDCBCEFEDGGGIIGDFBDDCCDCAEDCCDCBDDDDDDDDDEIIFGHGHDC@B@?FKB9:=:::<:56239FQLJJLNLHKKKLKKNOLKJHHGHIIJHKMIKMKJGFIIGFIIIJMLHJRQQTWYZ\^[[_a^ZYWV[_`_]ZVVVW[ZXWYZZXSNKMPPTWZ\]^`cggdca_bcggefda`_ca`b_Z[_aababba`k^2
  &%(/56;BJHGGIIIHFFHHGFFHKIGHJKIGIGHIIFGHIGGIJJIIHHGGKJHGKKJIKIGJHGHIIHILJJIHJIHHGHKLKHHHIKKJJJHHIGJH@:8439A@?ABDB8F_UFOSOSQQRNQTQORTQNOQRQQQRRSSRTTSVSPPRSSSSTTRSRRRRQSUUUTRSVUR��������������������������������
 
 ""&'*)'%
 "!$+0.2;FJIEFLKEHKKIHIIGGIHFHKIDIHGHIIGFJFEGHHIHJIEEGIIJIKJGHIIHKIIJJIIJJJIIKKIIMKIHHIIIKLJHJJHFFEHG@<:72;@?A@;AC9IbWGNPOQMORQROLNRRNOQOMQSQNORSPRRSTTRQRRQRTUTRTTRQSUTRTTUVUSST��������������������������������
 !%)*0:BJLEEJJEGHGEGIHDFJJGGIIEHHHGHJIEHEGJJIIHIIJJJIJILIIKJIJKIIIJKJIIJJIILLIIDLNHFKLHLKIHJKIIGFIH@<:62;ABEB=EC6E_TFQUNPRQOORPPSSOMOOKPQQOOQRPTSSRQQRRSTSRSVTQRTUSSSSQVTRRSTUU��������������������������������
 !"%(.7AHLHEGHGFGHIHHIJFJLJHGHIGGGIIHGHHFGHFEGGGHKKGFHHIHIHFHJHGHIIGGIKIIHHKKIIHGHJJHGIIJIIJGFHGGJHA=;739ADC@>DA4EbWFOSOOTPLQPMNQPPSSPNMQRPMOSVURRSRSSONSUQORSQSQQTVUSSRTUTSSUV��������������������������������
  !$$$%$'0<:;=>:9<=>>=>@?=????ACB?A@@CDCDEGB@DECBDDCCDEEDC@ACCDDCC@BCCCDDDDDDDDDEEEEBBA?DGE;;<:;<>;;65-<chKHKNJJLJKKLKKJIIGIIEEHIHKLIHKLLOMLIJMKIJIHIJKJIJKMPRSVZ]dbaa^ZXX[Z]bghjlbefdcddcab^VRRTURPT\a`ad_]`fga`caa`adeb_ba`aa\Z^`_`aa``b]`k`0
-BC@?BLJIIIGFGJMUQ.)HPLMKMNKKNLILMNQRPPPPQQPNOQNNONLMMJKMMMOPONRQNKKNQOLLNNOQRQQQQTVSRUUVWXXXYZZYXXY[\\````cehinnkq}���w2*0$
 "#)$ "$)-17CJJGHGEFGGFFGIFEGHGFEEHHGFGHGHHGHHFFHHFGHIIIGFFHHEGJJGLJIHHGHILIIJKIIIGHJIHHIKJGIIGFGDGFHE=9:83:?=@A?C>4HaTFNRNROMQOMRROMNPOPQOQSRRRRQPRUSPQTTTSRRTTTSQQQSTSQQQSUTQPSU��������������������������������
  !"$# 
  
 
  
 "  #"
+

examples_pygame/eventlist.py

+
+"""Eventlist is a sloppy style of pygame, but is a handy
+tool for learning about pygame events and input. At the
+top of the screen are the state of several device values,
+and a scrolling list of events are displayed on the bottom.
+
+This is not quality 'ui' code at all, but you can see how
+to implement very non-interactive status displays, or even
+a crude text output control.
+"""
+
+from pygame import *
+
+ImgOnOff = []
+Font = None
+LastKey = None
+
+def showtext(win, pos, text, color, bgcolor):
+    textimg = Font.render(text, 1, color, bgcolor)
+    win.blit(textimg, pos)
+    return pos[0] + textimg.get_width() + 5, pos[1]
+
+
+def drawstatus(win):
+    bgcolor = 50, 50, 50
+    win.fill(bgcolor, (0, 0, 640, 120))
+    win.blit(Font.render('Status Area', 1, (155, 155, 155), bgcolor), (2, 2))
+
+    pos = showtext(win, (10, 30), 'Mouse Focus', (255, 255, 255), bgcolor)
+    win.blit(ImgOnOff[mouse.get_focused()], pos)
+
+    pos = showtext(win, (330, 30), 'Keyboard Focus', (255, 255, 255), bgcolor)
+    win.blit(ImgOnOff[key.get_focused()], pos)
+
+    pos = showtext(win, (10, 60), 'Mouse Position', (255, 255, 255), bgcolor)
+    p = '%s, %s' % mouse.get_pos()
+    pos = showtext(win, pos, p, bgcolor, (255, 255, 55))
+
+    pos = showtext(win, (330, 60), 'Last Keypress', (255, 255, 255), bgcolor)
+    if LastKey:
+        p = '%d, %s' % (LastKey, key.name(LastKey))
+    else:
+        p = 'None'
+    pos = showtext(win, pos, p, bgcolor, (255, 255, 55))
+
+    pos = showtext(win, (10, 90), 'Input Grabbed', (255, 255, 255), bgcolor)
+    win.blit(ImgOnOff[event.get_grab()], pos)
+
+
+def drawhistory(win, history):
+    win.blit(Font.render('Event History Area', 1, (155, 155, 155), (0,0,0)), (2, 132))
+    ypos = 450
+    h = list(history)
+    h.reverse()
+    for line in h:
+        r = win.blit(line, (10, ypos))
+        win.fill(0, (r.right, r.top, 620, r.height))
+        ypos -= Font.get_height()
+
+
+def main():
+    init()
+
+    win = display.set_mode((640, 480), RESIZABLE)
+    display.set_caption("Mouse Focus Workout")
+
+    global Font
+    Font = font.Font(None, 26)
+
+    global ImgOnOff
+    ImgOnOff.append(Font.render("Off", 1, (0, 0, 0), (255, 50, 50)))
+    ImgOnOff.append(Font.render("On", 1, (0, 0, 0), (50, 255, 50)))
+
+    history = []
+
+    #let's turn on the joysticks just so we can play with em
+    for x in range(joystick.get_count()):
+        j = joystick.Joystick(x)
+        j.init()
+        txt = 'Enabled joystick: ' + j.get_name()
+        img = Font.render(txt, 1, (50, 200, 50), (0, 0, 0))
+        history.append(img)
+    if not joystick.get_count():
+        img = Font.render('No Joysticks to Initialize', 1, (50, 200, 50), (0, 0, 0))
+        history.append(img)
+
+    while 1:
+        for e in event.get():
+            if e.type == QUIT:
+                return
+            if e.type == KEYDOWN:
+                if e.key == K_ESCAPE:
+                    return
+                else:
+                    global LastKey
+                    LastKey = e.key
+            if e.type == MOUSEBUTTONDOWN:
+                event.set_grab(1)
+            elif e.type == MOUSEBUTTONUP:
+                event.set_grab(0)
+            if e.type == VIDEORESIZE:
+                win = display.set_mode(e.size, RESIZABLE)
+
+            if e.type != MOUSEMOTION:
+                txt = '%s: %s' % (event.event_name(e.type), e.dict)
+                img = Font.render(txt, 1, (50, 200, 50), (0, 0, 0))
+                history.append(img)
+                history = history[-13:]
+
+
+        drawstatus(win)
+        drawhistory(win, history)
+
+        display.flip()
+        time.wait(10)
+
+
+
+if __name__ == '__main__': main()

examples_pygame/fastevents.py

+"""  This is a stress test for the fastevents module.
+
+*Fast events does not appear faster!*
+
+So far it looks like normal pygame.event is faster by up to two times.
+So maybe fastevent isn't fast at all.
+
+Tested on windowsXP sp2 athlon, and freebsd.
+
+However... on my debian duron 850 machine fastevents is faster.
+"""
+from pygame import *
+
+# the config to try different settings out with the event queues.
+
+# use the fastevent module or not.
+use_fast_events = 1
+
+# use pygame.display.flip().
+#    otherwise we test raw event processing throughput.
+with_display = 1
+
+# limit the game loop to 40 fps.
+slow_tick = 0
+
+NUM_EVENTS_TO_POST = 200000
+
+
+
+if use_fast_events:
+    event_module = fastevent
+else:
+    event_module = event
+
+
+
+
+from threading import Thread
+
+class post_them(Thread):
+    def __init__(self):
+        Thread.__init__(self)
+        self.done = []
+        self.stop = []
+
+    def run(self):
+        self.done = []
+        self.stop = []
+        for x in range(NUM_EVENTS_TO_POST):
+            ee = event.Event(USEREVENT)
+            try_post = 1
+
+            # the pygame.event.post raises an exception if the event
+            #   queue is full.  so wait a little bit, and try again.
+            while try_post:
+                try:
+                    event_module.post(ee)
+                    try_post = 0
+                except:
+                    pytime.sleep(0.001)
+                    try_post = 1
+                
+            if self.stop:
+                return
+        self.done.append(1)
+        
+        
+
+import time as pytime
+
+def main():
+    init()
+    
+    if use_fast_events:
+        fastevent.init()
+
+    c = time.Clock()
+
+    win = display.set_mode((640, 480), RESIZABLE)
+    display.set_caption("fastevent Workout")
+
+    poster = post_them()
+
+    t1 = pytime.time()
+    poster.start()
+
+
+    while 1:
+#        for e in event.get():
+        #for x in range(200):
+        #    ee = event.Event(USEREVENT)
+        #    r = event_module.post(ee)
+        #    print r
+        
+        #for e in event_module.get():
+        event_list = []
+        event_list = event_module.get()
+
+        for e in event_list:
+            if e.type == QUIT:
+                print c.get_fps()
+                poster.stop.append(1)
+                return
+            if e.type == KEYDOWN:
+                if e.key == K_ESCAPE:
+                    print c.get_fps()
+                    poster.stop.append(1)
+                    return
+        if poster.done:
+            print c.get_fps()
+            print c
+            t2 = pytime.time()
+            print "total time:%s" % (t2 - t1)
+            print "events/second:%s" % (NUM_EVENTS_TO_POST / (t2 - t1))
+            return
+        if with_display:
+            display.flip()
+        if slow_tick:
+            c.tick(40)
+        
+        
+
+
+
+
+if __name__ == '__main__': main()

examples_pygame/fonty.py

+#!/usr/bin/env python
+
+"""Here we load a .TTF font file, and display it in
+a basic pygame window. It demonstrates several of the
+Font object attributes. Nothing exciting in here, but
+it makes a great example for basic window, event, and
+font management."""
+
+
+import pygame
+from pygame.locals import *
+
+
+def main():
+    #initialize
+    pygame.init()
+    resolution = 400, 200
+    screen = pygame.display.set_mode(resolution)
+
+    #the python 1.5.2 way to set the cursor
+    apply(pygame.mouse.set_cursor, pygame.cursors.diamond)
+    #the python 2.0 way to set the cursor
+    #pygame.mouse.set_cursor(*pygame.cursors.diamond)
+
+    fg = 250, 240, 230
+    bg = 5, 5, 5
+    wincolor = 40, 40, 90
+
+    #fill background
+    screen.fill(wincolor)
+
+    #load font, prepare values
+    font = pygame.font.Font(None, 80)
+    text = 'Fonty'
+    size = font.size(text)
+
+    #no AA, no transparancy, normal
+    ren = font.render(text, 0, fg, bg)
+    screen.blit(ren, (10, 10))
+
+    #no AA, transparancy, underline
+    font.set_underline(1)
+    ren = font.render(text, 0, fg)
+    screen.blit(ren, (10, 40 + size[1]))
+    font.set_underline(0)
+
+
+    a_sys_font = pygame.font.SysFont("Arial", 60)
+
+
+    #AA, no transparancy, bold
+    a_sys_font.set_bold(1)
+    ren = a_sys_font.render(text, 1, fg, bg)
+    screen.blit(ren, (30 + size[0], 10))
+    a_sys_font.set_bold(0)
+
+    #AA, transparancy, italic
+    a_sys_font.set_italic(1)
+    ren = a_sys_font.render(text, 1, fg)
+    screen.blit(ren, (30 + size[0], 40 + size[1]))
+    a_sys_font.set_italic(0)
+
+
+    ##some_japanese_unicode = u"\u304b\u3070\u306b"
+    
+    #AA, transparancy, italic
+    ##ren = a_sys_font.render(some_japanese_unicode, 1, fg)
+    ##screen.blit(ren, (30 + size[0], 40 + size[1]))
+    
+
+
+
+
+    #show the surface and await user quit
+    pygame.display.flip()
+    while 1:
+        #use event.wait to keep from polling 100% cpu
+        if pygame.event.wait().type in (QUIT, KEYDOWN, MOUSEBUTTONDOWN):
+            break
+
+
+
+if __name__ == '__main__': main()
+    

examples_pygame/glcube.py

+#!/usr/bin/env python
+
+"""Draw a cube on the screen. every frame we orbit
+the camera around by a small amount and it appears
+the object is spinning. note i've setup some simple
+data structures here to represent a multicolored cube,
+we then go through a semi-unopimized loop to draw
+the cube points onto the screen. opengl does all the
+hard work for us. :]
+"""
+
+import pygame
+from pygame.locals import *
+
+try:
+    from OpenGL.GL import *
+    from OpenGL.GLU import *
+except:
+    print 'The GLCUBE example requires PyOpenGL'
+    raise SystemExit
+
+
+
+#some simple data for a colored cube
+#here we have the 3D point position and color
+#for each corner. then we have a list of indices
+#that describe each face, and a list of indieces
+#that describes each edge
+
+
+CUBE_POINTS = (
+    (0.5, -0.5, -0.5),  (0.5, 0.5, -0.5),
+    (-0.5, 0.5, -0.5),  (-0.5, -0.5, -0.5),
+    (0.5, -0.5, 0.5),   (0.5, 0.5, 0.5),
+    (-0.5, -0.5, 0.5),  (-0.5, 0.5, 0.5)
+)
+
+#colors are 0-1 floating values
+CUBE_COLORS = (
+    (1, 0, 0), (1, 1, 0), (0, 1, 0), (0, 0, 0),
+    (1, 0, 1), (1, 1, 1), (0, 0, 1), (0, 1, 1)
+)
+
+CUBE_QUAD_VERTS = (
+    (0, 1, 2, 3), (3, 2, 7, 6), (6, 7, 5, 4),
+    (4, 5, 1, 0), (1, 5, 7, 2), (4, 0, 3, 6)
+)
+
+CUBE_EDGES = (
+    (0,1), (0,3), (0,4), (2,1), (2,3), (2,7),
+    (6,3), (6,4), (6,7), (5,1), (5,4), (5,7),
+)
+
+
+
+def drawcube():
+    "draw the cube"
+    allpoints = zip(CUBE_POINTS, CUBE_COLORS)
+
+    glBegin(GL_QUADS)
+    for face in CUBE_QUAD_VERTS:
+        for vert in face:
+            pos, color = allpoints[vert]
+            glColor3fv(color)
+            glVertex3fv(pos)
+    glEnd()
+
+    glColor3f(1.0, 1.0, 1.0)
+    glBegin(GL_LINES)
+    for line in CUBE_EDGES:
+        for vert in line:
+            pos, color = allpoints[vert]
+            glVertex3fv(pos)
+
+    glEnd()
+
+
+def main():
+    "run the demo"
+    #initialize pygame and setup an opengl display
+    pygame.init()
+    pygame.display.set_mode((640,480), OPENGL|DOUBLEBUF)
+    glEnable(GL_DEPTH_TEST)        #use our zbuffer
+
+    #setup the camera
+    glMatrixMode(GL_PROJECTION)
+    gluPerspective(45.0,640/480.0,0.1,100.0)    #setup lens
+    glTranslatef(0.0, 0.0, -3.0)                #move back
+    glRotatef(25, 1, 0, 0)                       #orbit higher
+
+
+    while 1:
+        #check for quit'n events
+        event = pygame.event.poll()
+        if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
+            break
+
+        #clear screen and move camera
+        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
+
+        #orbit camera around by 1 degree
+        glRotatef(1, 0, 1, 0)                    
+
+        drawcube()
+        pygame.display.flip()
+        pygame.time.wait(10)
+
+
+if __name__ == '__main__': main()

examples_pygame/liquid.py

+#!/usr/bin/env python
+
+"""This examples demonstrates a simplish water effect of an
+image. It attempts to create a hardware display surface that
+can use pageflipping for faster updates. Note that the colormap
+from the loaded GIF image is copied to the colormap for the
+display surface.
+
+This is based on the demo named F2KWarp by Brad Graham of Freedom2000
+done in BlitzBasic. I was just translating the BlitzBasic code to
+pygame to compare the results. I didn't bother porting the text and
+sound stuff, that's an easy enough challenge for the reader :]"""
+
+import pygame, os
+from pygame.locals import *
+from math import sin
+
+def main():
+    #initialize and setup screen
+    pygame.init()
+    screen = pygame.display.set_mode((640, 480), HWSURFACE|DOUBLEBUF)
+
+    #load image and quadruple
+    imagename = os.path.join('data', 'liquid.bmp')
+    bitmap = pygame.image.load(imagename)
+    bitmap = pygame.transform.scale2x(bitmap)
+    bitmap = pygame.transform.scale2x(bitmap)
+
+    #get the image and screen in the same format
+    if screen.get_bitsize() == 8:
+        screen.set_palette(bitmap.get_palette())
+    else:
+        bitmap = bitmap.convert()
+
+    #prep some variables
+    anim = 0.0
+
+    #mainloop
+    xblocks = range(0, 640, 20)
+    yblocks = range(0, 480, 20)
+    stopevents = QUIT, KEYDOWN, MOUSEBUTTONDOWN
+    while 1:
+        for e in pygame.event.get():
+            if e.type in stopevents:
+                return
+
+        anim = anim + 0.2
+        for x in xblocks:
+            xpos = (x + (sin(anim + x * .01) * 15)) + 20
+            for y in yblocks:
+                ypos = (y + (sin(anim + y * .01) * 15)) + 20
+                screen.blit(bitmap, (x, y), (xpos, ypos, 20, 20))
+
+        pygame.display.flip()
+
+
+if __name__ == '__main__': main()
+
+
+
+"""BTW, here is the code from the BlitzBasic example this was derived
+from. i've snipped the sound and text stuff out.
+-----------------------------------------------------------------
+; Brad@freedom2000.com
+
+; Load a bmp pic (800x600) and slice it into 1600 squares
+Graphics 640,480
+SetBuffer BackBuffer()
+bitmap$="f2kwarp.bmp"
+pic=LoadAnimImage(bitmap$,20,15,0,1600)
+
+; use SIN to move all 1600 squares around to give liquid effect
+Repeat
+f=0:w=w+10:If w=360 Then w=0
+For y=0 To 599 Step 15
+For x = 0 To 799 Step 20
+f=f+1:If f=1600 Then f=0
+DrawBlock pic,(x+(Sin(w+x)*40))/1.7+80,(y+(Sin(w+y)*40))/1.7+60,f
+Next:Next:Flip:Cls
+Until KeyDown(1)
+"""

examples_pygame/macosx/aliens_app_example/English.lproj/MainMenu.nib/JavaCompiling.plist

+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>JavaSourceSubpath</key>
+	<string>_MainMenu_EOArchive_English.java</string>
+</dict>
+</plist>

examples_pygame/macosx/aliens_app_example/English.lproj/MainMenu.nib/_MainMenu_EOArchive_English.java

+// _MainMenu_EOArchive_English.java
+// Generated by EnterpriseObjects palette at Tuesday, March 2, 2004 8:45:51 PM America/New_York
+
+import com.webobjects.eoapplication.*;
+import com.webobjects.eocontrol.*;
+import com.webobjects.eointerface.*;
+import com.webobjects.eointerface.swing.*;
+import com.webobjects.foundation.*;
+import javax.swing.*;
+
+public class _MainMenu_EOArchive_English extends com.webobjects.eoapplication.EOArchive {
+    PygameAppDelegate _pygameAppDelegate0;
+
+    public _MainMenu_EOArchive_English(Object owner, NSDisposableRegistry registry) {
+        super(owner, registry);
+    }
+
+    protected void _construct() {
+        Object owner = _owner();
+        EOArchive._ObjectInstantiationDelegate delegate = (owner instanceof EOArchive._ObjectInstantiationDelegate) ? (EOArchive._ObjectInstantiationDelegate)owner : null;
+        Object replacement;
+
+        super._construct();
+
+
+        if ((delegate != null) && ((replacement = delegate.objectForOutletPath(this, "delegate")) != null)) {
+            _pygameAppDelegate0 = (replacement == EOArchive._ObjectInstantiationDelegate.NullObject) ? null : (PygameAppDelegate)replacement;
+            _replacedObjects.setObjectForKey(replacement, "_pygameAppDelegate0");
+        } else {
+            _pygameAppDelegate0 = (PygameAppDelegate)_registered(new PygameAppDelegate(), "PygameAppDelegate");
+        }
+    }
+
+    protected void _awaken() {
+        super._awaken();
+        .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(_owner(), "unhideAllApplications", ), ""));
+        .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(_owner(), "hide", ), ""));
+        .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(_owner(), "hideOtherApplications", ), ""));
+        .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(_owner(), "orderFrontStandardAboutPanel", ), ""));
+
+        if (_replacedObjects.objectForKey("_pygameAppDelegate0") == null) {
+            _connect(_owner(), _pygameAppDelegate0, "delegate");
+        }
+
+        .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(_owner(), "terminate", ), ""));
+    }
+
+    protected void _init() {
+        super._init();
+        .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "undo", ), ""));
+        .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "paste", ), ""));
+        .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "arrangeInFront", ), ""));
+        .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "copy", ), ""));
+        .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "showHelp", ), ""));
+        .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "clearRecentDocuments", ), ""));
+        .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "selectAll", ), ""));
+        .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "performMiniaturize", ), ""));
+        .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "toggleContinuousSpellChecking", ), ""));
+        .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "print", ), ""));
+        .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "cut", ), ""));
+        .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "runPageLayout", ), ""));
+        .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "checkSpelling", ), ""));
+        .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "delete", ), ""));
+        .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "redo", ), ""));
+        .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "performClose", ), ""));
+        .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "showGuessPanel", ), ""));
+    }
+}

examples_pygame/macosx/aliens_app_example/English.lproj/MainMenu.nib/classes.nib

+{
+    IBClasses = (
+        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, 
+        {
+            ACTIONS = {}; 
+            CLASS = PygameAppDelegate; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {}; 
+            SUPERCLASS = NSObject; 
+        }
+    ); 
+    IBVersion = 1; 
+}

examples_pygame/macosx/aliens_app_example/English.lproj/MainMenu.nib/info.nib

+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IBDocumentLocation</key>
+	<string>269 494 356 240 0 0 1600 1002 </string>
+	<key>IBEditorPositions</key>
+	<dict>
+		<key>29</key>
+		<string>125 344 278 44 0 0 1600 1002 </string>