Inaugural Asset Jam Results: CTF Platformer
Posted by Doug Haber
Blue player guards his flag
On Sunday the 11th I came across a Reddit posting for the "Inaugural Asset Jam."
This post proposed that everyone use Kenney's platformer art sets to make games. Everything was very informal, and the only rule was that the jam ends the following Sunday.
Before I saw this posting, I was considering doing something for JS13KGames,
but I decided ultimately to go with the Inaugural Asset Jam instead. I really wanted to make a game that I can continue working on after the competition. The 13k limit encourages bad coding practices in order to save space. That can be fun, but it isn't ideal when intending to maintain the code. I had entered the last JS1K (my entry is here)
but this time not being constrained by size seemed like a good idea so that I could concentrate on making a good game, instead of making it fit.
Kenney created a wonderful set of platformer art tiles,
and with the Open Bundle
reaching its goals, they became public domain. Since then he has also released some extras including mushroom and background tiles,
as well as pixel art versions of the tiles.
More of his work can be found on his website at kenney.nl, Facebook
or on Twitter.
For background music it seemed appropriate to stick with the Open Bundle. I picked out a really nice chip tune song by Strat Kat. The current version is using Strat Kat's "Chippy Cloud Kid." Strat Kat can be found on Tumblr, Band Camp,
A demo CTF Map
This game was developed using my own HTML5 game engine. I like using game jams and competitions as opportunities to improve my own tools, and it worked out really well this time.
The engine is pretty full-featured and has an integrated editor which made coming up with a sample level very easy. To make a symmetrical level I just made and exported the left half, and then wrote a quick Perl script that reads in a map file and reproduces a flipped version on the other side with some tiles replaced with their alternate equivalents.
The engine has built in support for many common platformer features. Thanks to this I was very easily able to get up and running with a live demo including things like one-sided platforms and even a rope bridge.
A player jumps on a bridge
The engine has full Box2D integration. It uses a modified version of the Box2dWeb
port of the ActionScript port of Box2d. The current game doesn't have many physics objects that can be pushed around, but as development continues I expect it to prove helpful in adding interesting dynamics. The only notable thing made with the physics engines in the current version is bridges, which are made by connecting segments with joints.
I used SFMaker
to quickly generate a bunch of placeholder sounds. When I have more time, some of them will be replaced with better sounds. All sounds are generated procedurally on init by using SFMaker as a library. The only other audio in the game is the background music, which is just loaded into an <audio> tag and looped.
Multiplayer seemed essential for a good CTF game. I chose to write the server in Node.js. I had made a very simple game server in the past using Node that made use of Node WebSocket Server.
It seems that is now deprecated, so I switched over to WS.
The transition was painless. The library had a simple API and just worked without any issues.
For the purpose of getting things done in a week I opted for a very verbose JSON based protocol. I built a layer for the client and server to send events to each other and define handlers, and that worked wonderfully. This isn't the most efficient way of doing things though, so I'm probably going to have switch to a much more compact binary protocol at some point.
My goal for getting this done in one week was to have just enough stuff synced so that multiple players could run around a map together. I got far enough so that they could steal, drop, and capture flags. They also can do light combat, goomba style. Jumping on an opponents head deals damage and can cause a carried flag to be dropped.
There are lots of checks in place in the server to validate the client is following the protocol. This is nice, because it handles errors in development cleanly, rather than causing server crashes. There are very few checks beyond the protocol on user requests, and so cheating is trivial. This will be fixed, but I figured it would be better to have a working game by the deadline than to put all the effort into that just yet.
When working on game jams there always is the problem of time management. I only had a few hours here and there throughout the week to work on this, so it was very important to stay focused during that time.
There are things I would have liked to have included, such as more of the art assets. I included the walking animation for the players, but not the jump or hurt frames, for example. These are trivial to include, but I ended up spending a lot of time on the server and not coming back to finish those off.
The decision to go multiplayer was a guarantee that a production ready game would not be available, but I decided to go that route anyway since it seemed more interesting, and since I am looking forward to continuing development beyond the jam.
A radar was added in the lower left corner
When playing with others on the server it became very clear that the small viewport wasn't enough. I decided to remedy this by adding a radar. I probably shouldn't have added this unexpected feature during the jam, since it cost me several hours. It does help make the game more playable, though.
Overall, I'd say this went really well for a week long project done in spare time. The goals were met, and there is a somewhat playable demo with basic CTF rules.
I do plan on continuing development and making a releasable version. The art pack has a lot of content that can be used to add other elements into the gameplay. There is a lot of work remaining, but I am looking forward to putting it all together. I am busy with several other projects, and so I am not going to provide any timeline. I will post updates on the Leshy Dev Blog
as well as on Twitter.