Pygame
Python module for writing video games
- 4 min read
- 6 chapters
Related on Lably
Through Python (programming language), Library (computing) and Open-source software
History
Pygame was originally written by Pete Shinners to replace PySDL after its development stalled. It has been a community project since 2000 and is released under the free software GNU Lesser General Public License (which "provides for Pygame to be distributed with open source and commercial software").
Sign in to keep reading
5 more chapters are free with a Lably account.
Development of version 2
Pygame version 2 was planned as "Pygame Reloaded" in 2009, but development and maintenance of Pygame completely stopped until the end of 2016 with version 1.9.1. After the release of version 1.9.5 in March 2019, development of a new version 2 was active on the roadmap.
Pygame 2.0 released on 28 October 2020, Pygame's 20th anniversary.
Features
Core Features
Pygame uses the Simple DirectMedia Layer (SDL) library, with the intention of allowing real-time computer game development without the low-level mechanics of the C programming language and its derivatives. This is based on the assumption that the most expensive functions inside games can be abstracted from the game logic, making it possible to use a high-level programming language, such as Python, to structure the game.
Other features that SDL does have include vector math, collision detection, 2D sprite scene graph management, MIDI support, camera, pixel-array manipulation, transformations, filtering, advanced freetype font support, and drawing.
SDL also supports audio, which Pygame exposes via the Mixer module.
Applications using Pygame can run on Android phones and tablets with the use of Pygame Subset for Android (pgs4a). Sound, vibration, keyboard, and accelerometer are supported on Android.
Pygame Community Edition
Following disagreements between former core developers and the repository owner, a fork known as pygame-ce (Community Edition) was created.
This fork was originally created as a means to add several features that were, at the time, wanted but missing in the core release of Pygame. These features include support for Python 3.11, faster surface blitting, support for WebAssembly (WASM), and several smaller optimizations and feature additions. This fork also commenced a new, more democratic governing body for pygame-ce aimed at solving the approval slowdowns present in the core version.
Since this initial release, the community edition has added several new features not present in the core version, including support for the latest versions of Python (all the way up to 3.15), and continued optimizations. Ongoing work incudes migrating the community edition to run on SDL3, which as the team notes, primarily differs in interface from its predecessor, SDL2, in how it handles audio.
Community
There is a regular competition, called PyWeek, to write games using Python (and usually but not necessarily, Pygame). The community has created many tutorials for Pygame.
Pygame also has a community-led subreddit on Reddit, where developers post their creations and ideas, and a Discord community server, where people discuss various aspects of the platform.
Sample code
The following code makes an image of a raccoon ("raccoon.png") bounce when hitting an edge.
<span id="mwyQ"></span><span class="kn" id="mwyg">import</span><span class="w" id="mwyw"> </span><span class="nn" id="mwzA">pygame</span><span class="o" id="mwzQ">,</span><span class="w" id="mwzg"> </span><span class="nn" id="mwzw">sys</span> <span class="n" id="mw0A">pygame</span><span class="o" id="mw0Q">.</span><span class="n" id="mw0g">init</span><span class="p" id="mw0w">()</span> <span class="n" id="mw1A">screen</span> <span class="o" id="mw1Q">=</span> <span class="n" id="mw1g">pygame</span><span class="o" id="mw1w">.</span><span class="n" id="mw2A">display</span><span class="o" id="mw2Q">.</span><span class="n" id="mw2g">set_mode</span><span class="p" id="mw2w">((</span><span class="mi" id="mw3A">1280</span><span class="p" id="mw3Q">,</span> <span class="mi" id="mw3g">720</span><span class="p" id="mw3w">))</span> <span class="n" id="mw4A">clock</span> <span class="o" id="mw4Q">=</span> <span class="n" id="mw4g">pygame</span><span class="o" id="mw4w">.</span><span class="n" id="mw5A">time</span><span class="o" id="mw5Q">.</span><span class="n" id="mw5g">Clock</span><span class="p" id="mw5w">()</span> <span class="n" id="mw6A">clock</span><span class="o" id="mw6Q">.</span><span class="n" id="mw6g">tick</span><span class="p" id="mw6w">(</span><span class="mi" id="mw7A">30</span><span class="p" id="mw7Q">)</span> <span class="n" id="mw7g">black</span> <span class="o" id="mw7w">=</span> <span class="mi" id="mw8A">0</span><span class="p" id="mw8Q">,</span> <span class="mi" id="mw8g">0</span><span class="p" id="mw8w">,</span> <span class="mi" id="mw9A">0</span> <span class="n" id="mw9Q">raccoon</span> <span class="o" id="mw9g">=</span> <span class="n" id="mw9w">pygame</span><span class="o" id="mw-A">.</span><span class="n" id="mw-Q">image</span><span class="o" id="mw-g">.</span><span class="n" id="mw-w">load</span><span class="p" id="mw_A">(</span><span class="s2" id="mw_Q">"raccoon.png"</span><span class="p" id="mw_g">)</span> <span class="n" id="mw_w">raccoon</span> <span class="o" id="mwAQA">=</span> <span class="n" id="mwAQE">pygame</span><span class="o" id="mwAQI">.</span><span class="n" id="mwAQM">transform</span><span class="o" id="mwAQQ">.</span><span class="n" id="mwAQU">scale</span><span class="p" id="mwAQY">(</span><span class="n" id="mwAQc">raccoon</span><span class="p" id="mwAQg">,</span> <span class="p" id="mwAQk">(</span><span class="mi" id="mwAQo">200</span><span class="p" id="mwAQs">,</span> <span class="mi" id="mwAQw">140</span><span class="p" id="mwAQ0">))</span> <span class="n" id="mwAQ4">raccoonrect</span> <span class="o" id="mwAQ8">=</span> <span class="n" id="mwARA">raccoon</span><span class="o" id="mwARE">.</span><span class="n" id="mwARI">get_rect</span><span class="p" id="mwARM">()</span> <span class="n" id="mwARQ">velocity</span> <span class="o" id="mwARU">=</span> <span class="p" id="mwARY">[</span><span class="mi" id="mwARc">1</span><span class="p" id="mwARg">,</span> <span class="mi" id="mwARk">1</span><span class="p" id="mwARo">]</span> <span class="k" id="mwARs">while</span> <span class="kc" id="mwARw">True</span><span class="p" id="mwAR0">:</span> <span class="n" id="mwAR4">raccoonrect</span> <span class="o" id="mwAR8">=</span> <span class="n" id="mwASA">raccoonrect</span><span class="o" id="mwASE">.</span><span class="n" id="mwASI">move</span><span class="p" id="mwASM">(</span><span class="n" id="mwASQ">velocity</span><span class="p" id="mwASU">)</span> <span class="k" id="mwASY">if</span> <span class="n" id="mwASc">raccoonrect</span><span class="o" id="mwASg">.</span><span class="n" id="mwASk">left</span> <span class="o" id="mwASo"><</span> <span class="mi" id="mwASs">0</span> <span class="ow" id="mwASw">or</span> <span class="n" id="mwAS0">raccoonrect</span><span class="o" id="mwAS4">.</span><span class="n" id="mwAS8">right</span> <span class="o" id="mwATA">></span> <span class="mi" id="mwATE">1280</span><span class="p" id="mwATI">:</span> <span class="n" id="mwATM">velocity</span><span class="p" id="mwATQ">[</span><span class="mi" id="mwATU">0</span><span class="p" id="mwATY">]</span> <span class="o" id="mwATc">=</span> <span class="o" id="mwATg">-</span><span class="n" id="mwATk">velocity</span><span class="p" id="mwATo">[</span><span class="mi" id="mwATs">0</span><span class="p" id="mwATw">]</span> <span class="n" id="mwAT0">raccoon</span> <span class="o" id="mwAT4">=</span> <span class="n" id="mwAT8">pygame</span><span class="o" id="mwAUA">.</span><span class="n" id="mwAUE">transform</span><span class="o" id="mwAUI">.</span><span class="n" id="mwAUM">flip</span><span class="p" id="mwAUQ">(</span><span class="n" id="mwAUU">raccoon</span><span class="p" id="mwAUY">,</span> <span class="kc" id="mwAUc">True</span><span class="p" id="mwAUg">,</span> <span class="kc" id="mwAUk">False</span><span class="p" id="mwAUo">)</span> <span class="k" id="mwAUs">if</span> <span class="n" id="mwAUw">raccoonrect</span><span class="o" id="mwAU0">.</span><span class="n" id="mwAU4">top</span> <span class="o" id="mwAU8"><</span> <span class="mi" id="mwAVA">0</span> <span class="ow" id="mwAVE">or</span> <span class="n" id="mwAVI">raccoonrect</span><span class="o" id="mwAVM">.</span><span class="n" id="mwAVQ">bottom</span> <span class="o" id="mwAVU">></span> <span class="mi" id="mwAVY">720</span><span class="p" id="mwAVc">:</span> <span class="n" id="mwAVg">velocity</span><span class="p" id="mwAVk">[</span><span class="mi" id="mwAVo">1</span><span class="p" id="mwAVs">]</span> <span class="o" id="mwAVw">=</span> <span class="o" id="mwAV0">-</span><span class="n" id="mwAV4">velocity</span><span class="p" id="mwAV8">[</span><span class="mi" id="mwAWA">1</span><span class="p" id="mwAWE">]</span> <span class="k" id="mwAWI">for</span> <span class="n" id="mwAWM">event</span> <span class="ow" id="mwAWQ">in</span> <span class="n" id="mwAWU">pygame</span><span class="o" id="mwAWY">.</span><span class="n" id="mwAWc">event</span><span class="o" id="mwAWg">.</span><span class="n" id="mwAWk">get</span><span class="p" id="mwAWo">():</span> <span class="k" id="mwAWs">if</span> <span class="n" id="mwAWw">event</span><span class="o" id="mwAW0">.</span><span class="n" id="mwAW4">type</span> <span class="o" id="mwAW8">==</span> <span class="n" id="mwAXA">pygame</span><span class="o" id="mwAXE">.</span><span class="n" id="mwAXI">QUIT</span><span class="p" id="mwAXM">:</span> <span class="n" id="mwAXQ">sys</span><span class="o" id="mwAXU">.</span><span class="n" id="mwAXY">exit</span><span class="p" id="mwAXc">()</span> <span class="c1" id="mwAXg"># screen update</span> <span class="n" id="mwAXk">screen</span><span class="o" id="mwAXo">.</span><span class="n" id="mwAXs">fill</span><span class="p" id="mwAXw">(</span><span class="n" id="mwAX0">black</span><span class="p" id="mwAX4">)</span> <span class="n" id="mwAX8">screen</span><span class="o" id="mwAYA">.</span><span class="n" id="mwAYE">blit</span><span class="p" id="mwAYI">(</span><span class="n" id="mwAYM">raccoon</span><span class="p" id="mwAYQ">,</span> <span class="n" id="mwAYU">raccoonrect</span><span class="p" id="mwAYY">)</span> <span class="n" id="mwAYc">pygame</span><span class="o" id="mwAYg">.</span><span class="n" id="mwAYk">display</span><span class="o" id="mwAYo">.</span><span class="n" id="mwAYs">flip</span><span class="p" id="mwAYw">()</span>
Notable games using Pygame
- Frets on Fire
- Dangerous High School Girls in Trouble!

