What is python-ps3?
Simply put, python-ps3 is a package of libraries for game development on the PS3 using the Python interpreted language. This allows game development to be carried out with an elegant and easy to learn language, yet still retains good performance as the complicated graphics tasks are handled in the background by the PS3's processor's secret weapon - the 6 SPU cores.
Unfortunately, despite the obviously immense power offered by the PS3, Sony have restricted access to the RSX (or graphics chip), so that the normal route for fast graphics is reserved for those wishing to purchase an official development kit, which is well out of the price range of most hobby developers (including me). All is not lost, however, because the Other OS environment does have some access to the graphics card - via a block of memory which is directly mapped to the screen. Normally, this method wouldn't even be considered for games due to speed issues, with the extra processing power available to the PS3, it's possible to do almost all the rendering tasks on the SPUs putting almost no load on the main processor. As a result, once python-ps3 is running, about 90% of the 3.0GHz PPC processor is available. So, whilst interpreted languages are obviously nowhere near as fast as compiled languages, there's still more than enough time left over to run a decent game!
You might wonder why I didn't try to get pygame working on the PS3 instead of writing my own library. Well, actually, I thougt of that (and actually, it does work... just painfully slowly!) The main problem is that pygame is built upon SDL which in turn uses libraries such as OpenGL, and so there was a lot of work to achieve that goal, and in all likelihood some games would work and others wouldn't. I decided to start from scratch, and this has allowed for some unique features that pygame doesn't support - realtime mixing of as many sound effects as you like, for example.
So, what do I need?
Pretty much, the requirements are just a PS3, another computer to develop on, some technical knowledge and a willingness to learn a bit, specifically about Linux. My distribution of choice is Ubuntu, and if you've installed Ubuntu on your PS3 (which is a fairly simple task), you can pretty much just download python-ps3 and be running within a few minutes.
Obviously, there are some issues. Older versions of the Linux kernel don't support wireless controllers and some very new kernel versions have removed support for double buffered graphics. But, on the whole, it's relatively easy if you're prepared to learn a little.
I have plans to provide a base CD image, so that python-ps3 games can be overlaid to form a ready-to-run CD, although this step isn't finished yet.
Having a seperate PC is very important for development; life is much easier if you use Linux on this too, but that's less important. But certainly, it's impossible to develop directly on the PS3 for the simple reason that the python-ps3 library takes control of the screen directly. My usual development system is a ssh session to the PS3 for running programs and an editor running on the PS3 displaying on the PC using X. Another approach is to use NFS, so that you edit your source directly on your PC and the PS3 accesses it across the network.
I have settled on using WingIDE as my preferred development environment, as it offers a lot of IDE features that I've grown used to using IDEs for other languages, such as auto-completion etc. I'm working on integrating the debugging module into my PS3 setup so that I can debug code directly from the PC. Prior to that, I was using vi on an ssh session on the PS3. Use whatever you find comfortable.
What features does python-ps3 have?
- Fast SPU-based alpha-blended blitting
- Support for the PS3 controllers
- Sprite support - no need to draw every item yourself in the main loop
- Flexible sound support - multiple sound effects and music can be played simultaneously
- Integration with PIL for image manipulation and text rendering
Just to whet your interest, here's a simple example of how easy it is to draw an image onto the screen (taken directly from the test.py file):
image = Blittable(Image.open("miglu.jpg")) for count in xrange(screen.height-image.height): screen.clear() screen.blit(image, (count,count) ) screen.flip() screen.wait()
Obviously, the above example gives good control over what's actually going on, but it's quite tedious (and ugly) having to list out everything that needs to be redrawn each frame. Here's an example using the Sprite API:
# this part, creates a text sprite that we put onto the screen and forget about font = Graphics.Font("Vera.ttf", 72) text1 = Sprite(font.text("Hello", (192,64,64)), order=3, pos=(60,60)) # the parallel of the prevous example's Blittable image = Sprite(file="miglu.jpg") image.pos = (20,50) while True: for c in Control.controllers: # move the sprite (note the difference to drawing it) image.translate((c.leftx/2048, c.lefty/2048)) # throw in a quick example of the sound API if c.start and playback != None: playback.play(sound,500) # this part ensures any sprites are drawn onto the screen Graphics.render() Graphics.wait()
An easy to understand example for the sprites is clock.py - a well commented example that displays a real-time clicking clock!
A more complicated example using sprites is pubble - currently a work-in-progress writing a Puzzle Bobble style game, but as you'll notice once you've created a sprite, you can pretty much forget about it unless you want to move it around the screen. Notice also how subclasses the Sprite is used as this is the key to it all.
What else have you got planned?
There are a bunch of features I want to add soon. Here are a few of the things I'm planning:
- Animated sprites... :)
- Rotations of sprites
- Proper tiled support. That's what I was planninging when I started this project because there are certain features about tiled graphics that enable good optimisations (and I want to get some parallaxed 2D scrolling action going on!)
- Documentation :(
- Better examples - if anyone wants to write some, I'll happily include them in the distribution!
- A standardised distribution platform as a disk image that games can just be dropped on top of...
- ...and loads more