加速度センサの値を取得するためのコードを書きましょう。プロジェクトをVisual Studioで開きます。参照設定に、「Microsoft.Devices.Sensors.dll」を追加します。
センサを使うためにUsingに以下を追加します。
using Microsoft.Devices.Sensors;
加速度センサの値を取得するイベントを書きましょう。「MainPage.xaml.cs」に「onNavigatedTo」イベントを設定します。onNavigatedToイベントはそのページに遷移したときに実行されるイベントです。
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); }
onNavigatedToイベントを書き換えて、加速度センサとなる「Acceleromater」を宣言し、加速度センサの値が変わったときに実行されるイベント「accelerometer_ReadingChanged」を宣言しています。
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { Accelerometer accelerometer = new Accelerometer(); //加速度センサのコンストラクタを宣言 accelerometer.ReadingChanged += new EventHandler(accelerometer_ReadingChanged); //値が変わったときに実行されるイベント accelerometer.Start(); //加速度センサを有効にする }
先ほど宣言した「accelerometer_ReadingChanged」を記述しましょう。「AccelerometerReadingEventArgs」から引数「e」を使って「e.X」のようにX方向の値を取得できます。
void accelerometer_ReadingChanged(object sender, AccelerometerReadingEventArgs e) { // 別スレッドからのアクセスになるのでInvoke Dispatcher.BeginInvoke(new Action(ex => { xText.Text = "X:" + e.X.ToString(); yText.Text = "Y:" + e.Y.ToString(); zText.Text = "Z:" + e.Z.ToString(); }), e); }
実行してみましょう。加速度シミュレータの値がエミュレータに反映されていることが分かります。
もちろん、コードの変更なしに実機でも動作します。
値が取得できたら、この値を使ってコントロールの移動に挑戦してみましょう。「Canvas」コントロールを使えば、コントロールの位置をx、y座標で指定できます。これを利用してCanvasの中に「Ellipse」コントロールを置き、傾きに合わせて移動するなどができます。
先ほどのプロジェクトに追加して、「Canvas(cnvs)」と「Ellipse」コントロール(ball)、さらにballの座標を表示する「TextBlock」を設置しました。
Visual Studioを開いてコードを編集しましょう。「accelerometer_ReadingChanged」を変更します。座標を保存するPublic変数を追記します。
void accelerometer_ReadingChanged(object sender, AccelerometerReadingEventArgs e) { // 別スレッドからのアクセスになるのでInvoke Dispatcher.BeginInvoke(new Action(ex => { //加速度センサの生データ textX.Text = "X:" + e.X.ToString(); textY.Text = "Y:" + e.Y.ToString(); textZ.Text = "Z:" + e.Z.ToString(); //傾き具合で速度を変化 X += e.X * (speed + Math.Pow(2,e.X)); Y += e.Y * (speed + Math.Pow(2,e.Y)); //cnvsとのあたり判定 if (X > cnvs.Width - ball.Width) X = cnvs.Width - ball.Width; if (X < 0)X = 0; if (-Y > cnvs.Height - ball.Height)Y = -cnvs.Height + ball.Height; if (-Y < 0)Y = 0; //ballの座標 ballX.Text = X.ToString(); ballY.Text = (-1*Y).ToString(); //ballの移動 ball.SetValue(Canvas.TopProperty, -Y); ball.SetValue(Canvas.LeftProperty, X); }), e); }
実行してみましょう。デバイスの傾きに合わせてballが移動します。
加速度センサは、ゲームで用いられることが多いセンサです。一方でWindows Phoneのゲーム開発といえばXNAが第一候補に挙がりますが、30fpsを必要としない2Dの簡単なゲームであればSilverlightでも十分開発可能です。
次ページでは、加速度センサを使ったジェスチャを試してみましょう。
Copyright © ITmedia, Inc. All Rights Reserved.