| Abstract | |
| Game Name: | Bit Cemetery |
| Development Team Members: | Daren Makuck, Rick Matchett |
| Game Genre: | Part FPS, part action/RPG |
| Brief Description: | In this game you are 3D, the descendant of 2D. The spirits of your ancestors have been trapped inside of graves located in the Bit Cemetery, and it is your job to rescue them from the evil spirits that lurk in the nearby decrepit cathedral. |
| Overview | |
| Game Story / Objective: | The goal in Bit Cemetery is to enter each marked grave and free your ancestors' spirits by defeating levels from old games, and then destroy the one that locked them there in the first place. |
| Game Mechanics + Controls: | FPS w, s - move forwards / backwards a, d - strafe sideways mouse movement - change direction you are facing left mouse button - fire gun [after obtained] NES game levels a, d - move sideways w, s - move up / down [Zelda level] e, r - activate powers [after obtained] space - jump [Super Mario Bros. level] |
| Technology: | We used particle effects for the gun explosions in the 3D world and had more collision detection than anything else in the game. From height fields to level map grids and enemy collisions, basically every aspect of our game has one or more collision detection functions doing calculations on it. |
| Aesthetics: |
FPS While the NES games would be fairly simple in their implementations and design, we wanted our 3D levels to be a lot more detailed and as perceptually stunning as possible. NES game levels For the NES levels we wanted to stay as true to the originals as possible, while adding in an RPG element that would make it interesting and fun to play even though the player has probably beaten the game multiple times. |
| Reflections | |
| Three Greatest Challenges: |
Writing multiple sets of game mechanics: Writing one set of game mechanics takes enough time as it is to complete, but having
to write one for each level that we had to accomodate a 3D model as well as multiple 2D models for the different NES games takes a lot of time
and patience to get right. We ended up with two sets of collision detection for just about everything in the 2D levels to deal with the
different game models (Super Mario Bros. is side-scrolling whereas Zelda is a top-down perspective) as well as a seperate one to deal
with the 3D world. Combining 3D with 2D: As was stated above, writing one set of game mechanics is hard in its own right, but combining a 2D game with a 3D game takes a bit of coordination to make sure everything connects well and doesn't overwrite variables that each world uses. Cutting content: We had so much content that we wanted to add for our game that we just never had the time to do. We had to cut levels from the 2D portion of the game because we didn't have enough time to adapt our code for the new levels, and so then we had to go back and edit the 3D portion of the game to make up for this. We were shooting for the stars but forgot about gravity, so to speak. |
| Three things that went right: |
FPS 3D sound: 3D sound was implemented using FMOD. You can tell where an enemy is attacking from by the direction of the sound source. Collisions with objects: The simplified collision detection on the XZ-plane made checking the collisions very easy. Collisions on the Y-plane were disregarded. Collisions with bullets: No bullets are drawn. The selection buffer was used to check if the mouse was clicked when the cross hair was over an enemy. If it was, that mean the enemy was hit. A ray was then traced to where the explosion should be setup. NES game levels AI: The AI for Super Mario Bros. ended up being very simple to write (if the enemy is on-screen, move it to the left unless there are special circumstances. Also, I didn't know what to do for the Zelda AI and just ended up changing the positions randomly for the enemies at difference intervals, but it ended up coming out pretty well. I especially liked how the bat enemies turned out, as I think that their AI adds a little more to the game atmosphere than it did in the original. Preserving the original games: I feel I did a good job of preserving the original NES games while adding something new to them. Granted, I was expecting to do more with what I had, but being able to replicate the first levels of both Mario and Zelda was quite an accomplishment for me Graphics: The graphics for the 2D games ended up being just how I wanted them. I didn't want to make them cheesy by adding particle effects or trying to make them 3D. I'm glad I was able to re-generate the levels from the original games and keep the 8-bit feel of them. |
| Three things that went wrong: | FPS The animation process: Using motion capture data in Milkshape3D was not straight forward. The skeleton could not be moved once loaded, or the animation would be affected. The model itself had to be modified to fit the skeleton. The tools provided with Milkshape each had there own downfalls which made them difficult to use at first. Collisions with enemies: Player health is subtracted f the player collides with an enemy. I originally wanted health to be subtracted only if the enemy was attacking. However, there was no way for cal3d to know when an animation had finished executing, making it difficult to know if an enemy had stopped attacking. Enemy AI: Nothing really went wrong, but I wanted to work on this more if I had more time. NES game levels Implementing game physics: I went through three different physics models before getting one that worked for the Super Mario Bros. level. I started off using time to determine the player location, but that ended up sending the player through the floor if the system lagged at all near the end. I felt it would be be too much work for the system to have to find a time where the player wouldn't collide with the ground. Plus, I felt that this type of model just wasn't appropriate for the game and ended up switching to and using a velocity-based model, however this system can have varying results depending on the system used. Replicating existing games: There were many features from games that I felt needed to be implemented but didn't get around to. Replicating existing games is extremely hard if you're a perfectionist, and you end up having to throw out a lot of things if you want to get anything done. I ended up with half of the 2D content that I wanted because I simply didn't have enough time to make every game as exact as I wanted it to be, and I spent too much time in the beginning trying to make everything perfect. Taking into account different screen resolutions: For the 2D portion of the game I had dual monitors with two very different resolutions. I tested my game on both monitors, but (I realize now) I never changed the screen size for the display window, so I never was actually changing the resolution for the game. I ended up frantically trying to make a bunch of last minute changes to make up for the changes in resolution, but the function that printed text to the screen used different ways of calculating positions for the x and y coordinates, so the x coordinates ended up being offset a bit from where they needed to be when I fixed the y coordinates. |
| Lessons learned and/or things that you would have done differently: | We learned a lot about loading 2D/3D models and animating them, loading various 2D/3D animations, using sound, collision detection methods, AI, and how to make a game fun by combining the 2D and 3D worlds. If we were to start over we would probably plan out our game content a little better as there was quite a bit that we wanted to put in our game but we never ended up being able to do. |
| Media | |
| Screenshots: | Beginning of the game Final Boss Super Mario Bros. level Zelda level |
| (Optional) Download: | Download Bit Cemetery! |