Interested to read about The-Making-Of “Upward Mankind” (my LudumDare #24 entry)? Well then, here is my post-mortem explaining the good, the bad and the ugly: the difficulties, the change of plans, the tools used / not-used, the programming aspect, the graphic design of the game and the music production.
Friday Evening: the Theme is Announced!
When the Theme “Evolution” was announced, I drew a blank. I had no clue what I was going to do, or which Flash framework I was going to pick to make my game. Most would kill anyone for saying this, but… after seeing the final list of themes we could vote on – I was actually looking forward to “1000 Kittens” (Yikes! *dodges tomatoes* ). Normally I would downvote that one, but this time around I felt it would of been a nice and simple one to work on. Oh well. Anyways, enough said about the felines!
Even before the theme was announced, for some time I was under the impression that only Flixel could make awesome 8-bit style games, and that it was the only framework out there that had simple physics & collision handling, and a number of ways to implement custom filters to polish the overall look-n-feel of a game.
My first few hours were spent trying to use Flixel to make a cloudy “parallaxed” background.
Well er… a few hours spent ? More like… a few hours WASTED!
Even a simple task like that, I couldn’t get done. I’ve looked into the documentation and tutorials for scrollFactor; unfortunately it didn’t help. Perhaps I wasn’t using the object hierarchy correctly to achieve this effect, but still… it SHOULD be simple with Flixel, right?
Choosing your Tools Wisely
Anyways I gave up with Flixel, and decided to go back with a previous successful Flash framework that I used for my LudumDare #23 entry “Surrounded by Snails” – Axel, a 2D engine with Stage3D support based on Flixel.
I have explored this framework in the past and felt comfortable enough to make some modifications of my own. Using a code-comparing tool like
Beyond Compare was really helpful to identify my changes from the latest Axel v0.9.2 beta release. There is some areas that I’ve decided to improve even further, such as:
- Tilemaps having scroll factors (for parallax support);
- Having all objects which originally extended AxModel, to extend AxSuperModel (custom made) which extends AxModel and adds the “screen” AxPoint to all models, instead of being exclusive to AxSprites;
- All AxSuperModels updates their screen’s X and Y coordinates in their overridden update() method;
- AxState’s and AxGroup’s iteration of objects adds / substract amounts to a global offset AxPoint (a new property I added to Ax), which is used to move a whole group of object together (reflects more the way Flash’s display hierarchy compounds all the transformations of instances);
- Added a property to AxTilemap to let the developer supply a callback method (a variable as a Function) to replace the collision detection when an AxCollision processes the tiles against entities. This was important for creating the one-way solid tiles in Upward Mankind;
As for the graphics, I needed something to create tilemaps fast and efficiently. During the week just before the competition, I’ve researched for some simple editing tools that focuses on tilemaps creation. There were a few: OGMO, DAME, writing a CSV files (Comma Separated Values) or using my BitmapData technique which I have explained in a previous post here (technique used in Surrounded by Snails ).
In the end, I found OGMO and DAME to be too sophisticated for what I wanted to do (well, I didn’t really give them much of a chance or test-drive), but I would consider them for larger projects with more level-design details. I wanted something more visual than a text-file like CSV, or even a flat Bitmap with one pixel color designated per tiles from a tileset. Basically, something that allows me to create my palette of limited colors, draw my tilesets, and then create my levels from those tiles.
Combined with PyxelEdit (a relatively new tilemap editor for retro style video games), I was able to achieve my parallaxed sky background within an hour or so. It allows transparency, multiple layers, and keeps “smart” references of your tileset (so basically you can move them within the tileset to keep things clean without breaking the references in your tilemaps). There’s a few things on the wishlist (of course!), like being able to reuse the same tileset or update it across multiple project files. However, for short 48 hours projects made during a LudumDare compo, this was just the perfect tool.
Here’s a screenshot of the sky background In-The-Making :
La! La! La! – How the Music was made
If there’s any process in the whole game-jam that has never been a roadblock for me (**knocks-on-wood **), it is making music with my trusted DAW of choice, FL Studio 10 (by Image-Line). To achieve a type of distortion commonly found in 8-bit chiptunes, I tried to emulate it first by using the Fruity Squeeze Effect. I wasn’t really proud of the results, so then I pulled another built-in plugin. I dropped a Fruity Wave Shaper on my Kick Drum, drew a squiggly diagonal line with high hopes that it would output a low bit-depth sounding signal.
You know what? This actually kinda works! It gives a bit of high-end fuzz distortion and impurities to the sound passing through it. Being grateful of the results, I saved it as a Mixer Preset (with a robot icon, and purple background color). I’ve dragged multiple copies of it to 7 or 8 tracks, and routed my toms, hi-hats, bass and synths through one of them each.
Although delays and reverb may not actually be true effects in the realm of 8-bit sound, I always find it gives it a nice polished quality and much more depth. It’s like… a modern facelift.
One of the keys to make lead-synths sound like a catchy classic chiptune melody (at least, in my opinion), is to grab synths that can produce primary sound waves – like a Sine, Triangle, Square, Sawtooth, and Noise waveform. The 3xOsc is perfect for this in FL Studio. It can generate up to 3 tones at the same time with individual control in volume, waveform type, octave, tuning, panning, stereo phase offset and stereo detune. So with the power of “the three”, you can pull-off some snazzy 8-bit sound goodness. It’s also worth a try with the Sampler, by dropping a sound “shape ” in it, like a vowel sound, a buzz, organ, voice, anything!
The Timbre of the sound is also important. Does it pluck? Does it have a long release time? Does it wobble in pitch? in volume? Does it start and end abruptly? Does it glide from note to note (portamento)? All good things to consider.
Gliding in itself can be used to make an “ok” synth sound “epic”, when controlled at specific parts of a melody. The best way to control gliding notes (or sliding notes , in FL Studio lingo ), is to place your starting note, and then place a very short sliding note above or below it (depending where you want the melody to go) so that it morphs in time with the feel of the music. It makes it slightly jazzy, or groovy even. Might sound easier said than done, but I guess some of us have a natural ability to lay down a melody line better than most people! Having played a lot of NES in your childhood definitely helps, or at least listening to chiptunes as a passion.
Debugging Time eating up Content Creation Time
It was really difficult trying to come up with a story or a game-play that fell in the “Evolution” theme while there was a lot of debugging involved. I would go as far to say that 80% of it was spinning my wheels on debugging, 20% creation. It sucks when that happens!
There was so many things to address – clouds or water layers not properly parallaxing the way I wanted, collisions not properly working (and had to be fixed with some surgical hacking of Axel), camera throbbing vertically when the character stood on certain y coordinates blocks (rounding issues?), and worst of all… not having a particular goal in the game.
I had to snap out of it and get something for the players to go after in order to feel like they finished the level. So I added a “red flag” at the very top of a hard-to-reach location in the level, and called it a day. That was done probably within the last 20mins of the compo. It was a very close one!
Many say it’s better to get your game in much more in advance (hours, not minutes) than trying to use up all the seconds available during the competition. I don’t think developers intentionally run out of time, it’s just that we’ve still haven’t found the library of our choice that enables us to focus primarily on content-creation, a good storyline and fun game mechanics. Every game jams, however, is getting us one step closer to that point.
Until then, rate the submitted games, leave comments, spread the love and sharpen those coding skills for the next LudumDare! :)