Welcome to the overview showcase page for our California State University Channel Islands computer science capstone game project called Captureball.
Captureball Video Presentation
What Is Captureball?
Captureball is a 3D online party game in which 2 teams of 4 compete to eliminate each other in the ultimate dodgeball competition. Players start by joining a match alongside other players where they will be able to compete against each other. The goal of each match is to eliminate all of the opposing team’s players before they are able to do the same to your team. Eliminating opponents can be done in a variety of ways such as throwing balls to knock them off an edge, picking up players themselves to throw them off, or by simply avoiding the chaos entirely and surviving by dodging balls thrown your way while managing to stay on the ever collapsing stage. Other strategies such as storing balls in goal regions might also be implemented by players to save up for times where they could be better used. As the match progresses balls will likely reduce in quantity as some will fall off the stage but this is combated with a ball generator which spawns balls at random parts of the stage so that players will always have something to us. Until the match inevitably concludes with on team named the victor, alive players are able to run around, jump, and pick up and throw balls while players who have been eliminated become ghosts which can only hover around and bring balls to teammates.
Captureball is designed to be simple and intuitive game in which players can just pick up and play. As such Captureball only has a handful of buttons those being:
- Movement = WASD or Controller Joystick
- Jump = Up Key, Spacebar, or Mouse Right Click
- Pick Up/Throw = Down Key or Left Mouse Click
- Camera Rotation = Left/Right Keys or Slide Mouse
Even though there are only a handful of controls, there is much more depth to the game than immediately meets the eye. To start, the jump mechanic can do quite a bit more than just jump. If players jump without moving they will jump vertically up which is great to be able to dodge incoming balls whereas if they choose to run and jump they will jump in the direction they are facing leading them to jump fast and far in that direction but not as high. As a result the directional jump is typically better used to for some additional speed when moving around the stage while the non-directional jump is better used to as a tool for dodging balls. On top of this players also have the ability to hold down the jump button which allows players to duck below balls and fake out opponents.
Besides the Jump mechanic, players also have the ability to pick up and throw balls. When the player is not currently holding anything the player will pick up anything which is directly in front of them. This mechanic can be used in a variety of ways such as picking up balls on the ground as well as balls thrown at you by opponents or passed your way by teammates. Since this is just a general pick up mechanic it also means that players are able to pick up other players including both teammates as well as opponents. As a result players can use this to save teammates by catching them if they are falling off a ledge or could even use it in combination with the throw mechanic to throw opponents off to their doom. As you could probably figure out, this button transforms into a throw once you have something picked up and again this mechanic is able to be used in a variety of ways. Players can use the throw mechanic in more traditional ways to throw balls either at their opponents to knock them off or into their goal areas to store them for later use as well in more creative ways such as hurling opponents off edges or throwing teammates to pick up balls before opponents have the chance to get to them or something of that nature.
Beyond this players have the ability to combine all these buttons in unique and interesting ways allowing them to do things like jump around the map to both evade an incoming ball as well as to catch a player who might have been knocked away by an opponent to save them from falling or leap towards a ball to get there before an opponent has the chance. Despite the controls being rather simple, there are endless combinations of ways to use those moves truly making it a game that’s easy to pick up but hard to master.
The Development Process
The development process was one consisting of many steps both forwards and backwards with many iterations. Initially we started developing our own game engine using the Lightweight Java Game Library OpenGL, but after developing the basic 3D visuals decided it would probably be for the best to develop this game in C++ for better efficiency but mostly to get ourselves for familiar with the language as it is very popular in the field of 3D game development. As such we decided to ditch our project and restart our game engine from scratch in C++ once again using OpenGL. This plan did not last long however as we realized it was probably going to end up being a little too much work for the amount of time we had available to us especially since we were both new to C++ and had to juggle learning that with creating not only a game but a game engine alongside it. As a result we decided to ditch our project once more and instead build it in C++ using Unreal Engine 4. We both did not have much experience using Unreal Engine and thus spent a large portion of the development cycle not only learning how to use C++ but also Unreal Engine although this was much more feasible than creating a game engine from scratch.
When we first started developing Captureball, the arena was huge with many obstacles scattered across the map with high and low parts of the terrain. We soon realized that the game started to feel much more like a 3rd person shooter game as compared to the party-style dodgeball game we had intended and we thus realized that things were going to have to be significantly simplified both in terms of the map as well as the controls.
After cutting down Captureball to be a simple box stage with balls in the center and only a few controls, the game started to become more and more like how we envisioned it to be. Even though our game idea started to become more and more like reality, there was still much more progress to be made until the game would reach its final stages. At this point we started to implement things like the capture goal mechanics, other players, ball spawners, and a disappearing ground.
After implementing the basic game mechanics like player movement and elimination we started to move onto networking which would in theory would allow players to connect to a game server and compete against each other virtually. As anyone who has ever done any kind of computer networking before knows things always go wrong and do not work as you intend them to as a result this area left us with a bit of a roadblock for quite some time. We decided to use a dedicated server setup with help from AWS in particular Amazon GameLift. With AWS and GameLift we were able to set up a backend dedicated server system with only a very small team of two people.
The dedicated server system GameLift plugin had to integrated with a custom build of Unreal Engine in order to be interface with AWS technologies. Once the plugin was integrated various AWS technologies could be used for the back end system like AWS Lambda, DynamoDB, GameLift Flexmatch for match making, AWS API Gateway for REST requests, and Cognito for user account management. Overall this took hours of learning how to use all these AWS technologies in order to be used in a multiplayer game. Unreal Engine provided various built in networking functionality that we could connect different endpoints to the AWS technology stack and the dedicated server running the Captureball server client. Communicating with the dedicated server during gameplay in particular utilized Unreal Engine’s built in RPCs(Remote Procedure Calls) and network replication systems that would allow important pieces of data to be sent to clients in real time using a UDP based protocol. This was a very challenging part of the project and took most of the time to implement, but it was a very rewarding experience.
After all the basics were said and done we started to more over to the polishing phase in which we polished up areas like character controls, animations, as well as started to add in menus such as a pause menu and main menu for match connections. The end result is the product playable today.
Throughout the development cycle we utilized a wide variety of applications some rather new to us such as Unreal Engine 4 and AWS Gamelift general the applications we chose to use were ones in which we were familiar with and have used extensively in the past which is why we chose to use them. The following is a list of all the applications we used as well as our uses for them:
- Visual Studio 2019 for our integrated development environment (IDE)
- Git and Github for version control
- Unreal Engine 4 for our game engine
- Krita for 2D concept art
- Blender for 3D models
- AWS Gamelift for networking servers and various other AWS technologies(DynamoDB, Lambda, Flexmatch, API Gateway, Cognito)
We would like to thank Professor Eric Kaltman as well as the students in COMP-499 Sec 005 for playtesting our game over the development cycle and providing useful feedback both with what worked for our game as well as things that should change and new suggestion for things to be.
Capstone From Home
Over the course of the year working on the capstone due to circumstances surrounding COVID-19 we were focused from the get go on working and collaborating remotely. We organized communication over Discord where we created a specific channels for us to post ideas and design documents to be easily accessible. Setting up a git repository early for the project also helped, as we were able to figure out how we were going to organize working on the various features of Captureball. Making sure there was a clear git workflow with separate feature branches and meaningful descriptive git commit messages helped cut down on confusion to keep the work that was being done at each step clear. Over voice channels we would converse about ideas, fixes, and time frames to one another when it became necessary. Occasionally our we would realize the initial goals for the project were too ambitious and would find ways to cut down the project scope into a lot more manageable while getting the basic intended functionality across. While going to university online the endless online video meetings can end up feeling very exhausting after going through more than a year of the current online system. This meant that if we kept our goals and tasks very clear each week we could minimize time on extra meetings needed and keep up better morale when working long weeks in front of a screen. Working on this in depth project in this environment came with various times of “burnout” where the small incremental progress would feel like no progress was being made for that week. Learning to deal with the burnout and constant working from home was a challenge, but ended up being a great learning experience for the both of us to overcome.