がりらぼ

WindowsRuntimeの応援ブログ

MonoGameWindowsRuntimeゲームプログラミング入門vol11:加速度センサーの入力を検知する

加速度センサー

ほとんどのWindowsタブレットには加速度センサーが付いています。

加速度センサーはデバイスを傾けるだけで入力をすることができるのでよりゲームが直感的になります。 加速度センサーを利用するにあたって、「どの軸を固定とした回転か」を考える必要があります。

以下の図のように

デバイスの上向きをY軸、

デバイスの横向きをX軸、

デバイスの奥向きをZ軸

として座標軸考えます。

 

6

 

加速度の値はちょうど軸の向きが重力と同じ向きになると1.0、重力と逆向きで0.0の値をとります。

 

 

X軸固定回転

デバイスのX軸を固定とする回転は、AccelerationY値とAccelerationZ値が変化します。

3

 

 

Y軸固定回転

デバイスのY軸を固定とする回転は、AccelerationX値とAccelerationZ値が変化します。

 

4

 

Z軸固定回転

デバイスのZ軸を固定とする回転は、AccelerationX値とAccelerationY値が変化します。

 

5

 

Accelerometer

加速度センサーを利用するには、Accelerometerクラスを使います。

以下の名前空間を追加しましょう。

using Windows.Devices.Sensors;

 

Accelerometerクラスのインスタンスをメンバに追加します。

Accelerometer accel;

 

InitializeメソッドでAccelerometerのGetDefaultメソッドでAccelerometerのインスタンスを取得します。

もし、デバイスに加速度センサーがついていなければGetDefaultメソッドがnullを返します。

ReportIntervalでどれだけの間隔で加速度センサーの値を更新するかを決定します。

protected override void Initialize()
{

    accel = Accelerometer.GetDefault();
    if(accel!=null)
    accel.ReportInterval = accel.MinimumReportInterval*60;

    base.Initialize();
}

 

UpdateメソッドでGetCurrentReadingメソッドをもちいて現在の加速度センサーの値を取得します。

protected override void Update(GameTime gameTime)
{
    //デバイスに加速度センサーが付いていない場合nullになる
    if (accel != null)
    {
        AccelerometerReading reading = accel.GetCurrentReading();

        text = string.Format("X={0} Y={1} Z={2}", reading.AccelerationX, reading.AccelerationY, reading.AccelerationZ);
    }
    base.Update(gameTime);
}

 

サンプル

public class Game1 : Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;

    SpriteFont font;
    string text;

    Accelerometer accel;

    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";

    }


    protected override void Initialize()
    {
        text = "no state";

        accel = Accelerometer.GetDefault();
        if(accel!=null)
        accel.ReportInterval = accel.MinimumReportInterval*60;

        base.Initialize();
    }


    protected override void LoadContent()
    {
        spriteBatch = new SpriteBatch(GraphicsDevice);
        font = Content.Load<SpriteFont>("TestFont");
  
    }

    protected override void UnloadContent()
    {
        
        
    }


    protected override void Update(GameTime gameTime)
    {
        //デバイスに加速度センサーが付いていない場合nullになる
        if (accel != null)
        {
            AccelerometerReading reading = accel.GetCurrentReading();
            text = string.Format("X={0} Y={1} Z={2}", reading.AccelerationX, reading.AccelerationY, reading.AccelerationZ);
        }
        base.Update(gameTime);
    }


    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);

        spriteBatch.Begin();

        spriteBatch.DrawString(font,text,new Vector2(0,10),Color.White);

        spriteBatch.End();

        base.Draw(gameTime);
    }
}

 

BvuQVKWCEAEsVHK

 

 

サンプルコード

SmapleGameMono_9_InputAccel.zip

 

加速度センサーの入力を検知する | garicchi.com

目次