The Sky's The Limit
The Sky's The Limit
Conceiving the idea for the game.
Programming the entire game, including creating a gliding controller that mimics semi-realistic physics.
Designing, rendering, and animating all the art assets.
Bug-testing and fixing.
Design evaluation and iteration.
Sourcing SFX and music.
Try the game for yourself! Playable in browser on itch.io
Retrospective
Some time before this game jam, I had been attempting to make a gliding controller in Unity, loosely based on the gliding physics of the Cape Feather power-up in Super Mario World, but with more control. While making it, I had envisioned it as a game where you play as a bird trying to go as high as it can.
When the jam started, the theme was revealed to be "You Are Not Alone." Upon hearing it, I immediately thought back to the gliding prototype I had made, and expanded upon the bird game idea to include a whole flock of birds, each one helping you gain a little bit more height. The game is intended to be an allegory for the importance of teamwork, and how sharing your goals and aspirations with others can help you to achieve them together (which is ironic, given that I made the game by myself).
Mario using the Cape Feather power-up in Super Mario World, which inspired the gliding mechanic for my game.
The first thing I did was remake the gliding controller from scratch, using what I had learnt from my previous prototype and improving on it. Here's how it works; the bird rotates over time to face the vertical position of your mouse on the screen. You gain speed while pointing down, the further down you point, the faster you gain speed. You lose speed while pointing up, the further up you point, the faster you lose speed. If you lose all your speed, you start to fall, but your falling speed can be turned into forward speed by pointing down and back up again.
Each time you add a bird to your flock, you gain the following effects:
Your speed acceleration rate increases, making it faster and easier to hit max speed.
Your speed deceleration rate decreases, allowing you to climb further before running out of speed.
Your rotation time decreases, allowing the player to switch between rising and falling much faster.
This means that with each bird you collect, it becomes easier to fly and to climb higher. The only problem I have with this current system is that once you have enough birds to climb, which is only a few, you can then make it to the end. Collecting more birds would make it easier to get there, but it's not necessary. I had the idea to change the system so that instead of other birds increasing your stats, your stats go from good to bad any time you go above a certain height limit, and each bird you collect raises that limit, thereby making it so you have to collect a specified number of birds to finish the game. Unfortunately, I had the idea quite close to the end of the jam, and I thought it too risky to change the core mechanic of the game so close to the deadline, so I left it as it is.
The next major task was having other birds follow you around. First I tried using a modified version of the player's own gliding controller, controlled by an AI programmed to follow the player, however this proved problematic as they would very easily fall behind because of differences in speed. I realized that an important part of the flocking effect was that the birds stay in range of the player, so I implemented a smooth-follow function (similar to the one I already made for camera movement) with the addition of giving each bird a random offset from the player, so each bird was in a unique spot.
This allowed them to keep up, but they also felt too rigid, as they would all be exactly the same distance from the player. I needed a way to allow them to move slightly over time, so I also added a system that would have the birds take two randomly selected offsets and then slowly lerp from one to the other, and upon arrival they would choose a new offset and repeat. For the same reasons, each birds rotation time is also randomized, though this has no impact on it's movement. These changes finally gave me the look I was going for.
I would consider art to be my weakest skillset, so when making a game by myself, I always opt for a very simple art-style, using mostly basic shapes and solid colors. Usually for this art-style, I would design and then render assets in GIMP or Inkscape, but since I was pressed for time, most of the objects in the game were actually just combinations of basic shapes, for instance, the clouds are just rectangles with circles around them, and the trees are the same but also with a line renderer used for the trunk. I wanted to add some additional polish later on, such as adding gradients to some background elements to make it seem like they were being lit, or subtle animations to the trees in the back to make it look like they were rustling in the wind, but I unfortunately didn't have time for these.
The bird was the one element that I did design in Inkscape, as it was slightly more complex and I needed to make sure I got it right. I think the trick with this kind of simplistic art-style is to strike the balance of detail just right. You need enough detail so people know what it is, but little enough that it remains somewhat abstract. Too much detail in certain areas will make the lack of detail in other areas stand out.
I knew from the start it was important that the birds have more than a single flying animation, or else it would end up looking stiff and unrealistic. For this reason, the bird's animation is blended between 3 states, each with varying degrees of flapping, from flapping really hard to not at all. The animation will move between these states based on the rotation of the bird, for instance, when the bird is pointed straight up, they are flapping their wings really hard, as if trying to fight against gravity and gain elevation. When the bird is pointed straight ahead, it lessens to a moderate flap. When pointed straight down, the wings stop flapping altogether and lay out flat, as if going into a dive and trying to become more aerodynamic.
The animation blends from hard flapping to moderate flapping and then no flapping.
Background objects teleport after reaching a certain distance from the camera, creating an endless loop.
My next job was to create the effect of an endlessly scrolling background. First, I take the movement vector of the camera each frame and apply it to all the background objects, then I apply a multiplier to that vector between 0 and 1, which can be individually set per object. This meant that the background objects would always move in the same direction as the camera but at a reduced rate; objects with a higher rate would follow the camera faster, making them appear to move slower from the camera's perspective, while objects with a lower rate would follow slower, making them appear to move faster.
Next, I would give each object a maximum distance it could be from the camera, both in the X and Y axes separately, and if an object ever went beyond this distance, it would teleport to the other side of the camera. This meant that, with enough variation in the background elements, I could have the same objects pass by the camera over and over again, rather than constantly creating new objects.
So far, the only way to fail was to hit the ground, but after collecting a few birds, it was pretty easy to not do that, so most of the time I spent playtesting was just flying around in the sky. It occurred to me how nice it was to just collect birds and fly. I had intended to add obstacles other than the ground that would appear in the sky, forcing you to dodge out of the way, to add an extra element of challenge to the game, but somewhere along the way I decided that I didn't want to, as I much preferred the game being peaceful and relaxing. For this reason, the general vibe of the game pivoted, and I started focusing on elements that would help establish the serene ambiance I wanted.
The most important part in achieving this was the music, and though I would have loved to compose something myself, I'm not super familiar with music production and had limited time, so I went the way of sourcing some license-free music. Luckily, I managed to find a wonderful peace of piano music that was very simple and used notes quite sparingly, making it feel almost more like background noise then an actual song. It reminded me somewhat of music you would here in Minecraft or Breath of the Wild, which is exactly what I wanted.
At this point, all that's left is to add some polish, so here's a quick rundown of these extra details.
I gave the birds a tweet sound effect that plays and random intervals, as well as random pitches to make it sound varied.
I created a custom sound using a Harp sound effect in FL Studio, which plays anytime you collect a new bird.
I added a particle system that create wavy white lines in the air to simulate wind. This only appears when going close to max speed.
I added a wind sound effect, the volume of which is based on your speed, so the faster you go, the louder the wind gets. The sound also disappears completely once you reach space.
I added a trail renderer to the birds to create speed-lines behind them. These only appear when tilted down and close to max speed. Since tilting down is how you gain speed, I thought it would be good to indicate to the player when their speed is at max, so they know when to pull up again and don't lose too much height.
I added colliders to the clouds in the foreground and a particles system to the player. Anytime the player flies out of a big cloud, a puff of small clouds is created around the player, making it look like they are bursting out of the cloud. It also plays a nice fluffy sound effect.
I was fortunate to receive a lot of feedback on my game after submission, most of which was very positive. There was also some constructive criticism that I would like to talk about.
First off, a few people mentioned that it's not super clear where the collision for the ground is, as it's all the same shade of green. This error occurred because throughout most of development it was a lot more obvious where the ground was, as you would die as soon as you hit the green box, but on the last day of the jam, I added the trees and realized that in order to create the parallax effect I wanted, the trees had to be layered on the ground rather than being sat on top of it, and since they're meant to be background elements, the player would have to crash below the trees for it to look right, so I changed the collision box of the ground so that it was below the trees. I figured it wouldn't be a huge problem since, once you know the ground is bad, it's pretty easy to just not fly close to it, however I agree that ideally there should be some indication of where that collision will occur.
Another criticism I saw a few times in the comments is that an explanation of the controls would have been helpful at the start. I almost added this right at the end of development but changed my mind at the last minute. My reasoning was that, since I had pivoted towards focusing on the game's chill ambiance, I wanted to take a more minimalist approach, almost treating it more like an interactive experience than a game, and figured it was ok to do since the controls are rather simple and wouldn't take long to figure out. As nice a thought as this is to me, a basic explanation of the control scheme at the very least would have been helpful.
Looking back on this project, I'm very satisfied with it. I joined this jam on a whim, not thinking I would be able to achieve very much on my own, and ended up being quite surprised with how well it turned out. The main thing I'll take away from this project is discovering what's possible even on such a small-scale project. Ever since leaving university, I've started a lot of projects and stopped them when they got too big and intimidating for a solo dev to handle, rarely doing anything small-scale because it didn't interest me much. Making this game made me realize that even the smallest of games can be a worth-while experience if you find the right idea, and I think from now on, as long as I'm still a solo dev, I'm going to focus more on finding those small-scale ideas that are achievable but without sacrificing my desire to always make something that's unique.
There are some major improvements to be made to this game, as I have already discussed, as well as some stretch goals I never got to like additional background elements and animations, so there's a good chance I'll come back to it sometime. That said, I also really like making new things, so we shall see.