This took way too long, but I finally found the time to release PixelWheels 0.9.0. I spent most of my time on improving input handling code to add gamepad support, especially the UI part. Gamepad support while racing pretty much worked out of the box after that.
When you write code in QML, ListModel is a handy class to quickly populate a list with data. It has a serious limitation though: the values of its elements cannot be the result of a function. This means you cannot write this:
After almost two years, here comes a new version of Doxyqml, the QML filter for Doxygen. This new version adds a new command-line option: --namespace to wrap the generated C++ in a namespace, and makes the parser more robust. Nothing ground-breaking, but some nice changes nevertheless.
Version 0.8.0 brings an important change: Championships! A championship is defined as a set of races, and you accumulate points through the races. This is still pretty rough: since there are 4 tracks in the game at the moment, they have been grouped in 2 championships of 2 tracks each.
In the not-so-distant future, I plan to require completing a championship with a rank of at least 3 to unlock the other one(s). Kind of like a certain plumber karting game...
Also, I added a 3 second countdown at the start of each race, so you can prepare for the race.
Due to holidays and not having much ready to publish, I did not make a release of Pixel Wheels for February, but here is 0.7.0, March release!
What's new in this one? A bunch of things:
A new snow race. It's full of icy patches, be careful!
The rescue helicopter now has a sound, but if you don't like Pixel Wheels sounds, you can now mute them from the Settings screen.
Bots have finally learned how to use the reverse gear to unblock themselves, you won't be able to score easy wins because they got stuck against a wall.
I made the vehicles a bit slower, they should be easier to handle now, especially on Android.
The Android icon was a bit crude, so I drew another one:
I also fixed a bunch of bugs:
Sometimes skid marks would be kept from one race to another, this is no longer the case.
There was a few holes around bridges on the "Tiny sur Mer" map. They have been closed.
There were also a few internal changes:
libgdx has been updated to 1.7.2.
Code is now grouped into packages, making it a little less messy!
The update to libgdx 1.7.2 required an update of my fork of MapPacker, but instead I decided to use the maps directly instead of pre-processing them to load them through AtlasTmxMapLoader. This means there is no more MapPacker fork in the code and no need to run it before testing a map, just save from Tiled and run the game.
One of the reasons this release took so long is I struggled a lot with drawing the icy patches, but even more with the pine trees, which I did not like, so I started to redo them, but could not achieve something pleasing, it was starting to be depressing.
CMake reference documentation is built inside the cmake binary itself, accessible through --help-* options. This is useful, but not really practical: you have to remember the exact command name, and pipe the output to a pager. I wanted something more user (or developer) friendly.
I was working on adding sounds to Pixel Wheels rescue helicopter, so I started SFXR Qt and after a few experiments I came up with a decent sound. Unfortunately it did not sound that good in the game. It was much more dull than in the app. Listening again to the sound in SFXR Qt I realized there were subtle variations between each plays, which made the sound more interesting.
At first I was puzzled, how could the sound differ from play to play? After a more thorough code inspection I found the culprit: the noise buffer. When you select a noise wave form, the app generates a 32 item long array of random floats between -1 and 1, and go through it in a "segment" (a sound can be made of multiple segments). When a new segment starts, the buffer is regenerated, causing the sound to be subtly different each time it is repeated.
Let's make it sound dull
I want SFXR Qt sounds to sound like they are going to sound in the game, so I set out to get rid of those variations.
I picked the sound created the first time you click on the "Explosion" generator button as my guinea pig. It sounds like this:
My first fix attempt was to create a long buffer with as many items as there are samples in the sound, and reuse it as the sound was being replayed. That failed: the noise was much more high pitched.
As I mentioned in my previous article about adding sounds to Pixel Wheels, I started yet-another side project: SFXR Qt. This is a QtQuick port of SFXR, a retro sound-effect generator by DrPetter.
SFXR is a fun way to quickly generate old-school sound effects for your game, even if you are not a sound engineer. The generator buttons in the top-left area give you good starting points to create various sounds, and you can fiddle with the various sliders to adjust the sound to your liking.
There are many forks/ports of SFXR, why another one?
I started the port for a few reasons:
First, the current UI is hard to use: something is wrong with the sliders, they do not follow the mouse. The UI is also super small on a HD screen.
Second, the other ports are all Flash-based, which I am not comfortable relying on.
But more important: I wanted to dive into sound generation a bit, and it was a fun way to get into this!
Here comes a new release of Tiny, err, Pixel Wheels!
The first main topic of this release is of course, the renaming of the game to Pixel Wheels, as announced earlier.
The second main topic is sound effects. It was high time to work on sound effects because adding sound to your game tend to be very invasive for the code base, so the earlier the sound architecture is in, the better. I probably should have done it earlier, but luckily it was not too much of a pain to get it in.
Implementing sound in the code base is actually only half of the work. The other half is producing or finding good sounds. If you are not careful you can easily spent ours browsing OpenGameArt.org sound sections or Freesound. I actually took another approach, more compatible with the fact that I do most of my work offline, in the train: I used sfxr, a wonderful and fun tool by DrPetter to generate game sound effects. The user interface was a bit tedious to use, though, so I spent some time porting sfxr to QtQuick. You can find the end result in the SFXR Qt repository... Yay, another side project!