Brad Keys
Game Designer & Programmer
Rebel Hippo Inc. LinkedIn Twitter

Switchit (Global Game Jam)

January 31, 2015

I recently participated in the Toronto Global Game Jam. On my team was the talented Brent Mitchell (level design, programming) and Mark Tome (artist). The theme this year was What do we do now?.

Brent and I spent Friday evening having a few pints at a nearby pub and brainstorming many game ideas. Most ideas focussed on Oculus Rift, since we thought it would be fun to develop for. All our ideas were multiplayer since we find it to be very enjoyable, and it fit the we part of the theme.

By midnight we locked down a concept. We ditched oculus entirely, but opted to use Xbox controllers for input. We got excited about the idea of playing a competitive multiplayer arena game which has several game modes, but you have no idea which mode is currently active. This means having a real objective, and potentially showing a few fake objectives in the arena at the same time, such as fake capture the flag.

Keeping to our tradition of staying relaxed during game jams, we slept in Saturday and went out for breakfast. With our forks in one hand and a pen in the other, we hashed out the rest of the game design. Which game modes we would use, how they work, how many fake objectives would be active at a time, etc.

Here is a breakdown of the mechanics:

  • Shoot (unlimited, press right trigger)
  • Drop bomb (unlimited, press left trigger)
  • Move with left stick, aim with right stick

Random game modes are:

  • Deathmatch, kill opponent 3 times via shooting or bombs
  • Capture the Flag, one capture is enough
  • Oddball, given by a flag, earn points over time
  • Break Stuff, use bombs to break objects, find the treasure
  • Collect Stuff, collect the green orbs around the map

We arrived at the jam around 2pm on Saturday and got straight to work. Brent worked on the player controls and level generation, including implementing layouts. Meanwhile I worked on coding the game framework and game modes. This took up our entire Saturday, having us back home a little after midnight.

Sunday we slept in again, then grabbed some lunch to go, arriving at the jam around 1pm. We spent the afternoon merging our work together. The deadline was 6pm, and we did not even get to start testing gameplay until around 4pm. As you might imagine we were fairly frantic at this point. To our amazement however, most game modes worked out nicely and we just had to implement art and work through a number of minor bugs until the deadline.

We really cut it close this year, slightly over-scoped. We spent a few more hours the next day fixing a few more bugs and implementing the lovely sound effects heard in the video here. We had a great time developing and playing the game, so much so that we are considering implementing 4 player multiplayer. Give it a try if you have some time and let me know what you think in the comment section below. Unfortunately due to the controller library we used, it can only be played on Windows. We also have not tested with controllers other than Xbox 360/One game pads, but most should work fine. Enjoy!

Windows Standalone
Requires two game controllers Comments...

Bursting With Colour (Global Game Jam)

January 29, 2014

This past weekend I participated in the 2014 Global Game Jam at the University of Waterloo. Lumos cofounder Matthew Miner joined my team, along with Ubisoft level designer Brent Mitchell. Together we created the game Bursting With Colour.


The theme was "We don't see things as they are, we see them as we are." We spent Friday brainstorming ideas. We kept ideas 2D because we wanted to experience Unity's new 2D system. The three of us also enjoy multiplayer games, so that was another factor our ideas involved. In the end, the mechanic we kept coming back to was switching colours of blocks to make them active (able to stand on).

Game Design

We decided on a co-operative 2D platformer where two players using Xbox 360 controllers work together to climb platforms as high as they can. The challenge being that of the four colours of blocks that make the level, only two can be active at a time. Players may switch active colours, but must be careful as it can lead to players falling off-screen (death) or making a block appear where they are already standing (death). Players may not switch to the colour the other player has active, even if that player has died. The camera moves upwards, forcing players to climb higher, and gains speed over time. Each player only has one life. You get a score based on the maximum height you achieve, and double the points while both players are still alive.

We have done game jams before and we agreed there is no point in doing all-nighters and burning ourselves out. We did that in the past and found that by Sunday, tasks that are typically simple would take considerable amounts of time to complete... and you just feel bad. So we went to sleep Friday night around 2AM and were back to work around 11AM Saturday. No coding was done Friday night.


Our goal Saturday was to have a playable version of the game, and Sunday we would polish and play test. Amazingly, things actually worked out according to plan.

We split the team up as follows: Matthew on art, UI, audio, and additional programming. Brent on game mechanics (player death, camera movement, etc) and level design. And I worked on the character controller, Xbox controller input, scoring, and parts of the procedural level generation.

Controller Input

For the Xbox 360 controller we used an Input Manager from the Unify Wiki and modified it to suit our needs. Brent was developing on Windows, while Matthew and I were on Macs. So we had to have variations of the input for player 1 and player 2, for both Windows and Mac, resulting in 4 inputs per button we used. To get the controllers to work on Mac we installed a driver from

Character Control

