The Open-Source Game Development Pipeline

Providing the means and education to create games using free/libre open-source tools.


Leave a comment

The Pipeline: An Overview

Good evening!

So, as you may have already noticed, the title of this Blog is “The Open-Source Game Development Pipeline”. Tonight, in this article, I’m going to talk about the actual pipeline.

There are three major components to creating a game: Audio, Image Assets, and a Game Engine to house and utilize them.

I’ve already mentioned various packages in one of my previous articles, and you’re going to need to learn how to use them if you want to make games!

So, let’s talk about the applications you’ll be using to create a game.

~AUDIO~

Linux is unique when it comes to sound design. JACK (package name “jackd”) is the standard audio interface for having your audio applications communicate with any internal/external sources. Learning how JACK works (which the “qjackctl” package can assist you with) will give you an advantage if you’re just starting out.

You’ll find (as you continue using Linux) that there are very few audio applications that can “do it all”. Most applications excel specifically at one thing. Take Hydrogen (package name “hydrogen”) for example. Hydrogen is an application that is purpose-built for creating beats using different sets of instruments. As a drum-machine, it can’t be beat (no pun intended), but creating an enticing percussive rhythm is just one part of a musical composition (unless that’s all you’re looking to do, then, hey, kudos!). There’s also melody and harmony, and there are other applications that excel in this department.

There are three applications that I’d specifically recommend for those of you who happen to be passionate musicians. They are: Linux MultiMedia Studio (package name “lmms”), Qtractor (package name “qtractor”), and Ecasound (package name “ecasound”). Both LMMS (I’ll be using the abbreviation for the rest of the article) and Qtractor are DAWs (Digital Audio Workstation), and have an interface built to handle most of the heavy-duty requirements needed by any serious sound designer. LMMS has the added benefit of having a beat-mixer built into it as well, potentially mitigating the need to use Hydrogen. But, since Hydrogen already has so much depth, those who need that much control will use it. Ecasound will cater specifically to musicians who want to rip sound directly from an instrument they’ve plugged into their computer. The application is run from the command-line, but is easy enough to figure out if you use the “-help” command. You should pair your usage of this application with Audacity (package name “audacity”) for any post-processing or editing needs.

Note: Downloading the CALF Plugins (package name “calf-plugins”) will give you some additional LV2 effects/instruments you can use inside of QTractor. This package also interfaces with JACK, for those of you who would like to do direct hardware recording via Ecasound.

~GRAPHICS~

So, unless you’re creating a command-line game, you’ll probably want to display some sort of visual content inside of its own window. In that case, you’re going to need tools to help create it.

Blender (package name “blender”) is a 3D modeller and animation tool you can use to create 3D characters/scenes/objects for your game. Paired up with GIMP (package name “gimp”), you can create nice textures to map onto your 3D shapes. If you prefer a more cell-shaded/vector art look, one could always use Inkscape (package name “inkscape”) to achieve those results.

~ENGINE~

I’ve done my fair share of homework over which tools to use to create my game, and in the end, I’ve chosen to use libraries that are either BSD, MIT, Apache 2.0, or zlib licensed. The reason for this is to make sure I can make money off of my game if I want to, and also not step on anybody’s toes for using their tools. Out of respect for the licenses themselves, I will be including a description of each inside a text file called “LICENSE”, which will be housed in the application’s root directory for users to see.

There are capabilities the engine will need to have in order to effectively deliver various types of game-play experiences. Here’s a list of some that I consider to be the most important (ordered appropriately):

-3D/2D rendering (fast, preferably)

-3D and 2D audio

-Joystick input

-Physics simulation

-Threading interface

-Networking interface

I’m currently looking into using “Irrlicht” for the graphical/input requirements of the game engine. Since Irrlicht has OpenGL and SDL integrated within it, the input interface has already been properly abstracted for you. In other words, using Irrlicht allows you to kill 2 birds with one stone… so why not?

Next on the list, allow me to explain the difference between two-dimensional and three-dimensional audio. Ambient noise, or background music, are examples of sound that occupy a static portion of the soundscape, and typically don’t need any depth added to them (or, in some cases, it’s already been added when the audio files were created). If I were making a game about war, though, and my player character was a soldier traversing a battlefield while under heavy enemy fire, I would need three-dimensional audio to simulate the different positions of gunfire (or fired mortar shells, for instance). This would require an API (Application Programming Interface) which could achieve that effect. Thankfully, there’s already a handy wrapper around OpenAL Soft called “TinyOAL” “cAudio” which I will be using to create 3D audio.

Next on the list is input. As I stated before, SDL handles this for us, so no need to go into detail there. SDL also comes with a cross-platform threading interface built-in, so I won’t have to worry about that either (now we’re up to three birds). Thanks, Irrlicht! I’ll need to do some more homework on whether or not Irrlicht will let you expose the SDL layer it uses for input and see if it also gives you access to threads. Otherwise, we may have to look into using PThreads… >_>

