SlideShare a Scribd company logo
Unit 9
pyGame
Special thanks to Roy McElmurry, John Kurkowski, Scott Shawcroft, Ryan Tucker, Paul Beck for their work.
Except where otherwise noted, this work is licensed under:
http://creativecommons.org/licenses/by-nc-sa/3.0
2
Exercise: Whack-a-mole
• Goal: Let's create a "whack-a-mole" game where moles pop
up on screen periodically.
– The user can click a mole to "whack" it. This leads to:
• A sound is played.
• The player gets +1 point.
• A new mole appears elsewhere on the screen.
• The number of points is displayed at the top of the screen.
3
What is pyGame?
• A set of Python modules to make it easier to write games.
– home page: http://pygame.org/
– documentation: http://pygame.org/docs/ref/
• pyGame helps you do the following and more:
– Sophisticated 2-D graphics drawing functions
– Deal with media (images, sound F/X, music) nicely
– Respond to user input (keyboard, joystick, mouse)
– Built-in classes to represent common game objects
4
pyGame at a glance
• pyGame consists of many modules of code to help you:
cdrom cursors display draw event
font image joystick key mouse
movie sndarray surfarray time transform
• To use a given module, import it. For example:
import pygame
from pygame import *
from pygame.display import *
5
Game fundamentals
• sprites: Onscreen characters or other moving objects.
• collision detection: Seeing which pairs of sprites touch.
• event: An in-game action such as a mouse or key press.
• event loop: Many games have an overall loop that:
– waits for events to occur, updates sprites, redraws screen
6
A basic skeleton
pygame_template.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from pygame import *
from pygame.sprite import *
pygame.init() # starts up pyGame
screen = display.set_mode((width, height))
display.set_caption("window title")
create / set up sprites.
# the overall event loop
while True:
e = event.wait() # pause until event occurs
if e.type == QUIT:
pygame.quit() # shuts down pyGame
break
update sprites, etc.
screen.fill((255, 255, 255)) # white background
display.update() # redraw screen
7
Initializing pyGame
• To start off our game, we must pop up a graphical window.
• Calling display.set_mode creates a window.
– The call returns an object of type Surface, which we will call
screen. We can call methods on the screen later.
– Calling display.set_caption sets the window's title.
from pygame import *
pygame.init() # starts up pyGame
screen = display.set_mode((width, height))
display.set_caption("title")
...
pygame.quit()
8
Surfaces
screen = display.set_mode((width, height)) # a surface
• In Pygame, every 2D object is an object of type Surface
– The screen object, each game character, images, etc.
– Useful methods in each Surface object:
– after changing any surfaces, must call display.update()
Surface((width, height)) constructs new Surface of given size
fill((red, green, blue)) paints surface in given color (rgb 0-255)
get_width(), get_height() returns the dimensions of the surface
get_rect() returns a Rect object representing the
x/y/w/h bounding this surface
blit(surface, coords) draws another surface onto this surface at
the given coordinates
9
Sprites
• Sprites: Onscreen characters or
other moving objects.
• A sprite has data/behavior such as:
– its position and size on the screen
– an image or shape for its appearance
– the ability to collide with other sprites
– whether it is alive or on-screen right now
– might be part of certain "groups" (enemies, food, ...)
• In pyGame, each type of sprite is represented as a subclass
of the class pygame.sprite.Sprite
10
A rectangular sprite
from pygame import *
from pygame.sprite import *
class name(Sprite):
def __init__(self): # constructor
Sprite.__init__(self)
self.image = Surface(width, height)
self.rect = Rect(leftX, topY, width, height)
other methods (if any)
– Important fields in every sprite:
image - the image or shape to draw for this sprite (a Surface)
– as with screen, you can fill this or draw things onto it
rect - position and size of where to draw the sprite (a Rect)
– Important methods: update, kill, alive
11
Rect methods
* Many methods, rather than mutating, return a new rect.
– To mutate, use _ip (in place) version, e.g. move_ip
clip(rect) * crops this rect's size to bounds of given rect
collidepoint(p) True if this Rect contains the point
colliderect(rect) True if this Rect touches the rect
collidelist(list) True if this Rect touches any rect in the list
collidelistall(list) True if this Rect touches all rects in the list
contains(rect) True if this Rect completely contains the rect
copy() returns a copy of this rectangle
inflate(dx, dy) * grows size of rectangle by given offsets
move(dx, dy) * shifts position of rectangle by given offsets
union(rect) * smallest rectangle that contains this and rect
12
A Sprite using an image
from pygame import *
from pygame.sprite import *
class name(Sprite):
def __init__(self): # constructor
Sprite.__init__(self)
self.image = image.load("filename").convert()
self.rect = self.image.get_rect().move(x, y)
other methods (if any)
– When using an image, you load it from a file with
image.load and then use its size to define the rect field
– Any time you want a sprite to move on the screen,
you must change the state of its rect field.
13
Setting up sprites
• When creating a game, we think about the sprites.
– What sprites are there on the screen?
– What data/behavior should each one keep track of?
– Are any sprites similar? (If so, maybe they share a class.)
• For our Whack-a-Mole game:
class Mole(Sprite):
...
14
Sprite groups
name = Group(sprite1, sprite2, ...)
– To draw sprites on screen, put them into a Group
– Useful methods of each Group object:
draw(surface) - draws all sprites in group on a Surface
update() - calls every sprite's update method
my_mole1 = Mole() # create a Mole object
my_mole2 = Mole()
all_sprites = Group(my_mole1, other_mole2)
...
# in the event loop
all_sprites.draw(screen)
15
Events
• event-driven programming: When the overall program is
a series of responses to user actions, or "events."
• event loop (aka "main loop", "animation loop"):
Many games have an overall loop to do the following:
– wait for an event to occur, or
wait a certain interval of time
– update all game objects (location, etc.)
– redraw the screen
– repeat
16
The event loop
– In an event loop, you wait for something to happen, and then
depending on the kind of event, you process it:
while True:
e = event.wait() # wait for an event
if e.type == QUIT:
pygame.quit() # exit the game
break
elif e.type == type:
code to handle some other type of events;
elif ...
17
Mouse events
• Mouse actions lead to events with specific types:
– press button down: MOUSEBUTTONDOWN
– release button: MOUSEBUTTONUP
– move the cursor: MOUSEMOTION
• At any point you can call mouse.get_pos() which returns
the mouse's current position as an (x, y) tuple.
e = event.wait()
if e.type == MOUSEMOTION:
pt = mouse.get_pos()
x, y = pt
...
18
Collision detection
• collision detection: Examining pairs of sprites to see if
they are touching each other.
– e.g. seeing whether sprites' bounding rectangles intersect
– usually done after events occur,
or at regular timed intervals
– can be complicated and error-prone
• optimizations: pruning (only comparing some sprites, not all), ...
19
Collisions btwn. rectangles
• Recall: Each Sprite contains a Rect collision rectangle
stored as a field named rect
• Rect objects have useful methods for detecting collisions
between the rectangle and another sprite:
if sprite1.rect.colliderect(sprite2.rect):
# they collide!
...
collidepoint(p) returns True if this Rect contains the point
colliderect(rect) returns True if this Rect touches the rect
20
Collisions between groups
global pyGame functions to help with collisions:
spritecollideany(sprite, group)
– Returns True if sprite has collided with any sprite in the group
spritecollide(sprite, group, kill)
– Returns a list of all sprites in group that collide with sprite
– If kill is True, a collision causes sprite to be deleted/killed
groupcollide(group1, group2, kill1, kill2)
– Returns list of all sprites in group1 that collide with group2
21
Drawing text: Font
• Text is drawn using a Font object:
name = Font(filename, size)
– Pass None for the file name to use a default font.
• A Font draws text as a Surface with its render method:
name.render("text", True, (red, green, blue))
Example:
my_font = Font(None, 16)
text = my_font.render("Hello", True, (0, 0, 0))
22
Displaying text
• A Sprite can be text by setting that text's Surface
to be its .image property.
Example:
class Banner(Sprite):
def __init__(self):
my_font = Font(None, 24)
self.image = my_font.render("Hello", True, 
(0, 0, 0))
self.rect = self.image.get_rect().move(50,70)
23
Exercise: Pong
• Let's create a Pong game with a bouncing ball and paddles.
– 800x480 screen, 10px white border around all edges
– 15x15 square ball bounces off of any surface it touches
– two 20x150 paddles move when holding Up/Down arrows
– game displays score on top/center of screen in a 72px font
24
Animation
• Many action games, rather than waiting for key/mouse
input, have a constant animation timer.
– The timer generates events at regular intervals.
– On each event, we can move/update all sprites, look for
collisions, and redraw the screen.
25
Timer events
time.set_timer(USEREVENT, delayMS)
• Animation is done using timers
– Events that automatically occur every delayMS milliseconds;
they will have a type of USEREVENT
– Your event loop can check for these events.
Each one is a "frame" of animation
while True:
e = event.wait()
if e.type == USEREVENT:
# the timer has ticked
...
26
Key presses
• key presses lead to KEYDOWN and KEYUP events
• key.get_pressed() returns an array of keys held down
– the array indexes are constants like K_UP or K_F1
– values in the array are booleans (True means pressed)
– Constants for keys: K_LEFT, K_RIGHT, K_UP, K_DOWN,
K_a - K_z, K_0 - K_9, K_F1 - K_F12, K_SPACE,
K_ESCAPE, K_LSHIFT, K_RSHIFT, K_LALT, K_RALT,
K_LCTRL, K_RCTRL, ...
keys_down = key.get_pressed()
if keys_down[K_LEFT]:
# left arrow is being held down
...
27
Updating sprites
class name(Sprite):
def __init__(self):
...
def update(self): # right by 3px per tick
self.rect = self.rect.move(3, 0)
• Each sprite can have an update method that describes how
to move that sprite on each timer tick.
– Move a rectangle by calling its move(dx, dy) method.
– Calling update on a Group updates all its sprites.
28
Sounds
• Loading and playing a sound file:
from pygame.mixer import *
mixer.init() # initialize sound system
mixer.stop() # silence all sounds
Sound("filename").play() # play a sound
• Loading and playing a music file:
music.load("filename") # load bg music file
music.play(loops=0) # play/loop music
# (-1 loops == infinite)
others: stop, pause, unpause, rewind, fadeout, queue
29
The sky's the limit!
• pygame.org has lots of docs and examples
• can download tons of existing games
– run them
– look at their code for ideas
• if you can imagine it,
you can create it!

