Universal App içerisinden WiFi bağlantısını açıp/kapatmak

Aslında uygulama içerisinde WiFi bağlantısını açıp/kapatamayız. Fakat WiFi bağlantısını açıp/kapatabilecek sistem ayarları ekranını açabiliriz.

Bunun için basitçe;

yeterlidir.

private void btnWiFiAcKapat_Click(object sender, RoutedEventArgs e) { var connectionSettingsTask = new ConnectionSettingsTask(); connectionSettingsTask.ConnectionSettingsType = ConnectionSettingsType.WiFi; connectionSettingsTask.Show(); }

AçıkAkademi Porting to Universal App Etkinliği 1 - Şubat 2015

05 Şubat 2015 tarihinde, AçıkAkademi Sanal Sınıf üzerinden canlı yayınlanan Porting to Universal App (1) etkinliği gerçekleştirdim.

Etkinliğin kaydedilen videosunu aşağıda izleyebilirsiniz;

Windows Phone 8 uygulamasında Accelerometer sensöründen veri okuma

Windows Phone cihazlar, cihazın hareket-yön-ivme gibi çeşitli bilgilerini yazılımsal olarak algılamamıza yardım eden algılayıcılar (sensör) ile birlikte geliyorlar.

Accelerometer sensörü cihazın X, Y, Z eksenlerindeki ivme bilgisini algılar ve işletim sistemi aracılığıyla yazılıma iletebilir.

Öncelikle projenin References kısmında Microsoft.Devices.Sensors referansının olduğunu kontrol edelim ve sınıfın using kısmına Microsoft.Devices.Sensors namespace‘ini ekleyelim;

using Microsoft.Devices.Sensors;</pre>

Accelerometer sensörüne erişebilmek ve verisini okuyabilmek için Accelerometer sınıfından yeni bir instance oluşturmalıyız, bunun için static olan GetDefault() methodunu kullanabiliriz;

var _accelerometer = Accelerometer.GetDefault();

Sensör verisini bir defa okumak için _accelerometer değişkeninin GetCurrentReading() methodunu kullanıyoruz. Methoddan geri dönen AccelerometerReading tipindeki cevabın içerisindeki AccelerationX, AccelerationY, AccelerationZ property‘leri sayesinde ivme bilgisini elde edebiliriz;

var reading = _accelerometer.GetCurrentReading();
if (reading != null)
{
    var x = string.Format("{0,5:0.00}", reading.AccelerationX);
    var y = string.Format("{0,5:0.00}", reading.AccelerationY);
    var z = string.Format("{0,5:0.00}", reading.AccelerationZ);
}

Eğer ivme bilgisini sürekli okumamız gerekiyorsa _accelerometer değişkeninin ReadingChanged event’ini kullanabiliriz, Start() method’unu çağırmayı unutmamamız lazım;

_accelerometer.ReadingChanged += new EventHandler<AccelerometerReadingEventArgs>(AccelerometerReadingChanged);

_accelerometer.Start();
public void AccelerometerReadingChanged(object sender, AccelerometerReadingEventArgs e)
{
    var x = string.Format("{0,5:0.00}", e.X);
    var y = string.Format("{0,5:0.00}", e.Y);
    var z = string.Format("{0,5:0.00}", e.Z);
}

Accelerometer verisine ihtiyacımız kalmadığında _accelerometer değişkeninin Stop() method’unu çağırmalıyız;

_accelerometer.Stop();

X, Y, Z eksenlerindeki değerler -2 ile +2 aralığında değişiyorlar. Yerçekimsiz ortamda değerlerin 0 olması bekleniyor. Eğer telefonu masa üzerine bırakırsak X ve Y değerleri 0, Z değeri -1 olarak okunmalı.

Start() methodu çağırıldıktan sonra yaklaşık olarak 50Hz hızında yani saniyede yaklaşık 50 defa ReadingChanged event’i tetiklenecektir.

Eğer ReadingChanged event’inin tetiklenme hızını değiştirmek istiyorsak _accelerometer değişkeninin ReportInterval property’sine yeni bir değer ataması yapmalıyız.

Son olarak, _accelerometer değişkeninin Shaken event’ini kullanarak telefonun sallanma durumunu yakalayabiliriz;

_accelerometer.Shaken += new TypedEventHandler<Accelerometer, AccelerometerShakenEventArgs>(Shaken);


Global Game Jam 2015

Global Game Jam 2015 etkinliği 23 Ocak 2015 - 25 Ocak 2015 tarihleri arasında İzmir Ekonomi Üniversitesi Konferans Salonu‘nda gerçekleştirildi.

Ben de konuşmacı , mentor ve juri üyesi sıfatları ile etkinliğe katıldım ve açıkçası çok keyifli zaman geçirdim.

Global Game Jam nedir?

