11.05.2010

XNA Dünyasına Yolculuk

Merhaba arkadaşlar,

Bir önceki yazımda XNA ile oyun geliştirmeye başlamadan önce bilgisayarımıza kurmamız gereken araçlara değinmiştik. Bunların kurulumunu yaptıysak eğer artık XNA dünyasına adım atma vaktimiz gelmiş demektir...


İlk Adım

Öncelikle Microsoft Visual C# 2008 Express Edition 'ı açıyoruz. File menüsünden New Project 'e tıklıyoruz. Açılan pencerede aşağıdaki resimde gördüğünüz gibi Windows Game (3.0) proje şablonunu seçiyoruz. Ardından da projemize bir isim verip OK tuşuna basarak ilk uygulamamızı oluşturuyoruz.



Uygulamamızı oluşturduktan sonra proje şablonunun bize sunduğu yapıyı tanıyabilmek için Solution Explorer penceresinden proje ile gelen standart yapılara bir bakalım.


Uygulama ile gelen standart yapı içindeki en farklı öğe Content alt projesidir. Uygulamanın yaratılmasıyla birlikte Content adında ufak bir proje de uygulamaya dahil edilmektedir. Content projesinin amacı için, oyunumuzun içinde yer alacak olan bir çok farklı öğeyi merkezi bir yerden yönetbilmektir diyebiliriz. (grafik, ses, vs.).

Content projesinden sonra References düğümlerine bakmakta fayda var. Burada görebileceğiniz gibi Microsoft.Xna.Framework ön ekiyle başlayan bir çok farklı Assembly uygulamanın standart yapısı içinde gelmektedir. İşte bu assembly 'ler XNA Game Studio ile sisteme kurulan dosyalardır.

Bunların dışında uygulamayla birlikte Game1.cs ve Program.cs olmak üzere 2 tane sınıf gelmektedir. Program sınıfının işlevi diğer Windows veya Console uygulamalarındaki Program sınıfından farklı değildir. Dolayısıyla program sınıfı için uygulamanın başlangıç noktasıdır (Entry Point) diyebiliriz. Game1 sınıfını ise birazdan çok daha detaylı bir şekilde inceleyeceğiz. Fakat önce XNA ile gelen ve temel olarak bilmeniz gereken bazı standart namespace 'lere değinmek istiyorum.


Derinlere...

using Microsoft.Xna.Framework; MSDN Link
Bir oyunda gerekebilecek en temel ve genel yapıları sunar (Oyun döngüsü, zamanlamalar, pozisyonlar, boyutlar, vs.)

using Microsoft.Xna.Framework.Audio; MSDN Link
Auido kelimesi ile herşey anlaşılıyor gibi ama daha somut anlatmak gerekirse; oyunlarda çeşitli müzikler veya ses efektleri kullanmamız gerekir. XNA 'de geliştireceğimiz oyunlara, ses dosyalarını, harici bir program olan Microsoft Cross-Platform Audio Creation Tool (XACT) ile ekliyoruz (Bu programa Başlat>Programlar\Microsoft XNA Game Studio 3.0\Tools altından erişebilirsiniz). Biz de XACT 'nin oluşturuğu veriler üzerinden Audio namespace 'ini kullanarak ses dosyalarını yönetebiliyoruz.

using Microsoft.Xna.Framework.Content; MSDN Link
Content Pipeline 'da bulunan özellikleri yönetmeyi sağlar. İçerik yönetimi ve kaynak yönetimi gibi konularla ilgili sınıflar burada bulunur. (Content Pipeline nedir sorusunun cevabını bu yazının ilerleyen bölümlerinde göreceğiz)

using Microsoft.Xna.Framework.GamerServices; MSDN Link
Adından da anlaşılabileceği üzere bu namespace içinde oyuncular ile ilgili bir çok çeşitli servis sınıfı yer alır. Bu servisler direk olarak kullanıcı ile iletişim içinde bulunurlar.

using Microsoft.Xna.Framework.Graphics; MSDN Link
Grafiksel işlemleri gerçekleştirip yönetebileceğimiz sınıfları bünyesinde bulundurur. Ekrana bir resim veya 3D bir obje koymaktan tutunda, ekran kartının özelliklerine erişmeye kadar bir çok yeteneği bizlere sunar.