More Related Content

PDF
Pygame presentation
PDF
Python lecture 10
PDF
Introduction to Game Programming: Using C# and Unity 3D - Chapter 6 (Preview)
PDF
School For Games 2015 - Unity Engine Basics
PPTX
Md2010 jl-wp7-sl-game-dev
PPTX
Silverlight as a Gaming Platform
PDF
14multithreaded Graphics
PDF
Introduction to Pygame (Lecture 7 Python Game Development)
Pygame presentation
Python lecture 10
Introduction to Game Programming: Using C# and Unity 3D - Chapter 6 (Preview)
School For Games 2015 - Unity Engine Basics
Md2010 jl-wp7-sl-game-dev
Silverlight as a Gaming Platform
14multithreaded Graphics
Introduction to Pygame (Lecture 7 Python Game Development)

Similar to "Pemrograman Python untuk Pemula dan Ahli" (20)

PDF
A split screen-viable UI event system - Unite Copenhagen 2019
PPTX
Vanmathy python
PDF
Ui in unity
PDF
The Ring programming language version 1.7 book - Part 53 of 196
PPTX
Unity workshop
PPTX
Game Development Session - 3 | Introduction to Unity
PPTX
WP7 HUB_XNA
PPTX
PPTX
WP7 HUB_XNA overview
PPTX
java_for_future_15-Multithreaded-Graphics.pptx
PDF
Денис Ковалев «Python в игровой индустрии»
PPTX
IsoUnity: A retro-isometric toolkit for Unity
PDF
building_games_with_ruby_rubyconf
PDF
building_games_with_ruby_rubyconf
PPTX
Java ME - 05 - Game API
PPTX
Game Development with Pygame
PPT
Gdc09 Minigames
PPTX
Game development with Cocos2d
KEY
ARTDM 170, Week 7: Scripting Interactivity
PDF
Presentación Unity
A split screen-viable UI event system - Unite Copenhagen 2019
Vanmathy python
Ui in unity
The Ring programming language version 1.7 book - Part 53 of 196
Unity workshop
Game Development Session - 3 | Introduction to Unity
WP7 HUB_XNA
WP7 HUB_XNA overview
java_for_future_15-Multithreaded-Graphics.pptx
Денис Ковалев «Python в игровой индустрии»
IsoUnity: A retro-isometric toolkit for Unity
building_games_with_ruby_rubyconf
building_games_with_ruby_rubyconf
Java ME - 05 - Game API
Game Development with Pygame
Gdc09 Minigames
Game development with Cocos2d
ARTDM 170, Week 7: Scripting Interactivity
Presentación Unity
Ad