Global Game Jam, IGDA (International Game Developers Association - Uluslararası Oyun Geliştiricileri Derneği) Eğitim Odak Grubu‘nun yönlendirmesiyle ortaya çıkan, tüm dünyada eş zamanlı gerçekleştirilen bir oyun geliştirme etkinliğidir.

GGJ dünyada oyun geliştirilmesi amacıyla birçok öğrenciyi, profesyoneli ve akademisyeni bir araya getiren dünya genelindeki en büyük oyun geliştirme organizasyonudur.

GGJ 2015 etkinliğinde, dünya genelinde 78 ülkede 518 etkinlik alanında 28837 katılımcı ile 5438 oynanabilir oyun yalnızca 48 saat içerisinde geliştirilmiştir. GGJ etkinliğine ev sahipliği yapan etkinlik merkezleri yerel oyun sektörünün gelişmesine katkı sağlarken, katılımcılara çeşitli açılardan faydalar sağlamaktadır.

Windows Phone 8 - XNA Oyunu / MiniCar

Bu yazımı okumadan önce Windows Phone ve XNA konusundaki diğer makalelerimi okumanızı öneririm.

Önce görseller ve oyunun arkaplan ses dosyası;

MiniCar : BackgroundMiniCar : MainCarMiniCar : Car1MiniCar : Car2MiniCar : Car3MiniCar : Car4MiniCar : Car5MiniCar : Car6MiniCar : Car7MiniCar : Car8

İlk olarak XNA Game Studio 4.0 grubundaki Windows Phone Game şablonundan MiniCarGame isimli projeyi oluşturalım;

Windows Phone : XNA Game Project Template

Game1.cs dosyasının ismini GameLoop.cs olarak değiştirdikten sonra, EnemyCar isminde yeni bir class ekleyelim;

public class EnemyCar { public Texture2D Texture;

public Vector2 Position;

public float Velocity;

public Rectangle Area;

Random r = new Random();

public EnemyCar(Texture2D CarTexture)
{
    this.Texture = CarTexture;

    this.Position = new Vector2(r.Next(450, 850), 1);

    this.Velocity = (float)(r.NextDouble() * 4) + 3f;

    this.Area = new Rectangle((int)this.Position.X, (int)this.Position.Y, this.Texture.Width, this.Texture.Height);
} }</pre>

EnemyCar sınıfı sayesinde, ekrana getireceğimiz diğer araçların görsellerini, konumlarını, çarpışma testi yapabilmek için ekranda kapladığı alanı ve hızlarını bileceğiz.

GameLoop sınıfına geri dönelim ve sınıf seviyesindeki değişkenlere aşağıdakileri ekleyelim;

GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;

const int PENCERE_GENISLIK = 800;
const int PENCERE_YUKSEKLIK = 480;

Texture2D BackgroundTexture1;
Texture2D BackgroundTexture2;

Vector2 BackgroundPosition1 = new Vector2(0, -PENCERE_YUKSEKLIK);
Vector2 BackgroundPosition2 = new Vector2(0, 0);

Texture2D MainCarTexture;
Vector2 MainCarPosition = new Vector2(300, 300);

float KatedilenMesafe = 0f;

Rectangle ScreenArea = new Rectangle(0, 0, PENCERE_GENISLIK, PENCERE_YUKSEKLIK);
Rectangle MainCarArea = new Rectangle(300, 300, 67, 134);

TimeSpan TotalElapsedTime;

List<EnemyCar> CarList = new List<EnemyCar>();

Random r = new Random();

Texture2D[] CarTextures = new Texture2D[8];

Klavyedeki hangi tuşlara basıldığını kontrol edebilmek için KeyboardState değişkenlerimizi, arkaplanda sürekli tekrar eden ses çaldırmak için SoundEffectInstance değişkenimizi ve oyunun bittiğini takip edeceğimiz bool değişkeni de sınıf seviyesinde ekleyelim;

KeyboardState ks;
KeyboardState pks;

SoundEffectInstance BackgroundLoop;

bool IsGameOver = false;

İlk yapacağımız iş GameLoop sınıfının constructor‘ında gerekli atamaları yapmak olacak;

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

    graphics.PreferredBackBufferWidth = PENCERE_GENISLIK;
    graphics.PreferredBackBufferHeight = PENCERE_YUKSEKLIK;
    graphics.IsFullScreen = true;
}

LoadContent() methodunda değişkenlerimiz aracılığıyla ses ve resim dosyalarını hafızaya yüklüyoruz;

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

    BackgroundTexture1 = Content.Load<Texture2D>("BackgroundRoad");
    BackgroundTexture2 = BackgroundTexture1;
    MainCarTexture = Content.Load<Texture2D>("MainCar");

    MesafeFont = Content.Load<SpriteFont>("Verdana14");

    for (int i = 0; i < CarTextures.Length; i++)
    {
        CarTextures[i] = Content.Load<Texture2D<("Car" + (i + 2));
    }

    BackgroundLoop = Content.Load<SoundEffect>("BackgroundLoop").CreateInstance();

    GameOverFont = Content.Load<SpriteFont>("GameOverFont");

    BackgroundLoop.IsLooped = true;
    BackgroundLoop.Play();
}

