Aurélien Gâteau

Pixel Wheels 0.10.0!

written on Wednesday, September 12, 2018

Now that I am back from holidays (and from Akademy, which was awesome!), it's time to release a new version of Pixel Wheels!

Here are the major changes coming with this release.

I am going to Akademy!

written on Tuesday, August 7, 2018

So after a (too long) break, I am going back to Akademy this year! Having been away from KDE work for a while now, this will be the first time I attend the conference as a user. It's going to be interesting to see how this feels. In any case, I am looking forward to the sessions and to catching up with old friends.

PixelWheels 0.9.0, the one with gamepad support

written on Wednesday, July 4, 2018

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.

Working around ListModel limitations

written on Friday, June 15, 2018

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:

import QtQuick 2.9
import QtQuick.Window 2.2

Window {
    visible: true

    ListModel {
        id: speedModel
        ListElement {
            name: "Turtle"
            speed: slowSpeed()
        ListElement {
            name: "Rabbit"
            speed: highSpeed()

    Column {
        Repeater {
            model: speedModel
            Text {
                text: + " " + model.speed

    function slowSpeed() {
        return 12;

    function highSpeed() {
        return 42;

Running this will fail with that error message: "ListElement: cannot use script for property value".

Doxyqml 0.4.0

written on Saturday, May 19, 2018

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.

Pixel Wheels 0.8.0, featuring championships!

written on Tuesday, May 8, 2018

Time for a new release of Pixel Wheels!

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.

3... 2...

Pixel Wheels 0.7.0 is out!

written on Monday, April 2, 2018

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!

Let it Snow

  • 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.


written on Friday, March 30, 2018

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.

SFXR Qt noise buffer

written on Friday, February 16, 2018

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.

Initial investigation

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.