So this semester I had the pleasure of working on a beautiful poetic-experience called Silent Moon. Silent Moon is a 3D poetic-experience about the moon exploding. The player has to collect the shards of the moon and piece it back together while exploring the island they’re on. I worked on a 4 person team as the Creative Director. While my primary focus was crafting and deepening the vision for the game, I also created and maintained the physics engine, wrote level edit and property managing functionality, created height-map based terrain, and crafted some interesting moments and experiences for the player.
Being creative director on a project like this is always a purifying experience. Poetic-experience visions need the utmost purity in order to succeed, and I really enjoy exploring the implications of this. This year, I had a great team to work with, and we all had a hand in crafting the initial vision. We would have these really great team meetings where we would brainstorm and find the ideas that resonated with all of us. After we found these ideas, which in this case happened to be a mix of moonlight, magic and beauty, we could start crafting the game itself. Working with our tech director was great because he was always receptive to input and was sure to ask of me what he needed as well.
One of the major challenges of this project was definitely scope. Being that we only had 4 developers an art consultant, and a sound designer, creating a poetic-experience was going be a challenge. Although I was the Creative Director, I was also the strongest voice when it came to scoping our project to an appropriate size. Though we went with a minimal art style, with the lighting and particles we created I feel like we really got a beautiful look to the game
A big responsibility of mine in the early stages of the project was not only managing vision, but getting a simple 3D physics engine up and running. I had done a simple 2D physics engine the year before, but jumping to 3D was not an easy task. After the challenges of the year before, I had become very resourceful, and had no problem finding out the right people to ask and the right books to read up in. I got a decent axis-aligned, cube physics system running fairly quickly. I also ended up researching and implementing some ray-casting so we could have object picking for our level editor. Though physics programming isn’t what I want to pursue as a mainstay of my career, I do enjoy toying with physics engines and I’m pretty happy with my knowledge of the inner workings of them. I also made some great friends who are currently working on a game engine who are extremely well versed in game physics.
After I had completed the basic physics for the game, the next task I jumped to was level and property editing. I asked around and decided to try AntTweakBar as a simple start and really like the simplicity of it. With a few lines of code, I could have a window up and running on top of our game. I decided to wrap the functionality of AntTweakBar inside a system in our game engine so that each of the team members could use it without having to learn the interface or commands. With the implementation of some simple messages, and a slightly more complex back-end, anyone on the team could add information to the tweak bars with a self explanatory message. Add a label was as easy as “MessageGUIAddLabel(name)” and sending that off. Although this did limit certain functionality, I made sure to poll the team constantly to make sure every feature they could need was included and east to use. After a few steps concerning some callback function weirdness and some ray-casting implementation, I had a good property editor as well. Although AntTweakBar is on the simpler side when it comes to GUIs for games, I really enjoyed fleshing out what I could and adding such a large amount of functionality to our game.
The next big hurdle for me to overcome was that our game had flat terrain. Due to the simplicity of the physics engine, we could only craft the environment out of cubes and other flat, oriented surfaced. We initially thought this could work, and that the terrain would just be limited by artificial walls. This just didn’t feel right to me, and I felt that the world needed more natural boundaries. I decided that the environment should be a mystical island of sorts. In order to do something like this, we would need really organic terrain. After talking to my awesome physics buddies, I decided to go with a height-map based approach.
The first thing I did was implement a simple bitmap converter which read in and stored the R channel of a bitmap as the height. In order to smooth player movement, I also implemented bi-linear interpolation when requesting the height from a certain position. This worked pretty well, but there was a bigger problem. The heights were restricted to 0-255, which for a map of the size we were using, meant that the terrain ended up looking very minecraft-like. I implemented a smoothing algorithm to combat this, but it didn’t help nearly as much as we needed it to. I ended up stripping out the entire reader and re-writing it to accept a 16-bit greyscale format. After working out the bugs for it, it worked fantastically. The terrain ended up being buttery smooth and looked amazing. Now I could sit down with photoshop and sculpt the terrain to my whim and watch as the entire world of our game changed accordingly.
When we started coming up on the final milestone of the semester, I switched gears one final time into creating experiences for the player. The first step I made was creating light paths. The main purpose of the game was to go and collect moon shards and bring them back to the shrine. I thought that that alone was pretty neat, but it needed more oomph and more magic. I knew we had the ability to create dynamic lights at will, so I started experimenting with creating a path from the player to the shards out in the world. Having this surreal, magical entity would also help with the feel of the world.
The first iteration was pretty rough. It was just a straight path of lights every two feet or so, all the way from the player to the shard. Not only was this a little plain, but it appeared instantly and bogged down the CPU when the paths got too long. I figured it needed to feel more organic, so I added a soft fade in to the lights and also made them appear sort of wobbly in their formation. By simply making a straight path into one that gently wandered left and right, it added a simple, organic beauty to it. I also limited the maximum number of lights that could be out at one time. This created a sort of light snake that wandered along the ground to lead the player to where they needed to go. A simple addition to the path to only let it move when the player was close completed the experience.
The player could now collect moon shards and be shown around with a beautiful light path, but there was still something missing. I felt that the player needed to feel some sort of progression. With a limited time schedule, I had to do something that was magical, but I could accomplish as fast as possible. I had some great conversations with our graphics programmer about his particle systems, and ended up attaching one to the player. As the player progressed and collected more shards, this particle system gradually became longer and floatier. When a player starts, they have a tiny trails of grounded particles behind them. This was hard to notice in general, but as they collected the shards, an increasingly magical trail would be left behind. I also did something similar with an attached light. Because the landscape was so dark, any light is very apparent. Having a light that grew with the player ended up adding a nice touch to the overall experience.
This semester was an amazing game development experience for me. I really enjoyed being Creative Director for the project, but also collaborating with my team. Making games that contain unique beauty is really important to me, and I’m always inspired and motivated when I work on a project like this.