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.
As a little diversion from working on Superforce, I added an interactive GUI editor to NLEngine.
Pressing a hotkey anywhere in the game switches to GUI editing mode. In this mode, I can drag any GUI element around. I no longer need to re-launch the game several times and check if I’ve set the correct coordinates. I just move it around with the mouse until it looks right, then press Save and I’m done.
All in about 200 lines of code, with full undo/redo support and SQLite persistence. Glad I took the time to do this. It’s not actually super useful in Superforce because there the layouts are finalized but I’m pretty sure I’ll use it for something later. Like, for real.
Here, buttons are made aware of the GUI editing mode and will ignore input when it is enabled.
The GUI editor just handles the dragging. The layout (x, y, w, h) is then saved to disk and that’s pretty much it.
For Superforce I did the same thing. Putting extra time into making an editor is paying off. Making levels is really fun.
Superforce levels use tile-based maps with freely moving objects on top. The editor has three modes to allow me to edit everything in a single view.
Object editing mode – for placing enemies and pickups on the map. Objects can be selected and dragged around.
Tile editing mode – editing the map itself. The map is tile based. I first tried to use Tiled for editing the map but the TMX file format is too complicated for my needs and the workflow was really awkward.
Collision mask editing mode – editing materials for tiles. I can draw with a “grass” brush over one tile and all the tiles of the same type get updated instantly. The mask is used for collision detection (water vs. terrain) and also for creating visual effects. Bullets hitting water create a little splash; when they hit grass, a little bit of dirt flies up; hitting a metal object creates sparks etc.
Pressing “P” switches into playing mode, so I can playtest immediately. ESC resets the game and goes back to editing mode.
The user interface is based on the IMGUI concept: all UI elements are rendered and evaluated at the same time and it’s all done on each frame. There are buttons, lists, draggable items, multi-selection for objects, undo/redo, native Mac OS X dialogs for saving, keyboard shortcuts etc.
Here’s a little feature from Superforce that I really like. It saves me a lot of time during development.
Going through half a level just to get to the enemy that I’m working on? Boring. I really need to launch the game and see results immediately.
To do that in Superforce I have a special mode which I call The Construct.
You could also call it “The Playground” or “The Firing Range” or whatever.
It’s an empty level with just the things I need at the moment. It runs the standard game loop and renders everything just like the game itself. In addition to that, it has special functions I can use to manipulate the game objects in various ways.
For example, when working on a tank, I can move the mouse cursor around to make the tank aim at a particular spot, press a mouse button to make it fire and press SPACE to make the tank explode. Pressing SPACE again spawns a new tank. Fun!
I have a working build of Superforce running on Mac OS X. Am I going to release it? Nope. So what is it for?
The iOS Simulator is fast enough for running apps. It is way better than the Android emulator, but it’s not fast enough to run a game at 60FPS. And it is completely useless for running a game that is controlled by the accelerometer. There’s a way around that, but it’s too complicated for my taste. I want to iterate quickly, so I’ve invested some time to optimize my workflow.
Setting up a Mac build has paid off almost immediately.
The Mac version starts super quickly and runs smoothly at 60FPS. I can comfortably control it with keyboard and mouse. Another big advantage is that it can read and write files in the filesystem. This is required for the built-in level editor. It also helped me identify a few areas in my code which had problems on a 64-bit architecture. I was able to fix those without ever running the game on a 64-bit iOS device.