Indie Game Development - "Having fun, making fun"

Saturday, December 27, 2014

Dev Log - Working on the Environment

For the past few weeks I've been working on a host of smaller tasks all aimed at supporting the artists and finalizing the environment.  These include:

A skybox is a series of images of the sky and mountains that player's can see in the distance.  The temp skybox art we were using did not match the theme of the game, so I spent some time searching online for a website that licensed skybox art.  To my surprise there were none.  I then began researching how I could create one myself.  I found a software package named Vue and after a few tutorials was able to create a new skybox.  Our castle now rises up out of the clouds.

Procedural Terrain: 
Next I experimented with creating terrain using a height map.  This terrain would extend from our castle toward the skybox, creating a middle ground visually connecting the two.  This did not prove to be difficult and is actually pretty cool, but I could not pull off the look that we are going for, which is a series of columns rising up out of the fog.  It turns out we can achieve the effect we are looking for by simply modelling the columns we need.  In fact, we can do it with even less polys than the procedural terrain which is good for performance.

Instancing is a method of drawing multiple copies of the same model at a fraction of the cost in performance.  It is great for drawing trees and other objects that you can position procedurally and even animate.  I looked into using it for portions of our environment or for light fixtures.  However, it turned out not to be well suited for the limited number of static objects I was going to use it for.

Mip Maps:
Mip Maps are a way of reducing the texture size used on models that are drawn at a distance.  It can improve both the look and performance of a game.  Luckily, the Sunburn engine I'm using can automatically generate and manage mip maps.  I also tested the environment with a special texture provided by the Sunburn community that displays the recommended resolution of textures based on distance.  Our current max texture size is 1024, which looks pretty good but does become blurred at very close range.  If we have enough memory, I may increase texture resolution so they hold up even at close range.

Normal Maps:
The Sunburn engine supports both normal maps and emissive maps.  An artist had explained normal maps to me in the past, so I had a vague idea about how they worked.  I took the time to research how normal maps are made, and this is going to enable us to create much better looking props while keeping the poly count low.

LOD Models:
While doing some tests, I discovered that all the character's weapons add up to almost as many polys as our environment itself.  Ouch!  I talked to a producer friend of mine about plans to switch to different level of detail models for enemy weapons, and he suggested simply using a lower detail model for enemy weapons all the time.  We will try that out, and if it doesn't look good we can always switch between different detail levels later.

Cover Art:
We will be featuring avatar's on our box art as we did for Kick'n It and Ultimate Dodgeball.  Since we have three different character classes, I would like to show each class on the box cover.  So I searched through all the costumes available for avatars and chose a costume that best exemplified each class.  I then put weapons into their hands and animated the characters into different poses.  The screenshots I took of the characters can now be used to create the box cover.

Wednesday, December 10, 2014

Dev Log - Diving into Audio

I love sound effects in games. Without sound and music, games or movies simply don't hold my attention. I like to start with great music that really captures the action and character of the game. Both Ultimate Dodgeball and Kick'n It had great music. This was a bit of a dilemma for me this time as First Person Shooters rarely have in-game music. I compromised by having a powerful, inspiring soundtrack at the menu when the game loads and the player gets his first glimpse of the level. Then in-game, I switch to different ambient tracks that play based one what part of the environment the player is in. One of these is a mysterious, melancholy tune that I absolutely love, and that I hope players feel works well within the shooter.

I have probably twice as many sound effects in this game as I did with Ultimate Dodgeball. As has been my policy for years, every action or reaction in a game gets its own sound effect. Since I have three character classes and multiple powers, that adds up to a lot of sound effects. But the number of sounds didn't turn out to be a problem. Tracking down real-world sounds like the sound of a dodgeball hitting a wall or the screech of a sneaker on the gym floor is often more challenging than fantasy sound effects such as summoning a fire wall, which can be created from all sorts of different sound clips. The real challenge with doing sound in an FPS is that it is 3d sound.

  In Ultimate Dodgeball, the camera was relatively fixed in the stands while all the sounds came from the action on the court - which was in front of the camera. In an FPS, sounds are being generated all around the player's camera position. Therefore, the sounds need to seem like they are coming from the left, right or perhaps behind the player. Also, while in Dodgeball the distance from the camera to the action didn't change much, in an FPS, some sounds are being generated by action that is close to the player, while other sounds are coming from action that is far away. Therefore, the volume of the sounds needs to trail off over distance. In addition, games often implement a Doppler effect for objects moving quickly by the player's camera. None of these effects are actually difficult in themselves, but it does mean that managing the sound effects is going to take much more effort. And writing that sound effect manager is my next task...

Friday, November 21, 2014

Dev Log - Visual Effects

