20 Haziran 2012 Çarşamba

Windows Phone 7'de XNA Ortamında Accelerometer (İvmeölçer) Kullanımı

imageAccelerometer kavramı, mobil cihazlarda kullanılabilen ve de tıpkı bir direksiyona hükmeder gibi mobil cihazımızı kullanbileceğimiz yapıdır. Eğer efektif kullanılırsa son kullanıcılar eğlenceli vakit geçirebilirler. Şimdi, Windows Phone üzerindeki kullanımını inceleyelim.
İlk olarak, bir XNA projesi oluşturarak başlayalım.


image

Ardından, hedefleyeceğimiz İşletim Sistemi versionunu seçelim.
image


Burası önemli arkadaşlar . Bu adımda ise projemize ilgili dll dosyamızı referans olarak ekleyelim.
image
Daha sonrada using ifadesi ile ilgili isimalanını (namespace) ekleyelim.
using Microsoft.Devices.Sensors; 
Oyunumuz, telefonun duruşuna göre kayarak hareket eden bir kare olsun. Bunun için önce gerekli değişkenleri aşağıdaki gibi tanımlayalım. “kareX” ve “kareY” değişkenleri karemizin yerini, “acceleremetor” değişkeni akselerometre verimizin yer değiştirmeye ne kadar katkıda bulunacağını, “texture” değişkeni kareyi çizmekte kullanacağımız texture dosyasını ve “sensor” değişkeni de akselerometremizi gösterecek.
int kareX;
int kareY;
int acceleremetor;
Texture2D texture;
Accelerometer accelSensor;
LoadContent metodumuzun içinde bu değişkenlerimizi aşağıdaki gibi initialize edelim.
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);

kareX = 400;
kareY = 240;

acceleremetor = 10;
texture = Content.Load("blank");
accelSensor = new Accelerometer();
}
Oyunumuzu oynarken telefonumuzu sürekli döndüreceğimiz için karşılaşacağımız ufak bir sorun var. Normalde, cihazı bir yöne çevirdiğimiz zaman ekran da o şekilde yön değiştirir.

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

graphics.SupportedOrientations = DisplayOrientation.LandscapeRight;

Akselerometremiz 3 boyutlu olduğu için anlık X, Y ve Z verilerini okuyabiliyoruz. Bu veriler bize değerleri -1 ile 1 arasında olan birer float olarak gelecekler.
Aşağıdaki kodu, Load Content metodunun en sonuna ekliyoruz.

try
{
accelSensor.Start();
}
catch (AccelerometerFailedException e)
{
System.Diagnostics.Debug.WriteLine("Accelerometer failed to start.");
}

Akselerometre verilerimizi almadan önce, Draw metodumuzu aşağıdaki gibi yazarak ekrana karemizi çizelim.
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
spriteBatch.Draw(texture, new Rectangle(kareX, kareY, 20, 20), Color.Green);
spriteBatch.End();
base.Draw(gameTime);
}


Geriye Update metodu içerisinde akselerometre verisini alarak karemizin yerini değiştirmek kaldı. Bunu da aşağıdaki şekilde gerçekleştiriyoruz.

protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
kareX += (int)(accelSensor.CurrentValue.Acceleration.Y * acceleremetor);
kareY += (int)(accelSensor.CurrentValue.Acceleration.X * acceleremetor);

base.Update(gameTime);
}

Ve sonuç:
Görüşmek üzere...

Hiç yorum yok:

Yorum Gönder