Update() method’unda ilk olarak oyundan çıkma ve baştan başlama durumunu sağlayacak kodları yazıyoruz;

</pre><pre class="brush:csharp">ks = Keyboard.GetState();

if (ks.IsKeyDown(Keys.Escape)) { this.Exit(); }

if (IsGameOver && ks.IsKeyDown(Keys.Enter)) { IsGameOver = false; BackgroundLoop.Play(); KatedilenMesafe = 0f; MainCarPosition = new Vector2(600, 600); MainCarArea.X = (int)MainCarPosition.X; MainCarArea.Y = (int)MainCarPosition.Y; CarList.Clear(); }</pre>

Eğer oyun sonlanmadıysa, klavyedeki tuşların durumuna göre arabamızı hareket ettiriyoruz, en son araba eklediğimiz zamandan itibaren belli bir sürenin üzerinde geçtiyse yeni EnemyCar ekliyoruz, EnemyCar listesindeki her bir arabayı hareket ettiriyoruz, yol görselini içeren arkaplanı hareket ettiriyoruz, katedilen mesafeyi güncelleyip, bizim arabamız ile diğer arabaların çarpışma testini yapıyoruz;

if (!IsGameOver)
{
    if (ks.IsKeyDown(Keys.Left))
    {
        MainCarPosition.X -= 3;
        MainCarArea.X -= 3;
    }
    if (ks.IsKeyDown(Keys.Right))
    {
        MainCarPosition.X += 3;
        MainCarArea.X += 3;
    }
    if (ks.IsKeyDown(Keys.Up))
    {
        MainCarPosition.Y -= 3;
        MainCarArea.Y -= 3;
    }
    if (ks.IsKeyDown(Keys.Down))
    {
        MainCarPosition.Y += 3;
        MainCarArea.Y += 3;
    }

    TotalElapsedTime += gameTime.ElapsedGameTime;

    if (TotalElapsedTime > TimeSpan.FromMilliseconds(1500))
    {
        EnemyCar car = new EnemyCar(CarTextures[r.Next(0, 8)]);

        CarList.Add(car);

        TotalElapsedTime = TimeSpan.Zero;
    }

    foreach (EnemyCar car in CarList)
    {
        car.Position.Y += car.Velocity;
        car.Area.Y = (int)car.Position.Y;
    }

    BackgroundPosition1.Y += 2;
    BackgroundPosition2.Y += 2;

    if (BackgroundPosition2.Y > PENCERE_YUKSEKLIK)
    {
        BackgroundPosition1.Y = -PENCERE_YUKSEKLIK;
        BackgroundPosition2.Y = 0;
    }

    KatedilenMesafe += 0.005f;

    foreach (EnemyCar car in CarList)
    {
        if (car.Area.Intersects(MainCarArea))
        {
            IsGameOver = true;
            BackgroundLoop.Stop();
        }
    }
}

Son olarak Update() methodunun son satırında KeyboardState‘i pks değişkenine atyoruz;

pks = ks;

Draw() methodunda kendi arabamızı, diğer arabaları ve katettiğimiz mesafeyi ekrana çiziyoruz;

GraphicsDevice.Clear(Color.CornflowerBlue);

spriteBatch.Begin();

spriteBatch.Draw(BackgroundTexture1, BackgroundPosition1, Color.White);
spriteBatch.Draw(BackgroundTexture2, BackgroundPosition2, Color.White);

spriteBatch.Draw(MainCarTexture, MainCarPosition, Color.White);

spriteBatch.DrawString(MesafeFont, "Katedilen Mesafe: " + KatedilenMesafe.ToString("N2") + " km", new Vector2(51, 51), Color.Black);
spriteBatch.DrawString(MesafeFont, "Katedilen Mesafe: " + KatedilenMesafe.ToString("N2") + " km", new Vector2(50, 50), Color.White);

foreach (EnemyCar car in CarList)
{
    spriteBatch.Draw(car.Texture, car.Position, Color.White);
}

if (IsGameOver)
{
    spriteBatch.DrawString(GameOverFont, "GAME OVER", new Vector2(433, 353), Color.Yellow);
    spriteBatch.DrawString(GameOverFont, "GAME OVER", new Vector2(430, 350), Color.Red);
}

spriteBatch.End();


Engin Polat hakkında

Chief Architect, Microsoft RD, Microsoft MVP

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 458

Creative Commons Lisansı