Ping was a 3D horror/thriller game developed during my junior year at DigiPen. You use a sonar wave to see a static version of everything in the environment. It was written in C++ over about 40 weeks. We started development during the Summer of 2013 and finished in April of 2014. Ping had three developers, one designer, two artists, and two sound designers. Ping was a great showcase for the developers and designers. Unfortunately due to the mechanics the artists work is hidden most of the time so their work is under-represented but remains important to the game as a whole.
I was the lead engine developer for this project; after a few years of learning I felt ready to take on the role. I opted for a component-based design after our game the previous year. This proved to be useful for designing a more robust engine that could handle the scripting and tools requirements that we had. I did a lot of research on existing engines to learn how they stored the objects, object references, names look-ups, etc… I landed on design using linked lists that allowed me to add and remove objects quickly at the cost of increased look-up times. I got inspiration from reading Valves entity class headers on github. (link)
The components were stored in an array and predefined components were given a static location in an array per object. This allowed us to have components that were built into the engine and dynamic components that were created by scripts. It was an important distinction because it allowed us to have many objects with built-in components. Since we had constant look-up times per component for rendering, gameplay, and physics updates we didn’t have to worry about 10,000 objects causing the game to slow down purely because we had to query the transform 10,000 times.
I also worked on a 3D editor that included translate, scale, and rotate gizmos. It had copy/paste functionality and the ability to run the game from inside the editor. It was the most technically advanced project I had worked on and it was also used every day by our designers. I used the meta/reflection system that another developer wrote to present all of the component information to the user and to save or load the levels and objects. I used AntTweakBar (link) like I had the previous year to render GUIs and display object information.
Ping was a really fun project to work on. We struggled to get all of the content into the game that we wanted but it ended up being a great showcase of everyone’s talent regardless.
Find it on the DigiPen Game Gallery: Link