Now that leaves us with Physics simulation and Networking. As far as C++ goes, I’m new to programming with both of these, so I plan on giving Bullet a try and seeing how that plays out. As for networking, there are several high-level wrappers (nested above BSD socket interfaces) that should provide me with an easy way to connect to a remote server. As of now, I’m undecided if this functionality is really necessary for what I’d like to do… so, I’m going to put it on the shelf for the time being.

As stated in the title, this is just an overview. Each of these subjects require much more emphasis in order to be truly helpful.

In spite of that, however, I hope what I’ve written is enough to whet your appetite! If something doesn’t make sense, look it up! Web-searching is your friend. 🙂

That’s it for now! Please reach out if you have any questions or require further guidance. See you next time.


Leave a comment

Update: 5-19-14

Hello!

Just wanted to give a quick to update to anybody who may be reading this blog.

Right now I’m trying to hunker down and create a game specifically for Linux platforms that support X11. As a result, I may not be posting articles for a while. If you’ve read my previous posts and have questions about further reading (or anything else related to Linux game development) don’t hesitate to reach out.

In the meantime, good luck! Adieu!


Leave a comment

Let’s Talk Hardware: An Appeal to Your Purse Strings

Good evening.

I am writing this to ask that you please make a donation to OpenCores.

Why donate? I’ll explain:

First, imagine being a painter.

Now, imagine being a painter and being able to sketch your idea for a painting.

Now, further imagine being able to sketch your idea for a painting, but never being able to paint it upon a canvas because all of the paints cost a colossal amount of money to manufacture by yourself (even though the materials needed to make them are some of the most commonly-found in the universe), and only a handful of organizations possess the proper resources to do so. Sucks, right?

This is the dilemma that currently faces the computer hardware industry, and the peril of any engineer who is eager to design their own computer circuits.

Donating to OpenCores will enable the current and future generation(s) to be able to have a voice and an avenue of expression within the realm of computer hardware. By donating, you are helping to build an open-source infrastructure designed to let people in, instead of keeping them out. Your contribution will lead to inexpensive components for those who like to build their own computers, and give others the freedom to try their hand at computer hardware design.

Please donate whatever you can to help get this ball rolling. The organization has been patiently waiting for several years to get this initiative off the ground. Be part of something bigger than yourself: Donate today!

Thank you.

~EDIT: 6-9-14~

It seems I was mistaken. The company that runs OpenCores, ORSoC, apparently took the money and ran with it; never giving the community any acknowledgement of where the funds went, or if anything came of their efforts.

If anybody wants to start a genuine Open-Source Hardware movement, let me know.

I’m still investigating other groups committed to Open Hardware and will keep you updated if I find somebody worth checking out.

Cheers.


Leave a comment

Package Delivery Made Simple: In 30 Minutes or Less

Howdy, readers!

Time to write about the Debian packaging system and how to make your Linux experience a lot easier to manage.

For those of you who don’t already know, whenever you use a Linux distribution like Debian/Ubuntu/Red Hat/Fedora/et al., you utilize that version’s package manager to download and install applications. All of the packages stored in their remote repositories are free. I don’t think I’ve ever encountered a “paid package”, and I think the community would deem that an oxymoron.

When you first installed a flavor of Linux onto your computer, there should have been a prompt which asked you to set your sources. These sources concern which remote repository to target for downloading and installing future software packages. Since I’m using a Vanilla version of Debian “Jessie”, I personally use “ftp.debian.org”, and in my experience this has been the most stable. You can browse the list of available sources during installation and choose another if you’d like, or you can perform a quick web search to see what the community recommends.

(Note: You can also perform a system-defined sources optimization with netselect-apt, if you’re using Debian.)

So, how do we actually get these so-called “packages” onto our computer? Well, I’ll tell you:

Open up the Terminal (different window managers have different names for it) and you’ll be presented with a very simple command-line interface. Inside you should see your user name on the upper left followed by a blinking cursor. Type in the words:

“sudo apt-get install <package_name>”

To install the proper package. Substitute the “<package_name>” for the name of the actual package. Since I mentioned installing applications to assist with game development, here are some I’d recommend downloading.

Graphics:

-“blender” (An open-source 3D modeling/animation program. As of version 2.5, has a much-improved user interface.)

-“gimp” (An open-source 2D graphical drawing tool. This is your free version of Photoshop.)

-“inkscape” (An open-source 2D vector-graphic drawing tool. This is your free version of Illustrator.)

Audio:

-“audacity” (An open-source Audio Recording/Editing utility. Useful for careful editing of new/recorded tracks.)

-“hydrogen” (A very comprehensive drum machine. Allows users to create their own beats using a series of different built-in instruments in tandem with different tempos and time signatures.)

-“qtractor” (A full-fledged Digital Audio Workstation. Works with JACK to record and produce different types of audio.)

-“jackd” (A low-latency audio server. Useful for managing multiple audio sources and/or connecting external peripherals to your machine.)

-“qjackctl” (A GUI frontend for the JACK audio toolkit.)

-“fluidsynth” (A SoundFont processor that enables the user to utilize “.SF2” files in order to create music using virtual instruments. I’ll talk about composing with soundfonts in another article.)

-“zynaddsubfx” (A collection of different software synthesizers with built-in audio effects to compose a wide-range of music.)

-“calf-plugins” (A collection of useful plugins for creating music or adding effects to already existing audio.)

-“ecasound” (A hardware disk recorder. Combined with a virtual or physical keyboard, this software will allow you to record directly to your machine.)

-“seq24” (A loop-based MIDI sequencer. Good for people who like to create series of small loops and blend them together into a much larger composition.)

Programming:

-“g++” (The GNU C++ Compiler.)

-“CMake” (The CMake build/configuration tool. This will be necessary for compiling/building software source.)

-“eclipse-cdt” (An open-source C++ Integrated Development Environment that is innately extensible. The version of the JAVA runtime it uses is completely open-source as well.)

-“libsdl-dev” (Version 1.2 of the Simple DirectMedia Layer, an abstraction of lower-level multimedia APIs.)

-“libsdl2-dev” (Version 2.0+ of the Simple DirectMedia Layer, which has a more permissive open-source license.)

-“mesa-utils” (Mesa is the Linux implementation of OpenGL. It should already be installed, but, better safe than sorry.)

I may need to update this list later, but these software packages should give you a solid foundation for creating 2D/3D graphics, producing audio/music, and building a game engine to house all of your components/assets. You may notice that some of these packages may have already been installed by default, either during the operating-system’s installation process, or though the installation of other packages. In any case, if you’re curious about how updated your software is, you can always look at the Debian package-repository website and browse.

Note that, more often than not, the Advanced Packaging Tool (the “apt” in “apt-get”) may install additional packages as dependencies for the software you’re using. This is normal. Don’t hesitate to look up those packages on the Debian package website I linked above to understand what they are and their purpose.

(Note that, since I recommended that you install Debian “Jessie”, you’ll want to browse for packages in the “testing” sub-section of the website. “Jessie” is the name of Debian’s testing environment.)

Okay, here’s another use-case for you:

What if… you have a perfectly good Debian installation running, have some stable packages installed, and, suddenly… the developers release a new, better version of that software?

It may take a while for a member of the Debian community to get that new version inside the Debian repositories. So, what’s an eager developer to do?

This is where compiling your applications from source comes in, which is another benefit of being part of the open-source community!

Chances are, you won’t have a pre-compiled binary available to download and immediately use… but! Most of the time, the developers of that software will release the source for your own personal use.

Let’s take Linux MultiMedia Studio (package name “lmms”) as an example.

Linux MultiMedia Studio is a full-featured Digital Audio Workstation on-par with the likes of Apple’s Logic Pro, but with the simple interface of their Garageband audio software. As of the writing of this article, version 1.0.0 has been released (it was previously in beta-testing). Since I’m using the Jessie environment for my Debian installation, I am unable to download it directly to my machine via the “apt-get” utility. However, I can download the 1.0.0 source code and compile it on my own. So, let’s do it!

First, download the source here. (Look for the link that says “Latest Stable Release”, and then download the “tar.gz” file.)

Next, we need to open our file manager and navigate to the “Downloads” folder where we can open and unzip the tarball archive.

Next, checkout this link and make sure you have the following software packages installed. More often than not, they are dependencies for the application, with only a few being optional.

The link also contains a compilation tutorial which is pretty thorough, however, I would recommend making a change during step 4.

Instead of setting your DC_MAKE_INSTALL_PREFIX to “../target”, I would recommend setting it instead to: “/usr/”.

The reason for this is because making that change will force the installer to follow the standard installation path of the majority of software already installed on your system. The benefit from this is that it will make file-system navigation much more intuitive (in case you ever need to make any edits to folders or files).

Once you have compiled and successfully installed LMMS, you can access it through your desktop’s application menu, or by typing “lmms” inside the terminal.

Whew!

Well, that’s a lot of writing for one post. I hope all of this was helpful. In future articles, I’ll make sure to go over the different parts of the pipeline (graphics, audio, programming) in more detail. As for now, explore the packages you’ve already downloaded and start poking around. Don’t hesitate to drop me a line if you have any questions!

See you next time!