Treasure Gunner | Game | Sep 2023 – Dec 2023

GitHub

itch.io

Treasure Gunner is a top down bullet hell roguelike game that, as the title suggests, is all about the treasure. Killing monsters earns you coins, and with coins you can purchase upgrades for yourself in shop rooms, repeating the process anew in procedurally generated rooms. The game was made for the UBC course CPSC 427: Video Game Development, where I worked with the team over the course of three months to build up the game and present it to the class and a panel of judges at the end of the school year. It was built in a custom C++ engine and rendered with CMake, utilizing an Entity Component System for all character/object interactions.

Being versed in 2D art already, a fair chunk of my duties involved the visual side of the game. I was responsible for 90% of the art assets, from character sprites to the backgrounds. It was natural then that I was also tasked with integrating said assets into the game. The trickiest part here was the animations, where as part of the course criteria we needed to have some sort of spritesheet included in our game. We technically only needed one or two animations via spritesheet, but because I wanted to make the style of the game consistent, I endeavoured to make animations for basically every object except the backgrounds. In essence, each row was its own object or variant of an object in the game, with the following columns a frame of animation for said objects. Due the amount of objects, this resulted in a massive 39 x 8 spritesheet including basic animations for every single enemy and item, as well as an animation for every single movement option the player had. This isn’t even to speak of the boss sprite, which required a 5×11 spritesheet of its own, accounting for idles and attack animations in their own rows.

The most challenging parts of the experience were making sure whatever I built was compatible with the rest of the team’s work, keeping the systems tightly-knit. This included integrating animations to correspond with a team member’s WASD movement and mouse-based direction of the player character, as well as a save/load system that needed to remember the current state of the shop room. Both these tasks required close communication with my team members to understand their work and refactoring parts of their code with the code I’d written, resulting in a more robust and clean result that combined our efforts.