This my final project write up for the Game Engineering II class. As a part of the final project, we have to use our engine system and someone else’s engine component and create a small game out of it.
The game I choose for this final assignment is the old classic frogger. In frogger, player controls a frog and has to navigate it across the screen, dodging or using the obstacles. What I initially thought was I would make a game very similar to the frogger in terms of gameplay (maybe not visually). But after working on the game, it turned out to be quite complicated and I decided to pivot from the original frogger. I took this decision as I was having some difficulties integrating the collision system in my game, and hence decide to move away from complicated collisions. I still have some collisions, but that’s just basic 2D box collision with the walls for making my game work.
For the new game, I decided to take inspiration from the original frogger with some tweaks. In original frogger, the player controls the movement of the frog but in my game, player can only change direction once the movement is started. To explain the game in a nutshell:
I will be using the audio system I created for this game. Bare-minimum, the game will have a background music, a player dying sound effect and the level complete effect. Also I have added the controller support for this game. I used Sai Pavan Koundinya Upadhyayula's controller engine component. Adding controller was pretty straight forwards as he has a pretty easy interface to use his library. I will go through the technical details of adding the controller in my next update.
I integrated the following features in my final project:
This was as simple as anything we have done in our class. He had Controller project which we can easily add to our project and controller can be used after that.
Only thing required to setup this was to initialize and cleanup controller in out cbApplication class, but since everyone of us was already familiar with this, using controller as a whole was super simple.
Ekshit's Particle System
For using the particle system, we need to include two projects; Particle system and the Particle system builder. The concept was same like mesh or effects as we have done before; builder is used to build the particles from the lua file and Particle system was the project which contains everything related to particles. Using these particles was also simple (it looked a bit intimidating initially as we have to update the graphics buckets we were submitting and rendering), however it required few additional steps for using these properly.
An additional data for the particles was added to the graphics buckets we are using. As we have submitted the mesh effect pair, we will now submit the particle as well. I added this particle in my mesh effect struct and and checked if its not null while binding and drawing this data.
Thing I liked about this component was it was a nice revision of small things we learned at the start of the semester.
Final Project Learnings
Controls: W S A D or Left Controller joystick to move
Space or 'A' key to brake
While making the final project, few of the place that I got stuck were:
Looking back at this final project and the semester as a whole, I would say that my biggest learning is regarding the linker errors. I still remember how worried I used to get whenever I see any linker error but now they seem pretty primitive and I am confident enough to resolve them.
Being the graphics class, my knowledge of OpenGL and Direct3D is more than it was 6 months ago. Though we specifically didn't write any code from scratch, going though JP's code has helped me improve my graphics understanding and how the graphics pipeline works.
Datatypes, Memory and Optimizations: This is something which I have been doing since the start of this school, and this class improved my understanding of how to effectively utilize different datatypes in different situations. I also encountered the ill effects of premature-optimizations.
Platform Independence: This was something JP stressed a lot on and the system really works well when we take care of different platforms. Interfaces should be platform independent with their platform dependent implementations.
Few other small but important tricks I learned in this class are: