Senior Capstone
Friday, April 5, 2013
Menu Sounds
So I've been improving the experience of the menu screens. I have made sure that sounds sync up to menu choices along with music looping when exiting game or starting the game. I made the game so that you can now mute the music sound or sound effects. There was also a bug where you press the "A" button on certain menu buttons and it asks if you want to delete the game when it shouldn't. Finally, I found bugs that were lagging the game because some sounds that were being loaded into the game were not being preloaded which caused glitches the first time you jump or roll, or slide, etc.
Friday, March 29, 2013
Game Sounds
One of the biggest things that the game lacked this week was sounds. There were a couple sounds but there needs to be so many more. I coordinated with Max, the art lead, where he found all of the sounds and I put them into the game at the right spots. Some of the coolest stuff that I worked on was implementing the sounds for the menu screen. I wanted to make sure that you knew quickly what buttons do what so I made sure that I made a sound for all errors as well as transitions between what you want to tell the menu screen what to do.
I also did a lot of evil testing in the game and found many bugs that were very small. I was able to fix all of them on the spot including:
I also did a lot of evil testing in the game and found many bugs that were very small. I was able to fix all of them on the spot including:
- A way to make sure you know that you are dead.
- Making nothing workable when an important message is showing on the screen
- Unloading and Loading each level properly with proper disposal of elements
- Deleting the Game progress error that shows up
- The music playing on top of one another every time a new level is loaded
and many other bugs. When creating a game, you have to be the devils advocate and try to destroy the game in any situation. That way someone doesn't detects the bug when they buy the game.
Friday, March 22, 2013
Loading Screen Between Levels
So now that we are creating multiple levels instead of one big world, I needed to get every level to have a loading screen before it loads into the game. To do this we needed the loading screen to appear dynamically instead of statically. I had to modify a lot of the code from before and make it work with our new level system. It was a cool setup because I was able to queue a level into the level manager. I would then load the loading screen until everything is loaded, finally when everything is finished I load the level completely at the end before the game screen appears.
I also did many little tweaks to the menu screen. I made it so that the menu screens are more user friendly than developer friendly for first time viewers. I also prevented accidental exits in the in game start menu so that if you accidentally press a button, it would go back into the game when pressed by a child or accidentally. Finally, I found another method to pause the game when the "Guide" is showing so I took away our static approaches to pausing the world on pause and now it pauses the camera and everything connected to the character when pausing the game.
I also did many little tweaks to the menu screen. I made it so that the menu screens are more user friendly than developer friendly for first time viewers. I also prevented accidental exits in the in game start menu so that if you accidentally press a button, it would go back into the game when pressed by a child or accidentally. Finally, I found another method to pause the game when the "Guide" is showing so I took away our static approaches to pausing the world on pause and now it pauses the camera and everything connected to the character when pausing the game.
Friday, March 8, 2013
Save Manager Loading Abilities
This week, I worked heavily on getting the save manager work completely with loading of the game also. I had to change some of the methods of the save according to the game and get it so that it would save the checkpoint you were at, the abilities you have and your health and mana.
The save game data worked very well and I was able to get the loading of the player data working so that if you quit the game and come back in, you will still have the same abilities as before. Since we are using Unity for our level object importer, it is tough to set the elements on the map to certain loaded events. Currently, we have to statically manual-script checks to see if it is a certain ability and add it if it is.
The game looks superb and is making on its way. We have a new level and new abilities that makes our game look a lot more lively.
The image below is our new start screen that shows your avatar before entering the menu screen.
My favorite is the new scroll layout that is in the bottom left corner of the game. It tells you what to do and what you can do.
The save game data worked very well and I was able to get the loading of the player data working so that if you quit the game and come back in, you will still have the same abilities as before. Since we are using Unity for our level object importer, it is tough to set the elements on the map to certain loaded events. Currently, we have to statically manual-script checks to see if it is a certain ability and add it if it is.
The game looks superb and is making on its way. We have a new level and new abilities that makes our game look a lot more lively.
The image below is our new start screen that shows your avatar before entering the menu screen.
We also have a trail technique that follows behind you so you know where you came from. We call it the ribbon effect.
My favorite is the new scroll layout that is in the bottom left corner of the game. It tells you what to do and what you can do.
Friday, March 1, 2013
Knit Picky Bugs
This entire week, I worked mainly on knit-picky issues. They were issues that needed to be addressed but have not been fixed yet. I worked on
Main Menu
Level Exiting
Scroll Up
Main Menu
- Inside of the main menu, there was an issue that whenever you pressed the "Guide" key, the Xbox would allow you to log-in. The issue is that everything in the background was still listening to inputs so by the time you enter two-inputs, the game may have started. I modified a Screen Wrapper that checks for this condition and disallows any inputs in the background while in the "Guide".
Level Exiting
- When exiting the level, it would show a "LOADING" Screen, I changed the text and also made it so that the game unloaded correctly.
- It turned out that our Draw Manager looses pointers to some of our objects which cause the objects to be drawn as static objects, including a clone of the player. To disable the draw manager from drawing these lost objects when exiting the game and reentering the game again, I wrote a script that would check for all objects in the draw manager that didn't have a pointer to it and cleared it from the draw manager.
Scroll Up
- The weird issue with the scrolls being ups is that you can control the player in the background while the scroll is up. I disabled his movement while he is on the ground. I've also disabled camera movements, shadow bolts, and jumping movements with the condition that the game should be paused.
Friday, February 22, 2013
Menu Screen and Trajectory Mapping
This week I worked with James in getting the Menu screen to work better. I moved the "Delete Game State" into the Options bar and also re-factored the menu screen so that they can be made more simple and easier to read by other programmers. The open source data we found online had the menu code but it was in the worst form to read and would take hours to just understand a menu screen before being able to add to it or create a similar game screen.
I also worked on trajectory plannings of static objects. I sat down and wrote out the physics equations to get the trajectories to work the way I would want them to. I was able to add constraints to the trajectory of objects using a cubic interpolation. The equation I came up with to make smooth transitions used the constraints:
I also worked on trajectory plannings of static objects. I sat down and wrote out the physics equations to get the trajectories to work the way I would want them to. I was able to add constraints to the trajectory of objects using a cubic interpolation. The equation I came up with to make smooth transitions used the constraints:
- Initial Position = q_0
- End Position = q_1
- Initial Velocity = End Velocity = 0
- Time Table = 0 .. 1
- Position at time 0.5 = (q_0 + q_1)/2
- Acceleration at time 0.5 = 0
The final equation solving for these constraints is:
q(t) = q_0 + (q_1 - q_0(3t^3 - 2t^3)
I'm excited to use these next few days to make dynamic moving objects in the game using this equation inside of the game.
Friday, February 15, 2013
Raycasting Group Collidables
This week I was able to implement and finish a system that BEPU supports called GroupCollisions. I made different groups like buildings, enemies, characters, etc. that kept track of its collidable objects which would make it easier and more efficient to compute collisions between objects. Before, our game frame-rates were being killed by looking through each collidable and having if statements that checked between collidables. Now, we don't have to have a bunch of code that checks these flags and now we can check items by raycasting to specific groups or ignore specific groups. I spent all of my time this week cleaning the code this week and making static methods that will make it easier on programmers to implement checks.
Here is my interesting piece of code.
List<RayCastResult> results = new List<RayCastResult>();
return physicsSystem.RayCast(ray, dist, entry => entry.CollisionRules.Group == Game1.Instance.BuildingCollisionGroup, out result);
As you see this interesting piece of code, "entry => entry.CollisionRules.Group == Game1.Instance.BuildingCollisionGroup", you will notice that it is doing everything we need to do in one line of code. This is called lambda inline statements. Before, we had to call an entire function that would take care of a bunch of collision checks before returning the result. Now, we only have to call a simple group test which uses a binary tree to speed up the process as well as reading ability. I then made simple method calls in a RayCastManager which is a static class where programmers don't have to worry about learning lambda calls and can easily call RayCastCollideWithGroup(Buildings) instead.
Here is my interesting piece of code.
List<RayCastResult> results = new List<RayCastResult>();
return physicsSystem.RayCast(ray, dist, entry => entry.CollisionRules.Group == Game1.Instance.BuildingCollisionGroup, out result);
As you see this interesting piece of code, "entry => entry.CollisionRules.Group == Game1.Instance.BuildingCollisionGroup", you will notice that it is doing everything we need to do in one line of code. This is called lambda inline statements. Before, we had to call an entire function that would take care of a bunch of collision checks before returning the result. Now, we only have to call a simple group test which uses a binary tree to speed up the process as well as reading ability. I then made simple method calls in a RayCastManager which is a static class where programmers don't have to worry about learning lambda calls and can easily call RayCastCollideWithGroup(Buildings) instead.
Subscribe to:
Posts (Atom)


