Silverlight Game Programming: Playing an Audio File

image In my recent Silverlight game, there are a variety of sound effects that occur from bullet fires to explosions. Most of the audio files are brief, lasting only for a second or less on average.

I had a few options — put a MediaElement directly on the UI (in XAML) and reuse each as needed, or create new MediaElements on demand. Rather than live with the artificial restrictions that would be inherent in a design which potentially limited the total number of simultaneous audio streams playing at one time, I decided on the second option — create them on demand.

Playing a supported audio file in Silverlight is easy as:

MediaElement me = new MediaElement();
me.Source = new Uri(fileName, UriKind.Relative);
me.Volume = volume;
me.AutoPlay = true;
Game.Sky.Children.Add(me);

 

Boom. Explode. The audio plays (thanks to AutoPlay–which I’ve explicitly set here though the default is true). The part that annoys me though is that once these audio files are completed, there’s no way to have them be automatically removed from the control tree. A MediaElement is a UIElement — so it’s not zero impact to leave them around. So, they build up, and build up.

My simple technique is to attach to the individual file’s CurrentStateChanged event.

public static void PlayAudio(string fileName, double volume)
{
    MediaElement me = new MediaElement();
    me.Source = new Uri(fileName, UriKind.Relative);
    me.Volume = volume;
    me.AutoPlay = true;
    me.CurrentStateChanged += new RoutedEventHandler(Audio_CurrentStateChanged);

    Game.Sky.Children.Add(me);
}

public static void Audio_CurrentStateChanged(object sender, RoutedEventArgs e)
{
    if (sender is MediaElement)
    {
        MediaElement me = sender as MediaElement;
        if (me.CurrentState == MediaElementState.Paused)
        {
            me.CurrentStateChanged -= new RoutedEventHandler(Audio_CurrentStateChanged);
            Game.Sky.Children.Remove(me);
        }
    }
}

In the CurrentStateChanged event handler, the code verifies that the Media is a Paused state (which happens when the media has finished playing) and then removes the UIElement from the control tree. (By the way, the Game.Sky object is a technique that I’ve used to expose globally the base UI element used throughout the game).

It’s cool that Silverlight can play WAV, MP3, and WMA files (my game uses all three types!)

How to Develop Games in Silverlight

There’s an interesting series starting in the latest issue of the Expression newsletter exploring the process of designing and creating a casual online game in Silverlight 2. Find more info here.

I’ll be following the series to see how I could improve my recent game attempt in Silverlight which I just released.

With all of the graphics and audio, my game’s download size is annoyingly large — if you’re on a fast Internet connection, you’ll likely not notice, but I would have liked to have done more to stage the download more efficiently (or to present a quick “splash” screen while the game continues to download in the background.

Evil Space Alien Attack (A Silverlight Game)

I just completed the final touches on a simple Silverlight game I’d been working on last night.

image

image

The game can be found here.

The game play and rules are simple:

  • Use the up and down arrows to control the angle/pitch of the small plane. (or you can control the angle using the red stick/ball on the right of the screen with a mouse).
  • Use the space bar to fire the weapon.
  • Don’t get hit by aliens or alien weapons.
  • You lose points if you don’t destroy each alien.
  • You can get extra bullets, but no extra “health”.

I’ll be posting some of the code, etc. soon.

With the exception of using Garage Band for a few sounds, I created everything using Microsoft products (Expression Design, Expression Blend, and Visual Studio 2008).

This version of the game uses Silverlight 2.0 Beta 2, as there isn’t a go-live license for the RC.