More from Muhammadlenterabawon (10)

PDF
Materi Pengenalan Pengurangan Resiko Bencana .pdf
PPTX
materi triage dalam pertolongan pertama.pptx
PPTX
Kelompok 3 perbandingan load balancing.pptx
PPT
Materi UML teknik informatika semester 4 .ppt
PPTX
PPT Pancasila Kelompok 6 politeknik.pptx
PPTX
Promosi Politeknik Sawunggalih Aji .pptx
PPT
Materi Pertolongan Tentang Mobilisasi Korban
PPT
materi pertolongan pertama tentang evakuasi
PPT
Pengenalan Materi Pertolongan Pertama dan Dasar Dasarnya
PPT
Materi Pertolongan Pertama Tentang Anatomi
Materi Pengenalan Pengurangan Resiko Bencana .pdf
materi triage dalam pertolongan pertama.pptx
Kelompok 3 perbandingan load balancing.pptx
Materi UML teknik informatika semester 4 .ppt
PPT Pancasila Kelompok 6 politeknik.pptx
Promosi Politeknik Sawunggalih Aji .pptx
Materi Pertolongan Tentang Mobilisasi Korban
materi pertolongan pertama tentang evakuasi
Pengenalan Materi Pertolongan Pertama dan Dasar Dasarnya
Materi Pertolongan Pertama Tentang Anatomi
Ad

