Export (0) Print
Expand All

Retrieving Accelerometer Input (Windows Phone)

XNA Game Studio 4.0

This topic demonstrates how to detect and use accelerometer input in an XNA Game Studio game on Windows Phone.

Complete Sample

The code in this topic shows you the technique. You can download a complete code sample for this topic, including full source code and any additional supporting files required by the sample.

Accelerometer input on Windows Phone 7 is not directly supported by XNA Game Studio 4.0, but it is easy to add to an existing project.

Accelerometer input is only supported on Windows Phone. Other platforms have no access to this feature.

Adding Microsoft.Devices.Sensors to Your Application

Accelerometer input on Windows Phone 7 is handled by the Microsoft.Devices.Sensors assembly, which must be referenced by your assembly before any of its types, events, or methods can be used in your application.

To add Microsoft.Devices.Sensors to your game

  1. In Solution Explorer, right-click your game project's References node, and then select Add Reference.
  2. Select Microsoft.Devices.Sensors from the list, and then click OK.
  3. Add using Microsoft.Devices.Sensors; to the top of any source file that will use the accelerometer classes and methods.

Adding Accelerometer Support to Your Game

Once you have a reference to Microsoft.Devices.Sensors in your project and an associated using statement in your source files, you can begin adding code to support accelerometer input.

To add accelerometer support

  1. Add a data member to your game to hold accelerometer data.

    Accelerometer data is returned in an AccelerometerReadingEventArgs class. You can declare an instance of this structure in your class, declare an instance of a similar structure (such as Vector3), or create separate data members to read AccelerometerReadingEventArgs's X, Y, and Z members.

    Accelerometer accelSensor;
    Vector3 accelReading = new Vector3();
  2. Add an event handler for the ReadingChanged event.

    Add a method to your class that returns void, and has two parameters: an object representing the sender, and an AccelerometerReadingEventArgs to get the accelerometer reading.

    public void AccelerometerReadingChanged(object sender, AccelerometerReadingEventArgs e)
        accelReading.X =  (float)e.X;
        accelReading.Y = (float)e.Y;
        accelReading.Z = (float)e.Z;
  3. Associate your event handler with the ReadingChanged event.

    accelSensor = new Accelerometer();
    // Add the accelerometer event handler to the accelerometer sensor.
    accelSensor.ReadingChanged +=
        new EventHandler<AccelerometerReadingEventArgs>(AccelerometerReadingChanged);
  4. Start the accelerometer sensor.

    The accelerometer must be started before it begins calling your event handler. This may raise an exception, so your code should handle the case where the accelerometer cannot be started.

    // Start the accelerometer
        accelActive = true;
    catch (AccelerometerFailedException e)
        // the accelerometer couldn't be started.  No fun!
        accelActive = false;
    catch (UnauthorizedAccessException e)
        // This exception is thrown in the emulator-which doesn't support an accelerometer.
        accelActive = false;
  5. Get accelerometer readings.

    After it is started, the accelerometer calls your event handler when the ReadingChanged event is raised. Update your stored AccelerometerReadingEventArgs class (previously shown in the event handler code), and then use its data in your game's Update method.

    if (accelActive)
        // accelerate the sparkle depending on accelerometer
        // action.
        s.speed.X += accelReading.X * ACCELFACTOR;
        s.speed.Y += -accelReading.Y * ACCELFACTOR;
  6. Stop the accelerometer sensor.

    To avoid having your event handler called repeatedly when your game is not actually using the accelerometer data, you can stop the accelerometer when the game is paused, when menus are being shown, or at any other time by calling the Stop method. Like Start, this method can throw an exception, so allow your code to handle the AccelerometerFailedException.

    // Stop the accelerometer if it's active.
    if (accelActive)
        catch (AccelerometerFailedException e)
            // the accelerometer couldn't be stopped now.

Community Additions

© 2015 Microsoft