For my Masters of Interactive Technology (MIT) Thesis Project I am studying the challenges of cross platform game development for by developing a game for Microsoft Windows, Mac OSX, and Playstation 3 simultaneously and recording the time spent on each task and platform. I am currently about two-thirds of the way done with the project and it has a monumental undertaking so far. This has been mainly due to the nature of the PS3 I have been developing on.
The Guildhall does not actually have a PS3 Dev Kit, but it does have a very old PS3 that is still able to have Linux installed on it. Unfortunately, it is impossible to access the GPU from Linux except to access the frame buffer. The game I am developing is a fairly simple 2D shooter, but being able to render textures at 720p and 60 FPS has been a pretty serious endeavor. I have learned an enormous amount about utilizing the PS3’s Synergistic Processing Elements (SPEs) as well as asynchronous programming in general.
In addition to building a whole rendering framework for the PS3, I also created an audio mixer. It samples N number of WAV files at 44,100 HZ (16 bits, signed) combines them, and write them to the Linux audio device file. This was necessary because none of Linux’s audio libraries work on the PS3 (at least as far as I could tell). Right now it can play about fifteen different audio files at once before it starts to sound scratchy. All of this also happens on another thread so the audio playback should never get interrupted.
I have had a couple strategies in mind while working on this project, namely very small interfaces for the game’s core systems and data driven design. Having interfaces with very low surface area seems like a real necessity when doing cross platform, especially when one of them is as screwy as Linux on the PS3. Making everything very data driven is great in general, but especially good for me because I have a large number of assets to work with. I am using Daniel Cook’s artwork for “Tyrian,” a PC top down shooter that came out in the 90’s. I’m using a really neat tilemap editor named Tiled that exports the info into an easily parse-able format.
Additionally, I created my own system of XML definitions for specifying definitions for things like Animated Sprites, Actors, and much more. These definitions can then be used by Tiled to create spawn points for enemies. The definitions are also extensible so for instance, one enemy type could “subclass” another and double its health value, and change its weapon type and animation but leave everything else the same.
<Bullet id="PlayerBullet" extends="Bullet" > <abstract/> <maxVelocity type="number" >800 </maxVelocity> <mass type="number" >10 </mass> <radius type="number" >8 </radius> <sizeWorldSpace type="vector" >12 12</sizeWorldSpace> <collisionChannel type="string">playerbullet </collisionChannel> <collidesWith type="list" subtype="string" > <channel>enemy</channel> </collidesWith> </Bullet> <Bullet id="PhoenixBullet" extends="PlayerBullet" > <Damage type="number" >1</Damage> <sprite id="PhoenixBulletSprite" extends="BulletSprite" > <animation id="PhoenixBulletAnim" extends="BulletAnim" > <default/> <frames type="list" subtype="vector" > <frame>0 16</frame> </frames> </animation> </sprite> </Bullet>
The theory is that since I’m just one person with a lot of assets, making a system that is streamlined and flexible for adding content will pay off big time in the long run.