Aurélien Gâteau

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.


written on Friday, February 9, 2018

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 Qt Screenshot

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!

Pixel Wheels 0.6.0!

written on Saturday, February 3, 2018

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.

Pixel Wheels

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 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!

Tiny Wheels 0.5.0, the last Tiny Wheels?

written on Friday, January 5, 2018

Welcome to 2018! To celebrate this new year, here is a new release of Tiny Wheels!

What's new?

The focus for this version was the user interface.

The game UI has been revamped, with big buttons and a checkerboard background. This new UI is more keyboard friendly: almost all screens can be navigated using the arrow keys. I still need to convert the high-score and developer options screens. This is an important step for gamepad support, which I want to work on soon.

I am not entirely sold on the purple for the buttons, so this might change again.

Title screen

The HUD received some love too: the rank text is bigger, making it easy to check your position at a glance.

The Android side is where I made the most changes. On this screenshot you can see I replaced the touch buttons with pie buttons:

Touch buttons

I like this layout, but I haven't seen it in any other games, so I am interested in your feedback on them: are they convenient to use? Do you understand their function at the first sight? The left and right button icons are pretty straightforward I think, but I had a hard time coming up with icons for the "brake" and "action" buttons of the lower-right corner. Again, if you have suggestions they are more than welcome.