Windows Phone 7 – XNA ile Akselerometre Kullanımı

Standard

Akselerometre kullanımı, şüphesiz ki mobil cihazlarda etkili bir şekilde kullanıldığında oyunların eğlence faktörünü kat kat yükselten özelliklerden biri. Bir yarış oyununda telefonumuzu direksiyon gibi sağa sola çevirerek aracımızı kontrol etmemiz buna verilecek en iyi örneklerdendir. 🙂 Windows Phone 7 için geliştirdiğimiz oyunlarımıza bu özelliği ekleyerek çok daha eğlenceli oyunlar yaratabiliriz. Bu yazımda, Windows Phone 7 için akselerometre kullanan örnek bir oyun geliştireceğiz.

Öncelikle, akselerometrenin ne olduğundan kısaca bahsetmek istiyorum. Akselerometreye aynı zamanda ivmeölçer de denir, ve adı üzerinde, ivmeyi ölçer. 😀 Ancak bu ölçmeyi yerçekimine göre yaptığı için, bu aleti kullanarak telefonumuzun o anki duruşunu (yani dik, yatay vs.) öğrenebiliriz. Windows Phone 7 cihazımızda 3 boyutlu bir akselerometre vardır, yani 3 boyut içerisinde tam olarak nasıl durduğu bilgisine oyunumuz içinde ulaşabiliriz. Bu bilgiyi de oyunlarımızda kullanabiliriz. 🙂

O halde, ilk iş kendimize bir Windows Phone 7 XNA projesi açalım ve versiyon olarak Windows Phone 7.1′i seçelim. Projenin adına AccelerometerGame diyorum.

Akselerometreyi kullanabilmemiz için projemize ilgili kütüphaneyi eklememiz lazım. Bunun için, Solution Explorer’dan References’a sağ tıklayarak, Add Reference seçeneğini seçip çıkan ekrandan Microsoft.Devices.Sensors bileşenini eklemeliyiz.

Ardından, bu yeni bileşeni kodumuzun en başına “using” ifadesi ile ekliyoruz.

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Input.Touch;
using Microsoft.Xna.Framework.Media;
using Microsoft.Devices.Sensors;

Artık kodlamaya hazırız. 🙂 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. “rectangleX” ve “rectangleY” değişkenleri karemizin yerini, “accelFactor” değişkeni akselerometre verimizin yer değiştirmeye ne kadar katkıda bulunacağını, “myTexture” değişkeni kareyi çizmekte kullanacağımız texture dosyasını ve “accelSensor” değişkeni de akselerometremizi gösterecek.

        int rectangleX;
        int rectangleY;
        int accelFactor;

        Texture2D myTexture;

        Accelerometer accelSensor;

LoadContent metodumuzun içinde bu değişkenlerimizi aşağıdaki gibi initialize edelim. Bu kısımda projemize “blank” adında sadece beyaz renkten oluşan bir png dosyası yükledim.

        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);

            rectangleX = 400;
            rectangleY = 240;

            accelFactor = 10;

            myTexture = Content.Load<Texture2D>("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. Ancak bizim oyunumuzda bu özellik sıkıntı yaratacağı için aşağıdaki satırı oyunumuza ekleyerek bu sorunu giderebiliriz.

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

            graphics.SupportedOrientations = DisplayOrientation.LandscapeRight;
        }

Oyunumuzda daha da ilerlemeden önce akselerometrenin nasıl çalıştığına değinmek istiyorum. 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. Bu verilerin telefon hangi şekilde duruyorken hangi değerleri aldığı da aşağıdaki gibi:

Ancak dikkat etmemiz gereken şey, akselerometrenin çok hassas bir cihaz olduğu. Şöyle ki, bize float olarak gelen akselerometre verisi telefonumuzu masanın üstüne bıraksak bile sürekli ufak değişiklerle gelecek. O nedenle uygulamamızda bunu göz önüne almalıyız.

Uygulamamıza geri dönersek, artık akselerometremizi çalıştırabiliriz. 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(myTexture, new Rectangle(rectangleX, rectangleY, 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();

            rectangleX = (int)(accelSensor.CurrentValue.Acceleration.Y * accelFactor);
            rectangleY = (int)(accelSensor.CurrentValue.Acceleration.X * accelFactor);

            base.Update(gameTime);
        }

Yukarıdaki kodda dikkat etmemiz gereken nokta, kare ve akselerometrenin X ve Y değerlerinin yer değiştirmiş olması. Bunun sebebi oyunumuzun yatay ekranda (landscape) oynanması.

Artık oyunumuzu çalıştırabiliriz. 🙂 Çalıştırmadan önce emulatörün sağ üst köşesindeki menüden ek araçları seçerek akselerometre ile ilgili kısmı açalım, ve oradan da Orientation olarak Portrait Flat seçelim.

Artık emulatörde telefonun duruşunu değiştirmek için yukarıda gördüğünüz pembe noktayı tutarak sürüklemeniz yeterli. Göreceksiniz ki oyunumuzdaki kare, telefon hangi yana doğru yattıysa o tarafa hareket ediyor. 🙂

Oyunun kaynak koduna buradan ulaşabilirsiniz.

Gelecek yazılarımda görüşmek üzere. 🙂

Advertisements

Comment

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s