It had been over a year since I worked on a game project. A 20 Second Game Jam prompt was a good opportunity for me to refresh my memory of the process of game development. The focus of the jam was on the honing of skills necessary to polish the core elements of a game in order to grab the players' interest in a short amount of time and have them wanting more. For this project, I've teamed up with an artist and a music composer, April and Claire, from the jam's discord server.
The jam offered a range of themes to choose from and they were all optional. I have leaned towards the theme "rocket" since, at the time, I was interested in the physics mechanics, inertia and gravity assist.
Zodiac Ranger HSS (Haffkine Space Station)
This was initially going to be the third game in the Zodiac Ranger series, but I have chosen to keep this game as a stand-alone project for a few reasons including the following: all the games in the Zodiac series so far are set in an environment where the player's ship rotates around an object as a result of gravity, and gravitational slingshot is the essence of those games which is missing here. I have chosen the name "Who opened the hatch?" since it felt like a question that could pique curiosity and it also sounded funny to me.
I wanted to make use of inertia as one of the core mechanics since I find a mix of control and randomness to be quite enjoyable at this time. I have decided that a fixed screen would be efficient since it would cost considerable amount of time to move around an object like in Zodiac series. Once I've established that I wanted a fixed-screen game, I had to choose a role for gravity. To do this, I needed to see what the level looked like and I had to playtest it a few times with different parameters.
Prototype
Prototype
Spawn layout (not to scale)
I've set up a 2x4 grid where each "cell" contains a script for spawning tiles. Each spawner consists
of nine
slots (positions) in a 3x3 grid layout. A specific number of these slots would be chosen randomly at
the start
of the
level and tiles would be spawned in these slots. Some of the ideas that I have considered and
prototyped are:
Prototype
Though I have started with the idea of gravity being enabled, I have decided to disable the gravity after a few playtests since it felt better to keep the ship moving without resistance. If gravity were enabled, the gameplay would have been much more similar to Lunar Lander. It is not an implication that one is better than the other- they are different mechanics and it is more of a personal preference.
I have made a list of slots (positions) from which one slot is randomly chosen by the spawner at the start of the level to spawn a rock in. From the remaining slots, 2 slots will be randomly chosen to spawn NPCs in. I have decided to reduce the number of rocks since it would allow more space for players to move around in and enjoy the smooth flow of the ship while also keeping an eye out for the rocks. Now it feels way more relaxing since the focus is shifted towards embracing flight as opposed to focussing on constantly avoiding rocks.
I was focussing on refreshing my memory more than I was trying to make a polished game at the beginning of the project. Some of the earlier assets used involved Kenney's sprites as well as my own.
Prototype 1
Prototype 2
Prototype 3
I've made a few prototypes for the timer UI. An oxygen tank seemed to be a decent idea that fit well
with the premise of the game. Once I had a stable foundation for the game and realised that I would
be able to complete the project, I have teamed up with an artist,
April from jam's discord server. Though
they were relatively new to producing game art at the time, they were able to adapt quickly and
deliver quality content.
As I have tried pixel art a few times in the past, I wanted to experiment with a different art
style. Inspired by games like Hollow Knight and Cuphead where the visuals feel like traditional
visual art, I wanted to try an art style that would resemble a painting.
Collider on the ship
The artist made a few rough sketches of the assets and a variety of options to choose from. I have
chosen this model of the ship since I felt that its silhouette was visually way more attractive and
seemed suitable for a ship that would be used for rescuing astronauts in the game.
In terms of functionality, a ship with length and width close to 1:1 ratio is likely to do better in
terms of collision with environment since spinning on its own axis is a significant mechanic in this
game. Spinning with an elongated collider is likely to cause inconveniences in the level such as
hitting a rock which the ship would have not hit were it facing a different direction. This decision
was made to make the gameplay convenient for the players.
Perhaps I could have added an elongated collider and designed the level in such a way that players
could choose between an easy route and a high-risk, high-reward play style. This would require a
good amount playtesting, of course.
The colour of the ship was chosen to contrast the background. The astronauts were also chosen to be
of similar colour since it conveys better that the astronauts and the player ship are associated
while also standing out from the background.
Rock design 1
Rock design 2
The colours of the rocks make them fit in with the environment but also stand out just enough for
the
players to easily spot them. There are two different rock sprites and the script randomly chooses
one of
them at the start of the level. Initially, I have allowed both the sprites to be used in each game,
but
I have noticed that it feels relatively refreshing to have them show up separately.
For my earlier projects, I have often used royalty free assets that were made by experienced and
dedicated game artists. This meant that I had little to worry about how well they fit in the scene.
Now
that I was having assets created, I had to make sure that the resolution at which they were being
imported into the engine fit well with the size of the scene, the target screen resolution, and that
the
renderer parameters in Unity were set appropriately to have the images appear in the best way
possible
without having pixels glitching.
I have teamed up with a music composer, Claire, from
the
jam's discord server. They were able to understand the
needs and produce quality audio for the game.
The music was designed specifically to highlight the randomness that comes with inertia while also
focussing on the control that the player has on the ship. All this was done while preserving a pace
that
keeps the players' energy up.
To build hype and reduce monotony, I have chosen the audio feedback for the NPCs to be escalating
each
time the player rescued an NPC.
To save time, I have used Kenney's audio resources as placeholders and set up the code and
components while Claire
was working on the music.
While I already knew how to have one music track looping in the background across multiple scenes, I
learned to implement two music tracks that would span across multiple scenes depending on whether
the
player is in the menus or restarting the level.
I have also learned to use One Shot in Unity which I used for NPC feedback and explosion sound
effects.
One Shot is basically "start and forget" since it cannot be stopped; the benefit is that one audio
source component can be used multiple times and for multiple audio clips. An example I found while
learning about
this is of a cube that is being thrown around in a room and the thuds being played repeatedly while
also
overlapping.
I've written a script that changes the pitch of the engine sound within a
fixed range depending on the ship's speed in order to reduce monotony and to make it feel like the
engine is behaving as expected.
The pitch value changes between 0.5 and 3. The maximum magnitude of
ship's velocity is set to be 4. The magnitude is divided by 4 in order to bring it under 1, and then
it
is
multiplied by 3 since the top limit of the pitch I have assigned is the value 3. The bottom clamp,
0.5,
ensures that the engine sound does not completely stop even if the ship is stationary or moving at a
very low speed.
To make the game feel alive, I've added visual juice and subtle details. There would be shooting stars in the background that fly across the screen every few seconds.
Instead of spawning new shooting stars
each time, I had only three game objects which return to the starting position on the x axis. After
travelling a certain distance within a fixed range, the script chooses a random position on the y
axis,
a random speed, a random length for the body- all within fixed ranges.
These controlled changes allow
the shooting stars to appear as different objects. This is perhaps not the best way to achieve this
effect but this was added towards the end of the project - I chose to quickly put something together
that got the job done instead of worrying too much about efficiency considering the scope and size
of
the game.
I have initially tried to make the stars in the background twinkle as well, but it was taking
more effort than what I was willing to put in at the time to make it look and feel as desired.
Rock scaling
Rock scaling
The rocks and the astronauts carry scripts that make them spin clockwise or counter clockwise. I have also added two different speeds for each direction in order to add variety and make them feel less monotonous. The speed and direction are chosen randomly at the start of the level for each rock and astronaut. The script on the rocks also makes the rock sprite stretch by a random value within a fixed range at the start of the level.
Ship trails
In order to improve the visual attractiveness, I have added trails behind player's ship. Realistically, it is not possible that such trails would exist in space where there is no atmosphere. However, the need for player's enjoyment outweighs the need for realism.
Filler design
Asset reuse is crucial to save time and energy. This above asset was used (without the faded text) as the filler for the oxygen tank, background for the buttons in menu screens, and a few other places.
Colour test
I've written a script that chose a random colour for the heart each time an NPC was rescued. Though this felt refreshing and exciting, it strayed from the rest of the art style. For the sake of the greater good, I have decided to leave the heart in its original colour.
Scene transition
The circular masking helps in making the scene transition look less boring while also serving the function of getting the players' attention towards the ship at the start of the level.
Camera shake
The camera shake is an obvious element at this point in my game dev journey. The shake upon explosion increases the intensity of the collision and also the players' immersion in the game.
Royalty free font "OpenDyslexic" was used in order to provide a relatively better experience to players with dyslexia.
The first bug I had come across was a music track playing in only one ear. However, the other sound
effects were playing in both the ears. I fixed this by resetting the parameters of the audio source
component in Unity when I found that some of the values were not in their default state.
The game would stop responding upon starting the level but not when I start from the settings menu.
I narrowed down the possibilities to audio script which remains across scenes. I've tried changing
the code for how background music gets called upon scene transition, but it did not fix the problem.
I then found that I was setting the volume of level's background music after loading the level by
taking the value of the volume slider instead of the slider's value which is saved in a variable. I
fixed this by removing the reference to the slider which does not exist anywhere outside settings
menu and replacing it with a reference to the variable that keeps a copy of the value set by the
volume slider.
In one of the playtests, I found the audio being delayed in the game build but working as expected
in the engine's editor. I fixed this delay by using wired earphones instead of bluetooth earphones.
Information is key to the player and when the player fails at something in the game, it should not be due to the reason that the game did not give them adequate information.
Danger zone
I was originally going to set the screen
boundaries to be lethal but chose to leave a few pixels of safe space beyond the edges so that if
players accidentally got too close, they would still have a little breathing room to turn around and
get
back to safety. However, this has caused confusion to some playtesters since it was not indicated
clearly where the boundaries exactly were. To deal with this, I have added a red glow at the
boundaries
that light up on that respective side of the screen to indicate danger if the player touches the
screen's boundary.
Lesson: Always provide clear information in visuals, and preferably audio too, if something has
a
significant effect on the players or the gameplay.
Input settings
Though I have added the ability to navigate the menus with both mouse and keyboard, the initial
control
scheme for the player's ship had only WAD keys. Upon playtesters' feedback, I have added arrow keys
to
the ship's control scheme.
Lesson: Give multiple options for inputs to allow flexibility and provide better experience
throughout
the game for players with various needs. It is also worth noting that allowing players to remap
the
keys
is a good idea as well since it gives them more control over how they interact with the game.
If you are a developer and your game's difficulty level seems reasonable to you, it is likely
extremely
challenging to the players. Some playtesters have said that it was difficult to maneuver the ship. I
tweaked the ship's maximum velocity, acceleration, and turn speed a few times to make the game
playable
to a wider range of players.
Lesson: Keep the game playable for casual players and add extra challenges and rewards to
motivate
hardcore players.
"This is extremely good!"
"Good job. Fun game!!"
"Cool visuals and music!"
"I really liked it."
"this ones a ton of fun"
"nicely done. good play and polish!"
Lesson: Use the praise as additional motivation to make more games. Reciprocate the positive
attitude to create a healthy community and environment to grow in. Offer constructive criticism
if
possible.