Start | Engin Polat\'ın Windows 8 , Windows Phone 8 ve C# içerikli programcılık sitesi

Arşiv

Etiketlenen yazılar start

Unity3D ile sahneye saat ve gerisayım eklemek

27 January 2016 Yorum yapılmamış

Bu makaleyi okumadan önce Unity3D Kategorisindeki diğer makalelerimi okumanızı tavsiye ederim.

Bu makale sonunda sahneye saati ve 60 saniyeden geri sayımı gösteren iki yazı koyabileceksiniz.

Öncelikle Unity3D‘yi açarak bir oyun projesi oluşturuyoruz;

Hierarchy panelinden Main Camera nesnesini seçiyor ve Projection özelliğinde Ortographic değeri olduğunu kontrol ediyoruz. Scene alanında tam kamera’nın arkasından bakmak için GameObject menüsü altından Align View to Selected menüsüne tıklıyoruz.

Sahneye bir Text nesnesi eklemek için Hierarchy panelinde boş bir yere sağ tuşla tıklıyor ve UI kategorisi altından Text menüsünü seçiyoruz.

Oluşturulan Canvas ve Text‘in kamera’nın gördüğü alanın içerisinde olmasını sağlamak için Canvas seçili iken Render Mode özelliğine Screen Space – Camera değerini giriyoruz. Ayrıca Render Camera özelliğine Hierarchy panelinden Main Camera nesnesini sürükleyip bırakıyoruz.

Hierarchy panelinden Text nesnesini seçip Inspector panelinde gözüken Rect Transform kategorisi altından sahnede gözükeceği konumu belirliyoruz. Örneğin sahnenin sol üst köşesinde olması için left sütunu ile top satırının kesiştiği hücreye tıklıyoruz.

Hierarchy panelinde gözüken Text nesnesine isim olarak TimerText değerini verdikten sonra Edit menüsü altından Duplicate seçeneğini seçerek aynı nesneden bir tane daha oluşturuyoruz.

Yeni oluşturduğumuz Text nesnesine isim olarak CountdownText verip, sahnenin sağ üst köşesine hizalıyoruz.

Her iki Text nesnesinin de Inspector panelinden erişilebilen Font, Font Size ve Color değerlerini değiştirerek, sahnede büyük beyaz harfler gösterecek hale getiriyoruz.

Hierarchy panelinden Canvas nesnesini seçip Inspector panelinden Add Component butonuna tıklıyoruz ve New Script seçeneğini seçiyoruz.

Canvas nesnesine eklediğimiz yeni script’e TimeManager ismini verebiliriz.

TimeManager.cs dosyasını açarak için aşağıdaki kodları yazıyoruz;

using System;
using UnityEngine;
using UnityEngine.UI;

public class TimeManager : MonoBehaviour
{
	Text timerText;
	Text countdownText;

	float countdownTo = 60.0F;

	void Start()
	{
		timerText = GameObject.Find("TimerText").GetComponent<Text>();
		countdownText = GameObject.Find("CountdownText").GetComponent<Text>();
	}

	void Update()
	{
		countdownTo -= Time.deltaTime;

		if (countdownTo > 0)
		{
			countdownText.text = countdownTo.ToString();
		}

		timerText.text = DateTime.Now.ToString("hh:MM:ss");
	}
}

Öncelikle Start() methodunda ismi TimerText ve CountdownText olan iki nesneyi bulup içlerindeki Text elementlerine erişiyoruz ve bunları birer değişkende saklıyoruz. Böylece daha sonra bu nesnelere kolay bir şekilde erişebileceğiz.

Update() methodunda 60 saniyeden geri sayma yapabilmek için countdownTo değişkeninden geçen süreyi çıkartıyoruz ve elde ettiğimiz değeri sahnedeki CountdownText nesnesinde gösteriyoruz.

Son olarak Update() methodunda DateTime sınıfının Now özelliğinden elde ettiğimiz değeri saat:dakika:saniye formatına çeviriyoruz ve sahnedeki TimerText nesnesinde gösteriyoruz.

Eğer oyunu başlatacak olursak 60 saniyeden geri sayım ve bilgisayarın saati ekranda gözükecek;

Unity3D ile kendi etrafında dönen Cube yapmak

23 January 2016 Yorum yapılmamış

Bu makaleyi okumadan önce Unity3D Kategorisindeki diğer makalelerimi okumanızı tavsiye ederim.

Bu makale sonunda sahneye koyacağınız bir Cube nesnesini kendi ekseni etrafında istediğiniz hızda döndürebileceksiniz.

Öncelikle Unity3D‘yi açarak bir oyun projesi oluşturuyoruz;

Unity3D Editor açıldıktan sonra, sahneye bir tane Cube nesnesi ekliyoruz;

  • Hierarchy panelinde boş bir yere sağ tuşla tıklanır
  • 3D Object menüsü altından Cube seçeneği seçilir
  • Hierarchy paneline eklenen Cube nesnesine çift tıklanır ve Scene alanında Cube nesnesine odaklanılır

