Game Dev Adventure #5 - My First Game Jam Part 1
I decided to finally participate in a game jam, My First Game Jam, this summer. Having done a few hackathons before but always ended up with partial products that I am not too proud of. I am the type of developer that needs extra time to execute what I have in mind since I always have a slow start at the beginning. With my experience with past hackathons, I thought game jams are also events that only last a very short time, like 24 hours or 48 hours, so I never decide to join any because of the stress from having to create something amazing within such a short period. Staying up all night or two to work on any project would be bad for my health and would destroy my day job schedule after the event.
With My First Game Jam, things are slightly different. The jam turns out to be a fifteen-day long journey, from July 11th to the end of July 25th, and that fits my style of game development. Being my first game jam, I think of this as an excellent opportunity to team up with other indie developers or artists to try out something new. I asked my friend, Jacob, to join me, and we started getting together to brainstorm fun simple game ideas.
This jam's theme is Change, and that got us thinking, "What kind of mechanics and topic would be able to match this theme?" There were quite a few mechanics that we came up with like rhythm game, tower defense, resource management, and many more. In the end, we agreed upon a simple action RPG game with a unique element of time.
The rough idea is to have different rooms for players to explore and conquer, but there is a catch: Every room has a timer and the player has to beat the room within a certain amount of time. If the player runs out of time for the room, bad things happen, like losing health overtime until the room is cleared, enemies getting stronger, more traps, etc. Additionally, enemies or the environment in the room only act when the player acts.
Here is what we have done so far during the game jam:
Plan out our tasks and development plan for the next 14 days
Start working on setups for development
We first prioritized what tasks are must-haves for the game, like game character, rooms, enemies, and UI. Next, we highlight the fun, good-to-have, and yet easy-to-implement tasks so once we have the base game ready, we can work on those as stretch goals.
Once we had our plan in hand for what to execute first, we first set up a common workspace and repository on bitbucket, started a Unity 3D project, and put it in the repository to share so both of us can update the same project files. Then we went to itch.io and the Unity assets store to try to find game assets that fit our vision for this project. We ended up finding some 8-bit style art on itch.io and started making some animations out of them to put into the game.
Learn and use Unity 3D's tilemap system for room creation
Add player character and enemy character
Add UI elements
Start adding foundation game logic
We had never used Unity 3D's tilemap system before, but I have seen people utilize it quite often, so I challenged us to learn it for the generation of our rooms. Now we could make the basic map as well as have characters not go through any collide-ables. We could also put a starting location for our player character to start on inside the room we just created.
Following our basic map generation, we decided to pick a lizard character for the player and a big demon monster for the enemy and created animations for each character. Once we had the characters in our scene, we added in some basic controls for the player to move the lizard with, using the arrow keys.
Next, we added some heart containers on the UI to represent the player's current health and make the UI panel scalable for any screen resolution.
Lastly, we added a game logic where time only runs when the player is interacting with the game. In this case, any keypress would count as player interaction and allow all the game actions to continue.
Add attack logic to player
Fine-tune some interactions between player and enemy
Fixes some bugs
We were thinking to ourselves, "What would be a great weapon for a lizard to be holding on to?" The answer we came up with was a BATON! Having it swing left and right continuously sounded like a lot of fun, so we just put it on the lizard as the weapon of choice. By making sure it can actually hit the enemy and having a nice swing animation to it, we thought the player character looked more complete.
The next thing we worked on was to fine-tune some interactions between the player and the enemy. The first change was to allow the player to take damage when the enemy runs into them. The second change was to set the enemy movement speed to be lower than the player's so the player could have more room for strategy and choices when figuring out how to take out the enemy.
While we worked on the different game logic, we saw a few bugs in our code and these bugs were quite noticeable. So we decided to spend some time fixing them first. At that point, when we had the player character move diagonally, it was going at a faster speed than when it was going up, down, or sideways. We looked through our code and found the velocity is added to the direction the player moved was being doubled, due to the function adding duplicate velocities towards both the vertical and horizontal axes when going diagonally. Therefore, we changed the formula to bring down the number when we hold both keys at the same time so the speed going diagonally can match with the other directions.
Another bug we ended up fixing is related to a collision issue between game objects. The bug caused the enemy to hurt the player without touching them. It was related to the OnTriggerEnter2D method not looking for the tag of the object it interacted with. Adding an if-statement in the OnTriggerEnter2D function to check if enemies are colliding with the object which has a player tag, ended up solving our issue and everything ready to go again.
New animation and condition for different interactions
Before we went into any development for the day, we again noticed a little bug lurking around so we tried fixing it first, since it seemed to be an easy fix. The enemy was only going in one direction, so we made sure it can now face the right direction when moving.
Currently, the player and enemies could hurt one another constantly without allowing each other to have a breathing room, so we added in a hit timer cooldown in both classes to allow a short period to be invincible. For the enemy, instead of just a short period of invincibility, we also want the enemies to stay at where they got hit and not chase the player. While the enemy freezes in place, the player would not be able to hurt the enemies again so one cannot just spam attacks to get rid of any enemy instantly.
Furthermore, we felt that the game was currently a little bland, so besides game logic, we are also added some extra game juice! Blood splashes whenever the player hits an enemy, hit animations on both the player and the enemy, and camera shake when the player gets hit are the new additions to the game! Now the game becomes more fun!
I ended up working long hours for my day job this day, so not as much time could be spent on the game jam. However, we still get one of the most important features out, which is enemy death. We added health to the enemy and allowed for our player's swing action to damage the enemy. Once enemy health goes down to zero, it goes into a death animation and disappears around a second later.
Conclusion after the first five days
Overall experience for My First Game Jam has been a great one so far, and I am excited to see where we go from here. I will share as many details as possible from my experience with this game jam as I hope you all enjoy reading my journey so far for this event. Stay tuned, and there will be part two coming up for the rest of the jam. If you want any more detail regarding my first five days in the game jam, or simply want to let me know you like what I wrote, please feel free to drop me a question or comment below.
Have Fun. Be Happy. Be Inspirational!