using Microsoft.Xna.Framework.Input; MSDN Link
Klavye, mouse veya XBOX için gamepad gibi giriş birimlerini yönetebileceğimiz sınıfların toplandıgı yerdir. Klavyede herhangi bir anda hangi tuşa basılmış veya farenin ekrandaki pozisyonu gibi bir çok durum üzerinde kontrole sahip oluyoruz.

using Microsoft.Xna.Framework.Media; MSDN Link
Çeşitli MediaList'ler yani; playlist, resim albümü gibi şeyler oluşturabileceğimiz koleksiyonlara sahiptir.

using Microsoft.Xna.Framework.Net; MSDN Link
Oyunlarımıza network altyapısını sağlayacak olan sınıfları içerir.

using Microsoft.Xna.Framework.Storage; MSDN Link
Dosyaları okumak veya dosyalara yazma işlemini yapabilmek için gerekli olan sınıflara sahiptir.

Bu bahsettiğimiz isim alanları xna ile gelen temel modüllerdir. Bunlardan kısaca bahsettiğimize göre şimdi Game1.cs sınıfının yapısını detaylı bir şekilde inceleyebiliriz.


Game1.cs

public class Game1 : Microsoft.Xna.Framework.Game


Game1.cs sınıfımız görüldüğü gibi XNA Framework içinde bulunan Game adındaki sınıftan türemektedir.

GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;


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


Her sınıfta olduğu gibi Game1 sınıfımızın da bir yapıcı metodu (Default Constructor) bulunmaktadır. Yapıcı metodların genel kullanım amacını hatırlamak gerekirse eğer; program genelinde kullandığımız değişkenlere, başlangıçta sahip olmasını istediğimiz değerlerin atandığı yerdir diyebiliriz. Nitekim burada da ekran kartına erişebileceğimiz sınıf olan GraphicsDeviceManager 'dan bir nesne yaratılmıştır. Ardından da oyun içinde kullanacağımız içeriklerin bulunduğu kaynak gösterilmiştir. Şimdilik GraphicsDeviceManager ve SpriteBatch sınıflarının ne işe yaradığını çok fazla düşünmeyelim.


protected override void Initialize()
{
base.Initialize();
}


Initialize() metodu ise oyun içinde, oyun ile ilgili başlangıç değerlerinin belirlendiği bölüm olarak tanımlanabilir. Constructor 'ı oyunu programlamak için gereken teknik hazırlık aşaması olarak düşünürsek eğer Initialize aşaması da oyuna başlangıc için gereken hazırlık aşaması olarak tanımlanabilir.


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


LoadContent() methodunu, masa üstü uygulamalarındaki Form_Load methoduna benzetebilirsiniz. Açıklamak gerekirse, oyun ilk çalıştığı anda çalışan metottur. Oyun içinde kullanılacak nesnelerin yüklenmesi gibi amaçlar için kullanılabilir. Nitekim burada da aynen bu şekilde SpriteBatch tipinden bir nesne yaratılmıştır.


protected override void UnloadContent()
{


}

UnloadContent(), uygulama kapanırken çalışan metodumuzdur. Örnek vermek gerekirse; oyuncu oyunu kaydetmeden çıkmaya çalışırsa eğer ona oyunu kaydetmek isteyip istemediğini sorabileceğimiz bir çıkış işlemi süreci yazabiliriz.


protected override void Update(GameTime gameTime)
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();


base.Update(gameTime);
}



Update(), methodu oyunun çalışmaya başladığı andan itibaren çalışan bir metottur. Bu yüzden bu metod içinde oyun genelindeki bir çok kontrol ve yönetim işlemini kontrol edebiliriz. Örnek vermek gerekirse; hareket eden iki cismin çarpışıp çarpışmadığını bu method içinde rahatlıkla kontrol edebiliriz. Burada ise bir IF kontrolü ile gamepad 'de geri tuşuna basılıp basılmadığı kontrol ediliyor ve eğer bu tuşa basıldıysa oyun kapanıyor.


protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
base.Draw(gameTime);
}


Bir oyun nesnesini ekranda gösterebilmek için teorik olarak bunun ekrana çizilmesi gerekir. Draw() metodu da bu çizim işlemlerini gerçekleştirmekten sorumludur. Ayrıca Update() metodu gibi sürekli çalışan bir metottur.


Buraya kadar Game1.cs sınıfıyla birlikte gelen standart yapıyı kısaca görmüş olduk. Umarım artık kendinizi xna dünyasına biraz daha yakın hissetmeye başlamışsınızdır.

Mehmet Aydın Ünlü

0 yorum:

Yorum Gönder