Recently uploaded (20)

PPTX
human mycosis Human fungal infections are called human mycosis..pptx
PDF
Complications of Minimal Access Surgery at WLH
PPTX
school management -TNTEU- B.Ed., Semester II Unit 1.pptx
PPTX
Cell Types and Its function , kingdom of life
PDF
The Lost Whites of Pakistan by Jahanzaib Mughal.pdf
PDF
O7-L3 Supply Chain Operations - ICLT Program
PDF
Insiders guide to clinical Medicine.pdf
PPTX
1st Inaugural Professorial Lecture held on 19th February 2020 (Governance and...
PDF
01-Introduction-to-Information-Management.pdf
PDF
VCE English Exam - Section C Student Revision Booklet
PDF
Module 4: Burden of Disease Tutorial Slides S2 2025
PDF
ANTIBIOTICS.pptx.pdf………………… xxxxxxxxxxxxx
PPTX
Cell Structure & Organelles in detailed.
PDF
Black Hat USA 2025 - Micro ICS Summit - ICS/OT Threat Landscape
PDF
Saundersa Comprehensive Review for the NCLEX-RN Examination.pdf
PPTX
Renaissance Architecture: A Journey from Faith to Humanism
PDF
Chapter 2 Heredity, Prenatal Development, and Birth.pdf
PDF
Microbial disease of the cardiovascular and lymphatic systems
PDF
102 student loan defaulters named and shamed – Is someone you know on the list?
PPTX
Introduction_to_Human_Anatomy_and_Physiology_for_B.Pharm.pptx
human mycosis Human fungal infections are called human mycosis..pptx
Complications of Minimal Access Surgery at WLH
school management -TNTEU- B.Ed., Semester II Unit 1.pptx
Cell Types and Its function , kingdom of life
The Lost Whites of Pakistan by Jahanzaib Mughal.pdf
O7-L3 Supply Chain Operations - ICLT Program
Insiders guide to clinical Medicine.pdf
1st Inaugural Professorial Lecture held on 19th February 2020 (Governance and...
01-Introduction-to-Information-Management.pdf
VCE English Exam - Section C Student Revision Booklet
Module 4: Burden of Disease Tutorial Slides S2 2025
ANTIBIOTICS.pptx.pdf………………… xxxxxxxxxxxxx
Cell Structure & Organelles in detailed.
Black Hat USA 2025 - Micro ICS Summit - ICS/OT Threat Landscape
Saundersa Comprehensive Review for the NCLEX-RN Examination.pdf
Renaissance Architecture: A Journey from Faith to Humanism
Chapter 2 Heredity, Prenatal Development, and Birth.pdf
Microbial disease of the cardiovascular and lymphatic systems
102 student loan defaulters named and shamed – Is someone you know on the list?
Introduction_to_Human_Anatomy_and_Physiology_for_B.Pharm.pptx

"Pemrograman Python untuk Pemula dan Ahli"

  • 1. Unit 9 pyGame Special thanks to Roy McElmurry, John Kurkowski, Scott Shawcroft, Ryan Tucker, Paul Beck for their work. Except where otherwise noted, this work is licensed under: http://creativecommons.org/licenses/by-nc-sa/3.0
  • 2. 2 Exercise: Whack-a-mole • Goal: Let's create a "whack-a-mole" game where moles pop up on screen periodically. – The user can click a mole to "whack" it. This leads to: • A sound is played. • The player gets +1 point. • A new mole appears elsewhere on the screen. • The number of points is displayed at the top of the screen.
  • 3. 3 What is pyGame? • A set of Python modules to make it easier to write games. – home page: http://pygame.org/ – documentation: http://pygame.org/docs/ref/ • pyGame helps you do the following and more: – Sophisticated 2-D graphics drawing functions – Deal with media (images, sound F/X, music) nicely – Respond to user input (keyboard, joystick, mouse) – Built-in classes to represent common game objects
  • 4. 4 pyGame at a glance • pyGame consists of many modules of code to help you: cdrom cursors display draw event font image joystick key mouse movie sndarray surfarray time transform • To use a given module, import it. For example: import pygame from pygame import * from pygame.display import *
  • 5. 5 Game fundamentals • sprites: Onscreen characters or other moving objects. • collision detection: Seeing which pairs of sprites touch. • event: An in-game action such as a mouse or key press. • event loop: Many games have an overall loop that: – waits for events to occur, updates sprites, redraws screen
  • 6. 6 A basic skeleton pygame_template.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 from pygame import * from pygame.sprite import * pygame.init() # starts up pyGame screen = display.set_mode((width, height)) display.set_caption("window title") create / set up sprites. # the overall event loop while True: e = event.wait() # pause until event occurs if e.type == QUIT: pygame.quit() # shuts down pyGame break update sprites, etc. screen.fill((255, 255, 255)) # white background display.update() # redraw screen
  • 7. 7 Initializing pyGame • To start off our game, we must pop up a graphical window. • Calling display.set_mode creates a window. – The call returns an object of type Surface, which we will call screen. We can call methods on the screen later. – Calling display.set_caption sets the window's title. from pygame import * pygame.init() # starts up pyGame screen = display.set_mode((width, height)) display.set_caption("title") ... pygame.quit()
  • 8. 8 Surfaces screen = display.set_mode((width, height)) # a surface • In Pygame, every 2D object is an object of type Surface – The screen object, each game character, images, etc. – Useful methods in each Surface object: – after changing any surfaces, must call display.update() Surface((width, height)) constructs new Surface of given size fill((red, green, blue)) paints surface in given color (rgb 0-255) get_width(), get_height() returns the dimensions of the surface get_rect() returns a Rect object representing the x/y/w/h bounding this surface blit(surface, coords) draws another surface onto this surface at the given coordinates
  • 9. 9 Sprites • Sprites: Onscreen characters or other moving objects. • A sprite has data/behavior such as: – its position and size on the screen – an image or shape for its appearance – the ability to collide with other sprites – whether it is alive or on-screen right now – might be part of certain "groups" (enemies, food, ...) • In pyGame, each type of sprite is represented as a subclass of the class pygame.sprite.Sprite
  • 10. 10 A rectangular sprite from pygame import * from pygame.sprite import * class name(Sprite): def __init__(self): # constructor Sprite.__init__(self) self.image = Surface(width, height) self.rect = Rect(leftX, topY, width, height) other methods (if any) – Important fields in every sprite: image - the image or shape to draw for this sprite (a Surface) – as with screen, you can fill this or draw things onto it rect - position and size of where to draw the sprite (a Rect) – Important methods: update, kill, alive
  • 11. 11 Rect methods * Many methods, rather than mutating, return a new rect. – To mutate, use _ip (in place) version, e.g. move_ip clip(rect) * crops this rect's size to bounds of given rect collidepoint(p) True if this Rect contains the point colliderect(rect) True if this Rect touches the rect collidelist(list) True if this Rect touches any rect in the list collidelistall(list) True if this Rect touches all rects in the list contains(rect) True if this Rect completely contains the rect copy() returns a copy of this rectangle inflate(dx, dy) * grows size of rectangle by given offsets move(dx, dy) * shifts position of rectangle by given offsets union(rect) * smallest rectangle that contains this and rect
  • 12. 12 A Sprite using an image from pygame import * from pygame.sprite import * class name(Sprite): def __init__(self): # constructor Sprite.__init__(self) self.image = image.load("filename").convert() self.rect = self.image.get_rect().move(x, y) other methods (if any) – When using an image, you load it from a file with image.load and then use its size to define the rect field – Any time you want a sprite to move on the screen, you must change the state of its rect field.
  • 13. 13 Setting up sprites • When creating a game, we think about the sprites. – What sprites are there on the screen? – What data/behavior should each one keep track of? – Are any sprites similar? (If so, maybe they share a class.) • For our Whack-a-Mole game: class Mole(Sprite): ...
  • 14. 14 Sprite groups name = Group(sprite1, sprite2, ...) – To draw sprites on screen, put them into a Group – Useful methods of each Group object: draw(surface) - draws all sprites in group on a Surface update() - calls every sprite's update method my_mole1 = Mole() # create a Mole object my_mole2 = Mole() all_sprites = Group(my_mole1, other_mole2) ... # in the event loop all_sprites.draw(screen)
  • 15. 15 Events • event-driven programming: When the overall program is a series of responses to user actions, or "events." • event loop (aka "main loop", "animation loop"): Many games have an overall loop to do the following: – wait for an event to occur, or wait a certain interval of time – update all game objects (location, etc.) – redraw the screen – repeat
  • 16. 16 The event loop – In an event loop, you wait for something to happen, and then depending on the kind of event, you process it: while True: e = event.wait() # wait for an event if e.type == QUIT: pygame.quit() # exit the game break elif e.type == type: code to handle some other type of events; elif ...
  • 17. 17 Mouse events • Mouse actions lead to events with specific types: – press button down: MOUSEBUTTONDOWN – release button: MOUSEBUTTONUP – move the cursor: MOUSEMOTION • At any point you can call mouse.get_pos() which returns the mouse's current position as an (x, y) tuple. e = event.wait() if e.type == MOUSEMOTION: pt = mouse.get_pos() x, y = pt ...
  • 18. 18 Collision detection • collision detection: Examining pairs of sprites to see if they are touching each other. – e.g. seeing whether sprites' bounding rectangles intersect – usually done after events occur, or at regular timed intervals – can be complicated and error-prone • optimizations: pruning (only comparing some sprites, not all), ...
  • 19. 19 Collisions btwn. rectangles • Recall: Each Sprite contains a Rect collision rectangle stored as a field named rect • Rect objects have useful methods for detecting collisions between the rectangle and another sprite: if sprite1.rect.colliderect(sprite2.rect): # they collide! ... collidepoint(p) returns True if this Rect contains the point colliderect(rect) returns True if this Rect touches the rect
  • 20. 20 Collisions between groups global pyGame functions to help with collisions: spritecollideany(sprite, group) – Returns True if sprite has collided with any sprite in the group spritecollide(sprite, group, kill) – Returns a list of all sprites in group that collide with sprite – If kill is True, a collision causes sprite to be deleted/killed groupcollide(group1, group2, kill1, kill2) – Returns list of all sprites in group1 that collide with group2
  • 21. 21 Drawing text: Font • Text is drawn using a Font object: name = Font(filename, size) – Pass None for the file name to use a default font. • A Font draws text as a Surface with its render method: name.render("text", True, (red, green, blue)) Example: my_font = Font(None, 16) text = my_font.render("Hello", True, (0, 0, 0))
  • 22. 22 Displaying text • A Sprite can be text by setting that text's Surface to be its .image property. Example: class Banner(Sprite): def __init__(self): my_font = Font(None, 24) self.image = my_font.render("Hello", True, (0, 0, 0)) self.rect = self.image.get_rect().move(50,70)
  • 23. 23 Exercise: Pong • Let's create a Pong game with a bouncing ball and paddles. – 800x480 screen, 10px white border around all edges – 15x15 square ball bounces off of any surface it touches – two 20x150 paddles move when holding Up/Down arrows – game displays score on top/center of screen in a 72px font
  • 24. 24 Animation • Many action games, rather than waiting for key/mouse input, have a constant animation timer. – The timer generates events at regular intervals. – On each event, we can move/update all sprites, look for collisions, and redraw the screen.
  • 25. 25 Timer events time.set_timer(USEREVENT, delayMS) • Animation is done using timers – Events that automatically occur every delayMS milliseconds; they will have a type of USEREVENT – Your event loop can check for these events. Each one is a "frame" of animation while True: e = event.wait() if e.type == USEREVENT: # the timer has ticked ...
  • 26. 26 Key presses • key presses lead to KEYDOWN and KEYUP events • key.get_pressed() returns an array of keys held down – the array indexes are constants like K_UP or K_F1 – values in the array are booleans (True means pressed) – Constants for keys: K_LEFT, K_RIGHT, K_UP, K_DOWN, K_a - K_z, K_0 - K_9, K_F1 - K_F12, K_SPACE, K_ESCAPE, K_LSHIFT, K_RSHIFT, K_LALT, K_RALT, K_LCTRL, K_RCTRL, ... keys_down = key.get_pressed() if keys_down[K_LEFT]: # left arrow is being held down ...
  • 27. 27 Updating sprites class name(Sprite): def __init__(self): ... def update(self): # right by 3px per tick self.rect = self.rect.move(3, 0) • Each sprite can have an update method that describes how to move that sprite on each timer tick. – Move a rectangle by calling its move(dx, dy) method. – Calling update on a Group updates all its sprites.
  • 28. 28 Sounds • Loading and playing a sound file: from pygame.mixer import * mixer.init() # initialize sound system mixer.stop() # silence all sounds Sound("filename").play() # play a sound • Loading and playing a music file: music.load("filename") # load bg music file music.play(loops=0) # play/loop music # (-1 loops == infinite) others: stop, pause, unpause, rewind, fadeout, queue
  • 29. 29 The sky's the limit! • pygame.org has lots of docs and examples • can download tons of existing games – run them – look at their code for ideas • if you can imagine it, you can create it!

Editor's Notes