A Test of Metal
A Test of Metal was my first taste of designing a game from scratch. This was the game that introduced and inspired me to the world of video game design. This game was a project for a game design course I took in CSULA during the summer. We were asked to design a 3D platforming game within three weeks as we learn the Panda3D game engine in Python. There were few things provided for my game: the character models(ATM and Pete, the panda), the spinner that I used for checkpoints, and their animations.
Oh, before I go only further, if you're wondering why the main character's name is ATM, its NOT because he's a cash machine. Look closely at the title of this game.
One of the requirements was to have three stages for the game. With each new stage, there should be new mechanics introduced. I first started by imagining what my stages would be. I wanted my game to also have a few puzzles in the stages, so I included a simple key to switch mechanic in the starting area. When the key interacts with the switch, it will unlock some area in the stage. In this case, the movable silvery sphere would be the key, and the switch would be the gap on the side of the wall where the sphere would fall into.
The starting area alone took several hours to design and build. The difficulty partially came from the documentation of Panda3D. Nearly half of the function calls, or libraries I looked up in the documentation were either missing or outdated at the time. Unlike Unity, Panda3D had no similar feature of a game view that allows you to test your game as you design it. To test every block I placed in the world, I had to load up the game and move the camera to that location. If I had done this for every block I placed, it would take weeks to finish checking the first stage! I had to come up with some sort of a system for a faster level development.
"25, 25, 2, 0, 56, -1, techno"
You might have guessed what that line was. The format goes like this: width, length, height, x coordinate, y coordinate, z coordinate, and texture type. Each of these entries tells my code to generate a block with the above parameters. I saved these entries in multiple text files for each stage so I can track them easily, and perform quick calculations to see if any of my game objects were overlapping. From then on, anytime I needed to modify a game object or add a new one, I simply refer to the corresponding text file for edit.
Almost immediately, I noticed how difficult it was for my eyes to estimate where ATM would land. This was because I had no background! If the background and all my scenery were static, how could I tell if I'd actually moved? Another immediate problem was my camera. It was constantly going behind the walls of my starting area and I couldn't quite figure out how to have it automatically zoom in properly. As an alternative solution, I tried to make any interior rooms as big as possible.
To address the first issue with the static background, I added background image for my stages. They weren't overly complex imagery, but rather a composition of different shades of colour. They serve wonderfully as a perceivable visual cue of movement. However, sometimes they were not enough.
On the right you will see a picture of ATM looking at Pete, who is floating. It was difficult for me to accurately pin point where ATM would land on this portion of stage 2 due to the platforms being invisible. I needed constantly look down as I jump. To remedy this, I added several large pillars that existed purely as aid for visual indication of movement. Without them, it was hard to tell if where I was landing. It was at this point of development I started exploring the idea of wanting safety. What if you don't know where you're landing is safe?
Most of stage 2 revolves around invisible platforms. They were introduced initially by Pete, who guided ATM through the invisible path. Since Pete had a scripted path, there weren't any real danger for the player when they make the jumps to the next platform. Well, the scripted AI held the player's hand and guided them through the danger like Toriel in Undertale. If I reused Pete to guide the player through, this stage would be terribly dull, but I can't simply remove the visual cue of an invisible platform...
"I've got it! They can create their
own visual cues!"
I placed a sphere that I used as key for the key and switch mechanic onto the invisible platforms. How helpful were they? Well, that depends on the player. They can push these spheres to predetermine if a spot was safe to walk on without sacrificing the thrill of jumping around on thin air!
So far, every encounter with Pete had been helpful. Pete provided extra lives, gave hints, and guided ATM through stages. Perhaps it was time ATM returned the favour. In the picture below, the player now had to guide Pete through a stage instead. There were lava oscillating up and down through a pathway. The player simply command Pete to go forward or stop. By safely guiding Pete to the end, the path to the next stage opens.
Pete is over here!
"Lava! Lava everywhere!"
Stage 3's theme focused heavily on hazards if you haven't guessed it by now. The idea was to create an atmosphere with a constant threat and fear of being incinerated. Kind of like this paragraph being squished in between lava.
In most video games, lava tends to have animation even when used as a background. I'm not an expert on graphic design, but my way of simulating moving lava was to have the entire floor of lava image shift towards a single direction on the xy plane while elevating up and down. I was very proud of the result that I got.
These lava were ALIVE!
I threw a twist in this stage with how the lava worked. I mentioned earlier that the lava did not stayed at a constant level, they also do no oscillate at a constant rate, sort of. Here's how it goes. The lava slowly descends at a fix rate, the ascends with a faster rate. This made the timing of this environmental hazard slightly tricky. The best comparison I can think of is procrastination(which I personally do not do). You know exactly when something is do, but you have so much time before it is due that you mind put this 'something' in the very back of your mind. As due day approaches, you realize, crap! Due day is approaching, and its approaching FAST! The lava will always stop at certain point. When it recedes, it does it slow, giving you false sense of safety through the amount of time you think you might have before it rises back up.
"Don't tell anyone this, but..."
I made a stage 4. Our requirements was to have three stages, so I kind of sort of snuck an extra stage at the end of stage 3 and called it stage 3. I couldn't resist the temptation of this great idea I had. Like writing a good essay, you have to finish up what you started by summarizing all of your main points and end it with a BAM!
The idea of the final stage was to climb a tower with a time limit. The time limit wasn't specified in numbers, but rather by the rising lava. All the elements from previous stages were reintroduced in this final stage. I enjoyed video games that reuse mechanics that were taught early on, and I employed that idea for this stage.
Final thoughts and a thing you might have missed
When I looked back on those three weeks of development, I'm always concerned with how obsessed I was with this project. My everyday schedule at the time goes like this, wake up, code, eat, code, eat, code, sleep. The only time I went outside was to attend class. Honestly, I didn't mind that I shunned myself away from the world for three weeks. I was excited to learn what I can create in the virtual world. I had never been happier. This was fun, this was everything! And the fact that I can do this for a living in the future? Yes, please!
I mentioned before that graphic design was not part of my skill set, all these textures I have in the game came from an open source site where artists would share their work. And here's a silly thing that even I missed until I took another look at my game two years later. If you scroll up a little bit to the pictures of stage 3 and squint, you can make out the watermark on those lava textures.
At the end of my game, I wanted to do one last thing to my game, something fun. Because of the way I implemented my stage generation, I was able to come up with a neat idea.
"Taste the Rainbow"
Just like that one Skittle commercials said! I left this as an option in the main title, if its enabled, every single block in the stage will have a random colour.