Sunday, April 26, 2015

Week 6 - Prepping a Level

Level design can be a painstaking process in any type of game. Carefully placing objects in a way that will make sense, and make things interesting takes a lot of time.

For a rhythm game like ours, there is an added element of matching up the level with the beat of the music. Some of our engineers have worked on some awesome tools to help with this.

They created a script to generate a flat platform and place our note elements for each run an 8th note apart across the entire level.

The first part of manually prepping the level involves removing all the notes that aren't related to the tracks they are associated with. It's a bit of a tedious process that involves playing the game over and over again and deleting the notes that exist when no music is playing until you get to the end of the song.

After doing this for four different tracks the result is satisfying. Seeing the player run through the notes makes it feel like the notes are actually triggering the individual sounds rather than starting and stopping the track.

Week 5 - More Simple Sound Effects

This Week I decided to try out some more simple sound effects rather than take some raw base sounds and try to tweak them to death.

It ended up going very well! I ended up playing around with a log of electronic and real drum kit sounds. I found a lot of little beeps, clicks, and hits that work great in a lot of different situations.

Beeps and clicks have proven especially effective on menu toggle sounds.

I recorded a bunch of different sounds and added them to the project. It felt much more productive than just messing around with a single sound for hours on end and not even liking the end result that much.

Week 4 - Listening for Sound Triggers

During this week the time has come to add functionality to add sounds based on events in the game. To do this, I added a SoundEventListener to our scripts that keep track of character movement. First I declared a delegate:

  public delegate void SoundEventHandler(object sender, CharacterMovement.MoveEventArgs e);


Then declare the event handler and initialize it in Start:

  public event SoundEventHandler SoundEvent;
...
  void Start()
  { 
    SoundFXController soundController = FindObjectOfType();
    if(soundController != null)
    {
      soundController.InitializeSoundEventListener(this);
    }
      
...
  }
And here is what the InitializeSoundEventListener looks like:

        
  public void InitializeSoundEventListener(CharacterMovement cm)
  {
    cm.SoundEvent += new SoundEventHandler(SoundEvent);
  }


In the MoveEventArgs, I can indicate which action is triggering the sound event:

        
  public class MoveEventArgs : EventArgs
  {
    public Movement moveEvent;

    public enum Movement 
    {
      Spin,
      Jump
    };
  }


Then in the SoundFXController I can interpret which action and play the appropriate sound:

        
  private void SoundEvent(object sender, CharacterMovement.MoveEventArgs e)
  {
    switch(e.moveEvent)
    {
    case CharacterMovement.MoveEventArgs.Movement.Spin:
      PlaySpin();
      break;
    case CharacterMovement.MoveEventArgs.Movement.Jump:
      PlayCustomJump();
      break;
    default:
      break;
    }
  }

Saturday, April 25, 2015

Week 3 Change is Constant!

Student games face a few unique challenges. You have a hard deadline, and the team starts it's organizational structure from scratch. Another challenge is that everybody on the team can't be expected to give a normal 8 hour work day devoted to the project. Different team members have a different load of classes and work schedules.

To overcome this, successful teams find ways to balance strong organization and powering through these to still be successful. For example, this week I found out about a decision made to set all the songs to 150 bpm. This decision was made to speed up level design and simplify some coding to make development more efficient.

Situations come up like this often when developing student games. It's part of the challenge of getting into a rhythm. Strong teams take this sort of thing in stride, weak teams get hung up on them. Our team has done an excellent job of always pushing through changes and learning as we go.

So I revisited Bloosh, sped it up to 150 bpm, and made a few changes to try to make it sound like it was meant to be that way.

The intro needed the biggest tweaking, and the drums got a bit crazy. For the most part though, I was able to leave the song pretty close to the same.

Take a listen:

Saturday, April 18, 2015

Week 2 - Starting on Sound Effects, Spinning

This is the week I started working on sound. I quickly found out that sound effects are tough!


There are a lot of similarities with music that I've found with sound effects in games. If it stands out too much, that might be a sign that it's not very good. It makes a huge difference in the game, but most people probably don't really notice it.


My first attempt was figuring out how to make a spinning sound effect from scratch.

I started off with just using a harsh wind sound from the Xpand!2 plugin. I put a frequency shifter and a phaser effect on it to try to make it sound like spinning. Out of desperation I also added a talkbox sound effect using the AIR Talkbox plugin.

After that I sent that signal to an audio channel where I could manipulate some of the fades with audio coming in and out. I then had the panning go from left, right, and back again to create a sense of spinning.

Out of desperation again I messed with some more plugins adding reverb, Fuzz-Wah, Enhancers and frequency filters. I definitely realized why people have to go to school for this stuff, it's tough to get the right sound.

At the end of it I think the sound I really want for spin will be an airy sound with a filter sweep up, nothing really like the sound I have now.

Sound isn't nearly as easy as it sounds...