Designing a C++ Property System

As I’ve been working on Devastro 2 I thought it would be great to be able to see and adjust properties of the in-game entities in the level editor.

Properties can be generic ones such as position, angle or color but there can also be ones specific only to certain types of objects – for example a “crate” object can have a (bool) property that defines if a pickup item should appear when the crate is broken. An enemy ship can have a property that defines how much damage it can take.

But how does the game know what types of objects have what properties? I guess we’ll need some kind of system for that.

A property system is a way to inspect and modify the properties of objects at runtime.

Implementing this is quite easy to do in languages such as Java or C# because reflection (aka introspection) is part of their runtimes. Also, custom annotations can be used to further describe how we want the properties to be published. But being the stubborn person I am, I’m writing this game in C++, so… how hard could it be? Maximum effort

Use cases:

  • Serialization – read/write properties to a file when saving and loading levels
  • Editing – interactively adjust properties using sliders, checkboxes etc in a GUI.
  • Debugging – inspect objects at runtime

We need to:

  • Get a list of properties for each class in the game
  • For each property, get its type, name and additional info for editing & serialization purposes
  • For a given object instance, get/set the value of each property

I defined several constraints for the system:

  • No custom preprocessing steps (looking at you, Qt)
  • No macros
  • Don’t use C++ RTTI
  • Non-invasive – objects don’t need to register or add getters/setters; this is hard to avoid completely but currently there’s only 1 line of boilerplate declaration to be added to each class
  • No runtime overhead for objects with properties (allow direct access to values when type is known)
  • Simple setup (all properties for all objects defined in single location, DRY for subclasses)

And some compromises:

  • OK to do string lookups but only when editing/loading, not in main game loop
  • Limited set of property types (int/float/bool/string/enum)
  • Limited amount of validation (can set a property to any value, object must deal with it; a value range can be defined as a hint for editor UI but is not enforced internally)

As of now the property system is up and running. Phew! I went through several iterations before settling on a design and it took a lot of effort to flesh it out for all the use cases and integrate it into the game.

Bottom line: Interesting challenge; looking forward to using Jai.

Ed Wood house

Another Blender practice session! This one took a few hours and I’m quite happy with the result.

It’s the house from the opening scene of Ed Wood.

I took two screenshots from the scene as the camera moves in towards the house.

I decided to do all my modeling based on those. I started by adding two cameras and attaching a screenshot to each of them using Blender’s “image empty” object.

Matching the camera views and the model to both screenshots at the same time was quite difficult. Matching the lighting was even harder since it’s a night scene with lightning effects.

Final result:

Reference shot #1 for comparison:

Subtle shadow mismatches show that my model isn’t 100% accurate, especially when it comes to depth. But let’s be honest, this is Ed Wood we’re talking about, so they probably had the lighting all wrong.

If I could devote any more time to this project I would probably model the terrain around the house a bit, add some trees, grass and dynamic lighting to match the movie scene. Also the texturing is pretty basic and not very accurate – another pass with manually painted details and wear & tear would be nice. Next time!

Superforce 3D render

Here’s a 3D rendering of a scene from Superforce, made with Blender. If I ever release another update (or sequel) to Superforce, I might get back to this, add some explosions & other SFX and use it as a proper cover image.

And here’s a quick animation. It’s just a concept so the 3D scene doesn’t match the screenshot but I see some potential for this kind of presentation.

Tiny Player 1.0.4

Tiny Player 1.0.4 is out now on the App Store. This version brings some minor improvements and fixes:

  • Prevent device from going to sleep mode when uploads are enabled
  • Improve sorting – case insensitive, ignore diacritics
  • Replace underscores with spaces in file and folder names
  • Avoid using Autosort for files with no album/artist info
  • Update WiFi name more quickly after opening Uploads tab (pull down to see it)
  • Improve drop area on upload webpage

Thanks for using Tiny Player.

Using a Mac? You can try Tiny Loader which makes loading music into your phone even easier.

Tiny Player 1.0.3

Tiny Player 1.0.3 is out now on the App Store. This version brings some new features and improvements:

  • Pull down playlist to see # of tracks and total duration
  • Pull down library listing to see library/folder info (# of tracks, disk space and duration)
  • Pull down upload listing to see name of WiFi network

Thanks for using Tiny Player.

tinyplayer-totalplaylist

A tiny reminder: on a Mac you can use Tiny Loader to make loading music into your phone even easier.