[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[pygame] Pygame_sdl2



I mentioned this in passing a few months ago, but I think it's time to formally announce Pygame_sdl2.

Pygame_sdl2 starts with the premise that the Pygame API is important. The Pygame API has been used by thousands of games, libraries, and engines, and is being taught to beginning programmers. Preserving the Pygame API is important, as it means that those games, libraries, and engines will keep running, and those programmers' experience will not become obsolete.

At the same time, SDL2 support is beneficial for a number of reasons. SDL 1.2 is now obsolete, and has been for a while. New features, and ports to new platforms - especially the important mobile platforms - have been added to SDL2, and SDL2 only. For a while, I tried to add Android support by maintaining, as part of PGS4A, a port of SDL 1.2 to Android,
but that proved to be very difficult as mobile platforms keep evolving.

In October of last year, Patrick Dawson and myself began work on Pygame_sdl2, a reimplementation of the Pygame API using SDL2 and related libraries. The goal of the project is to allow games written to the Pygame API to run, using SDL2, on desktop and mobile platforms. We've also exposed some SDL2-provided functionality in a way that remains compatible with older code.

At least for now, Pygame_sdl2 is available at:

https://github.com/renpy/pygame_sdl2

It's been used - as part of my Ren'Py engine - to release multiple games on Windows, Mac OS X, Linux, and Android, and I've been able to get Pygame_sdl2 to run on iOS, but haven't submitted to the App Store yet. This process, which included at least one Steam release, helped to
shake out the more obvious problems.

Pygame_sdl2 is written in a mix of Python, Cython, and C. Use of the Cython code massively simplified the project - by not having to worry about the details of python bindings, we were able to get the initial version of Pygame_sdl2 running in a short amount of time. Newly-written code is licensed under SDL2's Zlib license, while the code we imported from Pygame is licensed under the LGPL. (The LGPL's terms control distribution.)

Pygame_sdl2 implements a large portion of pygame, but not all of it. Currently implemented modules are:

* pygame_sdl2.color
* pygame_sdl2.display
* pygame_sdl2.draw
* pygame_sdl2.event
* pygame_sdl2.font
* pygame_sdl2.gfxdraw
* pygame_sdl2.image
* pygame_sdl2.joystick
* pygame_sdl2.key
* pygame_sdl2.locals
* pygame_sdl2.mixer (including mixer.music)
* pygame_sdl2.mouse
* pygame_sdl2.scrap
* pygame_sdl2.sprite
* pygame_sdl2.surface
* pygame_sdl2.sysfont
* pygame_sdl2.time
* pygame_sdl2.transform
* pygame_sdl2.version

Experimental new modules include:

* pygame_sdl2.render

Current omissions include:

* Modules not listed above.

* APIs that expose pygame data as buffers or arrays.

* Support for non-32-bit surface depths. Our thinking is that 8, 16, and (to some extent) 24-bit surfaces are legacy formats, and not worth duplicating code four or more times to support. This only applies to in-memory formats - when an image of lesser color depth is loaded, it is converted to a 32-bit image.

* Support for palette functions, which only apply to 8-bit surfaces.

There are a few additions to the pygame API, including support for the application lifecycle events on Android and iOS, IME-based text input, and SDL2 renderers.


While I plan to, at the very least, maintain this indefinitely to support Ren'Py, my hope is that it could be useful to the larger Pygame community. For now, Pygame_sdl2 could probably benefit from testing, both informal reports of missing APIs and incorrect implementations, and someone helping to integrate the relevant portions of the pygame test suite.

The modules that have not been implemented are often that
way because we don't have much experience with them - for example, I've never been able to wrap my head around the <thing>array modules. So help implementing those, or porting the Pygame implementations, would be appreciated.


For now, pygame_sdl2 has been maintained as part of the Ren'Py github organization, but if there's enough interest in contributing and expanding it, it might make sense to break it out into its own project.

Anyway, thank you for reading through this message, and for trying out pygame_sdl2.