For character control we grabbed the 2D robot from Unity's Sample Assets package. We had to do quite a bit of tweaking to the code to get our input and mechanics to work the way we wanted to. For instance the character was able to stick to walls if you jumped and held the joystick in the direction of the wall/block you were colliding with. There is also a bug in their code that caused the character to have different jump heights depending on the framerate achieved by the computer you are on. Needless to say, I spent a lot of time fudging around with this.

Art & Sound

The art was made entirely by Matthew. None of us are artists, so we went with a simple design we knew we could achieve. To save some work Matthew took the sprite sheet of the sample robot character into PhotoShop and simply turned him into outlines. For audio we found sounds and music that were free online, including the infamous Wilhelm Scream. We chose a free retro font to go along with the art style. All the UI was implemented using Unity's GUI system.

Level Generation

We knew we didn't have time to make a bunch of awesome levels. And we also didn't have time to make a kick-ass procedural level creator. So we made a half-ass procedural level creator! There isn't much to it really. We define how many units wide and tall the level should be. It performs a couple of for-loops using those numbers to generate rows of tiles. For each tile it creates we have defined percent chance of it being the same colour as the last tile that was generated. We found that having this number higher made the game easier. There is also a defined percent chance of a tile being blank (non-existent), which we found made the game harder the higher it was. Lastly we made it so that ever 3 rows, the entire row is blank, allowing for more interesting jumping. We thought of these values and tweaked them quite a bit before finding a great balance.

for (int x = 0; x < gridWidth; x++) {
  // Only create a new tile a specified percent of the time.
  if (Random.Range(0f, 1f) < chanceOfBlankTile) {
  LayerColor tileColor = LayerColor.Solid;

  // Randomly decide if this tile should share its neighbours color
  if (lastColor != LayerColor.Solid) {
      if (Random.Range(0f, 1f) < chanceOfNeighbourColour) {
		  tileColor = lastColor;

  // Randomly decide which color to make tile.
  if (tileColor == LayerColor.Solid) {
      tileColor = (LayerColor)Random.Range(0, LayerManager.layers.Count - 1);
      lastColor = tileColor;

  CreateTile(tileColor, x, y);

After the jam I made the game start easy (high chance of sharing neighbour colour, low chance of blank tile) and progressively (every 12 rows) get harder. This should help beginners.

Unity 2D

We did not have a single issue using Unity's new 2D system. Now and then in our code we would forget to use Physics2D instead of just Physics and other little things like that. But overall it just worked. We never had to worry about the z-axis. It made development incredibly easy.

Play Testing

By midnight we were able to play an alpha version of our small game. Art and audio was in and the mechanics worked. So we spent about an hour playing the game and tweaking values here and there. It was the most surprising part of our day because the game was actually pretty fun. We found ourselves constantly screwing each other over by accident, but eventually working together to get high scores.


We started work on Sunday around noon. We spent the remaining 5 hours of the jam tweaking character controls, level generation, and polishing art and sound. We also added keyboard input and the bonus score system.

By 6pm we were at the University of Waterloo to show off our work, and I think it is safe to say it was a hit. A great experience overall. I made some improvements the day after the jam finished just so I could put the game on the shelf and not be bugged about some stupid little problem it still had. If you would like to try the latest versions of the game, check out the links below.


Bursting With Colour (Single Player, Windows)
Bursting With Colour (Multiplayer, Windows) Comments...

Farewell Ganz

February 26, 2013

The time and opportunity has come for me to stop working for game studios and begin working full-time with my own company, Rebel Hippo Inc. Along with my swanky co-founder Matthew Miner, our company is best known for creating Lumos Game Analytics for the Unity game engine.

We've been brewing up big plans for how we'd like to transform online services in the game industry and soon we'll reveal our latest and greatest product which will be of great interest to indie developers and small studios alike. If you're a fan of Lumos (of course you are!) then, yes, it is appropriate for you to be overflowing with joy right now. Expect similar ease-of-use but much more awesome. Stay tuned!

This change means I've stepped down as the lead game designer of the mobile team at Ganz. But fear not Frocket fans, there are some wicked ideas being tossed around at the studio that you and I should both look forward to. We learned quite a bit from developing Frocket and iterating on feedback. It's safe to say the future titles are sure to be barrels of fun (see what I did there?).

Later this week I'll be moving to the Kitchener-Waterloo area to work out of our office at the VeloCity Garage. It'll be cool working in that space with fellow entrepreneurial nerds. Aside from gaining peer knowledge on topics such as world domination, it'll be great to work in a place where everyone shares a passion and desire for bettering this tech-savvy planet we live on.

An ongoing project Matthew and I will have in our office space is building a MAME arcade machine. Aside from taking the quarters from every sucker in that complex, it may also serve purpose as a demo machine for some of our new products coming out. I'll be posting more on our creation process of the machine since we're doing it from scratch. Legit.

That's about it for now. Enjoy this image of video game deaths in the style of Edward Gorey's Gashlycrumb Tinies!

Page 1 of 8 Older » Oldest