Last month I completed all the special effects in the game.  Although I used both 2d and 3d particle effects in Ultimate Dodgeball and Kick'n It using the effects system provided by Microsoft in the XNA code samples, I quickly realized I would need something more.  With three character classes and upgradable powers there are simply a LOT of special effects in the game.  Rendering that many particles would simple slow the game down to a crawl. 

In addition, there were types of effects I  wanted to do that the Microsoft samples were not designed to handle.  Luckily I discovered DPSF particle system.  While this particle system doesn't run on the GPU like the Microsoft system, it enabled me to control the orientation of a particle instead of always having it face the camera.  Therefore, I could make lightning, shimmers, walls of flame and portals.  Best of all, it supports animated particles. 

Now, instead of rendered hundreds or thousands of particles for a single effect, I could use another great tool - the TimelineFX Editor to create an awesome particle effect and export it as a sprite sheet.  I could then display that animation in-game on a single animated particle, saving performance.

Discovering these resources and methods not only enabled me to complete a much larger number of particle effects, but to step up the quality at the same time.  I'm excited to see what people think when I enter focus testing.

Friday, November 14, 2014

Ultimate Dodgeball on the Xbox 360 Dashboard!

I just received another early Christmas gift from Microsoft this week.  Ultimate Dodgeball is being featured on the Xbox 360 Dashboard!  Last year Microsoft featured it on their big promo spot and it shot up to 2nd place on the best selling chart.  This year it received the smaller promo spot, so it will be interesting to see where it ends up on the sales chart.  So far, it has risen from around #30 to #7, but I think it will keep going.  A big thanks to Microsoft for the exposure!

Friday, November 7, 2014

Bringing Programming to our School District

Last summer I met with our school district's superintendent and shared the video I made for him, and expressed my passion for providing programming opportunities for every elementary student.  He was very receptive, and I agreed to do further research on resources that would extend programming instruction into junior high, as well as for app creation. 

I presented my recommendations in a follow-up meeting with his team, and he asked if I would create a series of workshops to train teachers how to teach programming with Hopscotch and Scratch, in addition to a seminar to introduce principals to the Hour of Code.

In just a couple weeks I will be introducing the Hour of Code to principals in our district.  I'm very excited, and hopeful that they will adopt the Hour of Code at their schools.  Last year I taught 130 kids how to make their own programs, but this year thousands of students in our district can discover computer programming.

Monday, August 18, 2014

Dev Log - Animations Complete

Since launching Ultimate Dodgeball on XBLIG, I’ve been quietly and persistently working away on a new FPS.  Last month I finished implementing all the powers, upgrades and abilities that players can earn, and on Saturday I finished all the animations for the game. 

Ultimate Dodgeball had some pretty cool animations, but this FPS has posed some new challenges to overcome.  To begin with, a first person game needs two sets of animations for every action; one animation of a player’s hands that will appear on his own view, and a second full body animation that all other players will see.
In addition, I can now play two sets of animations on a character at the same time, so a strafe animation can play for the character’s legs and torso, and a fire or heal animation can play on his arms and hands.  I was also able to tilt a character’s head and weapon arm when players look up or down.  All in all I am very pleased with how my animation system has evolved with each new game. 

Now that animations are done, I’m one step closer to being feature complete.  My next step will be making a final pass of all visual effects.  I integrated two different special effects systems into the code early in the project, but now I need to pay them another visit and make sure that all effects are complete and that they meet my quality and frame rate requirements.

Saturday, July 12, 2014

Teaching Kids Programming

Last year I taught 130 fourth and fifth grade students how to make their own computer programs.  I volunteered to teach my son's class how to make a Pong game in Khan Academy using JavaScript.   The kids absolutely loved it!  Soon teachers from my wife's school heard what we were doing and asked if I would teach classes at their school too.     
I was so impacted by how excited the kids were to write their own programs, and how passionate I felt about teaching them, that I made this video to show their work to our school's superintendent.  I'm hoping we can offer programming opportunities to all our elementary students. 

Thursday, January 9, 2014

Ultimate Dodgeball - 2nd Best Selling XBLIG

Ultimate Dodgeball was the 2nd best selling Xbox Indie game heading into Christmas!  Its rapid rise to 2nd place was due to an early Christmas present from Microsoft - being selected for a dash promo - and a good conversion rate. 
My goal when making Ultimate Dodgeball was to break into the top 50, and I was ecstatic when the game became stable at #17 on the best selling list.  To see it in the top 5 however, even if only for the two weeks of the promo was really exciting. 
Not every game that gets selected for a Dash Promo can break into the top 5.  That tells me that the quality and execution of Ultimate Dodgeball and its demo experience are solid enough to close the sale.  Of course there are games that are stable in the top 5 without a dash promo.  I believe the reason for their success is that they have a core concept that has a strong appeal to our audience and they are well executed. 
The core concept for my next game has the potential to break into the top 10.  Now I'm working to execute on that potential.