Sahnedeki nesnelerin gözükebilmesi için üzerlerine ışık tutmak gerekir;

  • Hierarchy panelinde boş bir yere sağ tuşla tıklanır
  • Light menüsü altından Directional Light seçeneği seçilir

Kamera bakış açısını Scene alanında gördüğümüz gibi yapmak için Main Camera nesnesi seçili iken GameObject menüsünden Align with View alt menüsü seçilir.

Hierarchy panelinden Cube nesnesi seçilir, Inspector panelinde gözüken Add Component butonuna tıklanır, New Script menüsüne tıklanır ve SpinningCube yazılır.

Project Assets panelinde gözüken SpinningCube.cs dosyasına çift tıklanır ve Cube nesnesine eklediğimiz script dosyası açılır.

SpinningCube.cs dosyası içinde iki method yer almaktadır;

using UnityEngine;
using System.Collections;

public class SpinningCube : MonoBehaviour {

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}

Start() methodu, Cube nesnesi oyunda ilk oluşturulduğunda bir defa çalıştırılır. Update() methodu ise oyunun her “kare“sinde tekrar tekrar çalıştırılır. Örneğin, 60fps hızında bir oyunda Update() methodu saniyede 60 defa çalışacaktır.

Update() methodu içerisinde Cube nesnesini yukarı-aşağı eksen etrafında hareket ettirmemiz gerekiyor. Böylece kendi ekseni etrafında dönüyormuş gibi gözükecek.

void Update () {
	transform.Rotate(Vector3.up, Time.deltaTime * 30);
}

Vector3.up ile, yukarı-aşağı yönlü ekseni belirliyoruz, Time.deltaTime ile oyunun çalıştığı cihazın hızından bağımsız olarak hareket etmesini garantiliyoruz, böylece hızlı cihazlarda hızlı, yavaş cihazlarda yavaş dönmeyecek. Son olarak 30 ile çarparak bir miktar hızlı dönmesini sağlıyoruz.

Şimdi oyunu çalıştırarak Cube nesnesinin kendi ekseni etrafında döndüğünü görelim;

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

29 January 2015 Yorum yapılmamış

Windows Phone cihazlar, cihazın hareketyönivme 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;

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);

Universal App içerisinde ScreenShot özelliğini devre dışı bırakmak

28 August 2014 Yorum yapılmamış

Windows Phone 8.1 kullanıcıları [POWER] ve [VOLUME UP] tuşlarına aynı anda basarak o anda kullanmakta oldukları uygulamanın ekran görüntüsünü çekebilirler.

Eğer uygulamanızın ekran görüntüsünün çekilmesini istemiyorsanız, Universal App projenizde ilgili ekranın açılışına aşağıdaki kod parçasını ekleyebilir ve ekran görüntüsü çekme özelliğini devre dışı bırakabilirsiniz;

ApplicationView.GetForCurrentView().IsScreenCaptureEnabled = false;

Böylece ilgili ekranın görüntüsü alınmak istendiği zaman aşağıda görebileceğiniz gibi Cannot capture protected content mesajı kullanıcıya gösterilecek ve ekran görüntüsü alınmayacaktır.

Bu kodu Windows Phone Emulator içerisinde test etmek için uygulamanız emulator içerisinde açıkken F9 ve F12 tuşlarına aynı anda basın.

Bazı önemli emulator kısayolları;

F2 : START
F3 : SEARCH
F6 : CAMERA HALF
F7 : CAMERA FULL
F9 : VOLUME UP
F10 : VOLUME DOWN
F12 : POWER

Windows Phone 8 varsayılan harita uygulaması ile yol tarifi alma

21 August 2013 Yorum yapılmamış

Windows Phone 8 SDK ile birlikte gelen MapsDirectionsTask sınıfı sayesinde yol güzergahı hesaplatmak ve kullanıcıya göstermek çok kolaylaştı.

Start ve End özelliklerine uygun değerleri girerek iki nokta arasında yol tarifi alabilmek mümkün.

Bu özelliği denemek için ekrana bir buton ekleyelim;

<Button x:Name="btnMap" Content="Güzergah Hesapla" Height="140" Width="420" Click="btnMap_Click" />

Eklediğimiz Button‘un Click event‘ine bağladığımız method‘u yazalım;

var task = new MapsDirectionsTask();

task.End = new LabeledMapLocation("Kadıköy Rıhtım", new GeoCoordinate(40.990, 29.025));

task.Show();

MapsDirectionsTask sınıfından yeni bir instance çıkartıp, End özelliğine LabeledMapLocation sınıfından bir değişken atıyoruz.

GeoCoordinate sınıfının constructor‘ında varış noktasının koordinatlarını vermemiz gerekiyor, ben örnek olarak 40.990 ve 29.025 değerlerini verdim böylece Kadıköy Rıhtım‘a nasıl gidileceğini buluyor olacağız;

Start özelliğine değer atamadığımız için konum servisinden bulunan konumumuz kullanılacak ve End özelliğine verdiğimiz konum’a giden güzergah hesaplanarak ekranda bir harita ve altında liste şeklide gösterilecek;