C#nedir?com
 
YAZAR HAKKINDA
Mehmet Aydın Ünlü
Mehmet Aydın Ünlü
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
3 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: ardindan bunlarin derinliklerine ekrana farkli gereken ilgili kisaca kontrol methodu microsoft microsoft’ nesnelerin override oyunun C# / VC#/.NET Mehmet Aydın Ünlü
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Orta
Kategori : C# / VC#/.NET
Yayınlanma Tarihi : 6.1.2009
Okunma Sayısı : 36310
Yorum Sayısı : 1     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
XML - Deniz Kılınç
emre TAŞ
yazının devamı >
emre TAŞ
Decompiling and Reverse Engineering .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Masaüstü mü ? İnternet Mi? .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
.Net Kavramları - .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Yeni Başlayanlar için - .Net Radyo
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer 'in Blogu
ChatBot UI Sample 21.1.2018
Turhal Temizer 'in Blogu
C# – IRR Function 21.1.2018
Burak Selim Şenyurt
Sadece Tarayıcı Kullanarak Web API Servisini Google Cloud Platform Üzerinde Yayınlamak 21.1.2018
Burak Selim Şenyurt
AWS Lambda Üzerinde .Net Core Koşturmak 21.1.2018
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
XNA İle Oyun Programalama - 2
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
Bu makalemizle birlikte, XNA’ in ne olduğuna kısaca değineceğiz. Ardından XNA ile yapabileceklerimize bakacağız. Bunların dışında kaynak olarak yararlanabileceğiniz siteleri ve bu alandaki MVP ’lerin blog sayfalarını sizlerle paylaşacağım.Son bölümdede XNA’ in derinliklerine inip, bir oyun döngüsünün nasıl gerçekleştiğini inceleyeceğiz.

XNA İle Yapabilecekleriniz

Öncelikle kafadaki soru işaretlerini silmek amacıyla "XNA Nedir?" sorusunun yanıtı bulalım. Bunu yaperkende isterseniz önce olaya sadece saf bir programcı olarak, yani hiç bir ticari düşünce öne sürmeden bakalım. Bu açıdan baktığımızda; XNA, Microsoft’ un oyun programlama dünyasına .NET platformu ile destek vermek için ortaya çıkardığı çok kullanışlı, üstelik bedava bir framework’tür.

Şimdi birde olaya, Microsoft açısından ticari olarak bakarsak şunları görebiliriz; Dünya üzerindeki bir çok profosyonel oyun, C++/OpenGl/DirectX üçlüsü ile geliştirilmektedir. Fakat C++ Microsoft’ un geliştirdiği bir programlama dili değildir. İşte bu sebepten Microsoft bu alanda bende varım demek için XNA ’yi yarattı. Başka sebeplerde olabilir tabiki, sonucta ortada milyar dolarlık bir oyun sektörü var.Burada çok farklı ticari ve pazarlama stratejileri geçerlidir. Ama benim anladığım kadarıyla, en basit hali ile bu şekilde. Bunun yanında DirectX dediğimiz teknoloji(İlerleyen yazılarda daha detaylı bahsedeceğiz) bir Microsoft ürünüdür. Aslında Microsoft hemen hemen tüm yazılım geliştirme ürünlerinde C++ ’a destek vermektedir ama artık yeni çocuğu C# ’ ın yaygınlıgının iyice artmasını istiyor herhalde. Her ne kadar XNA çıkmış olsada, bundan sonrada bir çok oyun C++/OpenGL/DirectX üçlüsü ile yazılmaya devam edermi acaba diye düşünmüyorda değilim . Her ne kadar C++ tabanlı ugulama geliştirme şu anda bir adım önde olsada, bu cevaplaması çok zor ve karmışık bir konudur, o yüzden kesin bir cevap vermek istemiyorum. Ama XNA ile profosyonel büyük oyunlar geliştirmenin tek bir yolu var oda bu alanda çalışan insanların bir şekilde XNA’ i tercih etmesidir. Bunu yapmakta Microsoft’ un elinde olan birşey sanırım. Bunun dışında, işte Microsoft oyun geliştiricileri bir şekilde kendi ürünlerine çekmek için böyle bir yapı inşa etmiştir. Bu aşamada madem oyunlar hala C++ temelli geliştirilmeye devam edecek ozaman ben niye XNA ile uğraşayım diyenleriniz olabilir ama bu XNA’ in yetersiz bir teknoloji olduğunu göstermez. Aksine bence oyun programlama dünyasına adım atmak isteyen bir çok kişi için güzel bir başlangıç noktasıdır ve aslında gerçekten iyi bir teknolojidir.

Genelde insanlar Microsoft’ un sadece işletim sistemi ve ofis uygulamaları geliştirdiğini sanarak basit bir yanılgıya düşer. Sizlerin bu yanılgıya düşmediğini çok iyi bildiğim gibi hala bir çoğumuzun gözünden kaçan bir nokta olduğunuda söylemek gerekiyor ki oda, Microsoft’ un oyunda geliştirdiği ve bu alanda çok ciddi bir tecrübeye sahip olduğudur. Üstelik geliştirdiği oyunların geneli Dünya üzerinde bir çok fanı olan çok iyi oyunlardır. Örnek vermek gerekirse, AgeOfEmpires ve Empire serileri, Rise of Nations, Flight Simulator serileri, Midtown Madness serileri. ( diğer Microsoft oyunları : http://www.microsoft.com/games/) Bu oyunların her biri abartısız kendi alanlarında çıkmış en iyi oyunlardan biridir. Yani emin olun Microsoft’ un bu alanda son derece yeterli bir tecrübesi vardır ve XNA’ de bu tecrübeler dahilinde ortaya çıkmış bir yapıdır ve bu yüzden de yabana atılmayacak kadar iyidir.

XNA ile yapabileceklerinize gelirsek eğer, DirectX desteği sayesinde, 2D ve 3D oyunlar geliştirebilirsiniz. Input cihazlarını(klavye, mouse, gamepad) çok rahat kullanabilirsiniz. Bunların dışında hem PC hemde XBOX için oyunlar geliştirebilirsiniz. Evet işin güzel bir yanıda yaptıgınız oyun sadece PC ’de çalışacak diye bir şeyin söz konusu olmaması. XBOX içinde güzel konsol oyunları yazabilirsiniz. Burada beklentiniz eğer anlaşılması karmaşık cümleler ile XNA ’in ne kadar mükemmel şeyler yapabiliyor olduğunu duymak olmamalıdır bence. Çünkü ortada oyun geliştirmeye izin veren çok güzel bir platform var. Ama yinede böyle bir beklentisi olanlar için ekstra olarak şunu söyleyebilirimki XNA için çeşitli fizik ve grafik motorlarıda yazılmış durumdadır. Bunların linklerini yazının sonunda kaynaklar bölümünde paylaşacağım.

Burada konunun biraz dışına cıkıp programlama dünyasıyla ilgili bir klişeden bahsetmek istiyorum. Bilirsiniz şöyle bir laf vardır, "yapabilecekleriniz sadece hayal gücünüzle sınırlıdır." Durum aslında teoride gerçekten böyle olsada bu düşüncenin arkasında yatan başka bir neden vardır. Aslında işin özü bence yapamayacaklarınızın sizin yüzünüzden olmasıdır. Durumu teoride böyle motive edici cümlelerle ifade etsemde, real hayatta durum tabiki bu kadar basit değildir. Bir önceki parafrafta XNA ’in yapabileceklerinden bahsettik, şimdi şöyle düşünelim, XNA’ in bir DirectX desteği olmasaydı 3D oyun yapmak imkansız olmasa bile çok çok zor olmazmıydı. Yani ancak bu desteği kendiniz sağlarsanız olurdu ki buda DirectX’ i sıfırdan XNA destekli bir şekilde yazmak gibi birşeydir. O yüzden yapabilecekleriniz sınırsız gibi diyerek olayı abartmak yerine 2D ve 3D oyunları çok rahat bir şekilde yapabilirsiniz diyerek konuyu kısaca özetlemek istiyorum...

Şimdi gelin XNA hakkında bilgiler edinebileceğimiz kaynak web sitelerine bir göz atalım. İşe kesinlikle XNA’ in resmi geliştirici platformuyla başlamanızı öneririm.Diğerleride sırayla aşagıda.

XNA Resmi geliştirici platformu
http://creators.xna.com/en-US/

XNA/DirectX MVP’ lerinin Blogları
https://mvp.support.microsoft.com/communities/mvp.aspx?product=1&competency=XNA%2fDirectX

XNA Game Engines
http://www.ziggyware.com/weblinks.php?cat_id=10
http://www.garagegames.com/products/torque/x/
http://www.codeplex.com/RavenXNA
http://www.reactor3d.com/site/
http://www.carotengine.com/
http://roecode.wordpress.com/xna-gameengine-development-series/

XNA Physics Engines
http://www.codeplex.com/FarseerPhysics
http://www.ziggyware.com/weblinks.php?cat_id=18&weblink_item=4139


 

XNA Dünyasına Adım Atmak İçin Gerekenler

XNA dünyasına adım atmadan önceki son işlem olarak uygulama geliştirme ortamını hazırlamak gerekiyor. Bakalım bilgisayarımıza kurmamız gereken neler varmış.

Öncelikle notepadde kod yazmamak için bize gereken bir uygulama geliştirme ortamı gerekiyor. Microsoft bunu zaten bizlere ücretsiz olarak sunuyor. Visual C#2008 Express Edition, bu bizim bir çok uygulamada işimizi görecek kadar yeterlidir. Eğer elinizde full sürüm Visual Studio 2008 varsa onuda kullanabilirsiniz tabiki.
http://www.microsoft.com/express/download/default.aspx


Ardından XNA Game Studio’ nun son versiyonu olan 3.0’ ı kurmamız gerekiyor. Bu bizim XNA Framework’ ümüzün yer aldığı kurulum dosyamızdır ve oyun geliştirmemiz için gereklidir. XNA ile iligili herşey bunun içindedir.
http://www.microsoft.com/downloads/details.aspx?FamilyId=7D70D6ED-1EDD-4852-9883-9A33C0AD8FEE&displaylang=en

Son olarakta DirectX Runtime dosyalarını kurmamız yeterlidir. Bunun sayesinde artık DirectX’ in nimetlerinden yararlanabileceğiz.
http://www.microsoft.com/downloads/details.aspx?familyid=2da43d38-db71-4c1b-bc6a-9b6652cd92a3&displaylang=en

 

XNA Dünyasına Yolculuk

Bundan önceki bölümlerde oyun programcılıgı ve XNA üzerine genel olarak yeteri kadar teorik bilgi gördük diye düşünüyorum. Bu bölümle birlikte kısmen teorikte olsa XNA’in bazı teknik detaylarına değineceğiz. Ama bu sefer en azından bazı kodları inceleyeceğiz.

Şimdi XNA için gerekenleri kurdugumza göre, Visual Studio ’u açıp XNA’in derinliklerine inmeye hazırlanalım...



Başlat>Programlar>......

Programın nasıl açılacagını tarif etmek, teknik makalelerin vazgeçilmezlerinden olmuştur artık. Öncelikle Microsoft Visual C# 2008 Express Edition ’ı acıyoruz. File menüsünden, New Project’e tıklıyoruz ve aşagıdaki resimde gördüğünüz gibi Windows Game (3.0) proje şablonunu seçiyoruz. Ardından bir isim verip, OK diyerek ilk solution’ ımızı oluşturuyoruz.



Bu işlemi yaptıktan sonra solution’ ınmız olusacaktır. Programı derleyip, çalıştırdıgında ne göreceğini merak eden arkadaşlar hemen F5 yapabilirler. Şimdi Solution Explorer penceresinden proje ile gelen standart yapılara bir bakalım isterseniz.



Daha önce Windows Application geliştirmiş arkadaşlar için farklı gelen bazı yapılar görülebilir. Öncelikle şunu belirtelim, Solution’ın yaratılmasıyla birlikte, Content adında ufak bir proje daha otomatik olarak solution’a dahil edilmektedir. Content projesi yardımıyla oyunumuzun içinde yer alacak olan bir çok öge çok rahat bir şekilde yönetilebiliyor.(Grafik/Ses gibi) Ardından References düğümlerinden görebileceğiniz gibi Microsoft.Xna.Framework önekiyle başlayan farklı Assembly’ ler eklenmiştir. Bunlar tabiki XNA Framework’ ün kurulması ile sisteme yüklenen dosyalardır.
Bunlar dışında Game1.cs ve Program.cs olmak üzere 2 tane sınıf geliyor. Program sınıfı, diğer windows veya console uygulamalarındaki Program’ ın ta kendisi.Şimdi Game1.cs ’in derinliklerine inme zamanı.

Öncelikle sizlere XNA ile gelen bazı standart namespace’lerden bahsetmek istiyorum.

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

using Microsoft.Xna.Framework.Audio; MSDN Link
Auido kelimesi ile herşey anlaşılıyor gibi ama daha somut olması gerekiyor bence. Oyunlarda çeşitli müzikler veya ses efektleri kullanmamız gerekir. Bizde XNA ’de oyunlarımıza, 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. XACT’nin oluşturugu 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 bulunur. (Content Pipeline nedir bu yazıda ilerleyen bölümlerde 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 sınıf yer almaktadır.Bu servisler direk olarak kullanıcı ile iletişim icinde bulunurlar.

using Microsoft.Xna.Framework.Graphics; MSDN Link
Grafiksel işlemleri gerçekleştirip yönetebileceğiniz sınıfları bünyesinde bulundurur. Ekrana bir resim veya 3D bir obje koymaktan tutunda, ekran kartı özelliklerine erişmeye kadar bir cok 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ı namespace’dir. Klavyede herhangi bir anda hangi tuşa basılmış veya mouse’un pozisyonu nerede gibi bircok 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çeren namespace’imiz.

using Microsoft.Xna.Framework.Storage; MSDN Link
Dosyaları okumak ve dosyalara yazma işlemi yapmak icin gerekli sınıflara sahip olan namespace.

 

Game1.cs ’in Temel Yapıları

Namespace’lerimizi kısmen tanıdığımıza göre şimdi Game1.cs dosyamızın daha da derinlerine inelim ve bakalım içinde standart olarak gelen hangi methodlar var ve bunlar ne işe yarıyor...


public class Game1 : Microsoft.Xna.Framework.Game

Sınıfımız görüldüğü gibi XNA Framework içinde bulunan Game ’adındaki bir sınıftan türemektedir. Yani oyunlarımız Game isimli sınıfın tüm özellik ve yetenekleri barındıran yeni sınıflardır.

 

GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;

public Game1()
{
   graphics = new GraphicsDeviceManager(this);
   Content.RootDirectory = "Content";
}
Her sınıfın oldugu gibi, Game1 sınıfımızında bir Default Constructor’ı bulunmaktadır. Constructorlar içinde yaptıklarımızı hatırlamak gerekirse, program genelindeki verilerin başlangıc degerlerini set etmek için kullanıldığını söyleyebiliriz. Nitekim burada da, ekran kartına erişebileceğimiz sınıftan bir nesne yaratılmıştır. Ve içeriklerin bulundugu kaynak dosya gösterilmiştir. Şimdilik GraphicsDeviceManager ve SpriteBatch sınıflarının ne işe yaradıgını düşünmeyelim.

protected override void Initialize()
{
   base.Initialize();
}
Initialize() methodu ise oyun icinde, oyun ile ilgili başlangıc değerlerinin set edildiği bölüm olarak tanımlanabilir. Constructor’ı oyunu programlamak için gereken teknik hazırlık aşaması olarak düşünürsek, Initialize aşaması oyuna başlangıc için gereken hazırlık aşaması olarak tanımlanabilir.



protected override void LoadContent()
{
    spriteBatch = new SpriteBatch(GraphicsDevice);
}
LoadContent ’i, desktop uygulamalarındaki Form_Load ’a benzetebilirsiniz. Yani oyun ilk çalıştığı anda çalışır. Oyun içinde kullanılacak nesnelerin yüklenmesi için kullanılabilir. Nitekim buradada aynen bu şekilde SpriteBatch tipinden bir nesne yaratılmıştır.



protected override void UnloadContent()
{

}
UnloadContent, uygulama kapandıgı anda çalışan methodumuzdur. Burada mesela oyuncu oyunu kaydetmeden cıkmaya çalışırsa, ona oyunu kaydetmek isteyip istemediğini sorabileceğimiz bir sürec 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ıgı andan itibaren sürekli çalışan bir methodudur. Bu yüzden method içinde, oyun genelindeki bir çok kontrol ve yönetim işlemini kontrol edebiliriz.Örnek vermek gerekirse hareket eden iki cismin çarpısıp çarpışmadıgı bu method içinde rahatlıkla kontrol edebiliriz. Burada ise bir IF kontrolü ile, gamepad’ de geri tuşuna basılıp basılmadıgı kontrol ediliyor. Bunu PC oyunlarımızda, ESC’ye basınca çalışan mantık olarak düşünebilirsiniz.İlerde bunları sık sık kullanacagız.



protected override void Draw(GameTime gameTime)
{
    GraphicsDevice.Clear(Color.CornflowerBlue);
    base.Draw(gameTime);
}
Ekranda bir oyun nesnesini gösterebilmek için teorik olarak bunun ekrana çizilmesi gerekir. Draw methoduda bu çizim işlemleri gerçekleştirmekten sorumludur. Ayrıca, Update gibi sürekli çalışan bir methoddur.




Bir Oyunun Yaşam Döngüsü

Evet Game1.cs sınıfımız ile gelen standart yapıları kısaca bu şekilde özetleyebiliriz. Artık bu sınıfa biraz daha aşina olduğunuzu düşünüyorum. Şimdi en basit haliyle bir oyunun yaşam döngüsü nasıl olur bir bakalım isterseniz.

Oyun döngüsünü kısaca aşağıdaki şekilde özetleyebiliriz;

  • Öncelikle oyunun başlangıç değerleri ile ilgili değerlerin set edileceği bir hazırlık aşaması olmalı.
  • Oyun içinde kullanılacak kaynakların yani nesnelerimizin oyun ortamında kullanılabilmesi için yüklenmesi.
  • Hazırlık ve yükleme aşamalarından hemen sonra oyun döngüsünün başlaması.
  • --- Kullanıcı girişlerinin okunması
  • --- Gereken hesaplamaların yapılması (Çarpışma kontrolü gibi)
  • --- Döngüyü sonlandıracak etkenlerin kontrolü. Mesela ESC tuşuna basılması veya oyun karakterinin ölmesi gibi.
  • --- Nesnelerin ekranda çizilmesi. Seslerin durumlara göre çıkartılması.
  • Tüm bu, giriş ve çıkış işlemlerinin sonlandırılması
  • Kaynakların serbest bırakılması.
Dikkat ettiyseniz eğer, bir önceki alt başlıkta, tüm bu oyun döngüsündeki aşamalara karşılık gelen kod blokları olduğunu görebilirsiniz. Mesela ilk adım olarak hazırlık için bir Initialize methodu olması gibi. Veya oyun döngüsünü içeren Update methodu gibi. Yani aslında bu, şu demek; XNA bize kodlama yapacağımız yerleri kısmen belirtiyor ve nerde ne yazmacagımızı bize söylüyor. Bu tarz bir çalışma modeli, profosyonel oyun geliştiriciler veya programcılar için basit ve amatörce gelebilir. Yani C++ ’a yıllarını vermiş tecrübeli insanlar için bu çok kolay gelen ve sinir bozucu bir yapı olabilir. Ama bu asla XNA’ in kötü oldugu anlamına gelmez.Gördüğümüz kodlar XNA ile gelen en basit yapılardır. Sonucta OOP tabanlı bir dil kullanıyorsunuz ve bu yapıların dışına çıkıp, OOP ’nin tüm nimetlerinden yararlanabilmek sizin programcılık yeteneğinize kalmış bir şeydir. Yani siz XNA’in UserInput arabirimini beğenmiyorsanız, kendiniz bir UserInput sınıfı yazıp onu kullanabilirsiniz. XNA’i geliştirenler bizim için böyle bir kolaylık sağlamışlar sadece.


Şimdi biz F5 ’e bastıgımızda, programın derlenip çalışması için ilk çalışan method olan EntryPoint’imize kısaca bir bakalım. Yine WindowsApplication geliştirenlerin aşina oldugu bir kod blogu göreceğiz.Kodu görmek için Program.cs dosyasını açabilirsiniz.


static void Main(string[] args)
{
   using (Game1 game = new Game1())
   {
      game.Run();
   }
}
Kısaca özetlemek gerekirse, EntryPoint olan Main methodu içinde, game adında bir Game1 nesnesi yaratılıyor. Run methodu ise artık oyunumuzun başlamasını sağlıyor.



Dahada Derinlere...

Şimdi tüm bu aşamaları 3 ana başlık altında toplayıp ardından bunların derinliklerine ineceğiz.

1 - Game Initialization (Hazırlık)
2 - Game Loop (Döngü)
3 - Finalization (Bitiş)


1 - Game Initialization

Hatırlarsanız Game1 sınıfı içinde 2 tane nesne tanımlaması vardı. Bunlardan biri GraphicsDeviceManager tipinden bir nesne, diğeride SpriteBatch tipinden bir nesneydi. İşte bizim GraphicsDeviceManager tipindeki graphics nesnemiz oyun dünyasında yer alacak olan nesnelerin, bu dünya icine eklenmesinden, ekran kartı ile ilgili ayarlamalardan, pencere boyutunun belirlenmesi ve bunlar gibi bir cok ayarın yapılmasından sorumludur. Diğer yandan, spriteBatch nesnemiz ise ekrana yazı yazmak veya 2 boyutlu resimleri ekran üzerinde göstermek ve yönetmekten sorumludur. Bunlar dışında Constructor içinde, kaynakların yer aldıgı root klasörü belirten bir tanımlamada mevcuttur.

Content.RootDirectory = "Content";



Content PipeLine Manager

PipeLine, iş hattı olarak Türkçe’ leştirilen bir kelimedir. Bu şekilde Türkçe’ leştirince İçerik işhattı yönetimi gibi birşey oluyor ve ilk olarak anlamsız gelebiliyor. Bunun yerine daha anlaşılır olması amacıyla buna içerik yönetim sistemi de diyebiliriz.

Oyunlarda bir içerik yönetim sistemi olması neden önemlidir kısaca buna değinmek gerekirse; geliştirdiğiniz uygulama bir oyun projesi oldugu için görsel ve işitsel olarak bir cok farklı medya türü proje dahilinde kullanılacaktır. Bir desktop uygulaması geliştirirken cok az resim’e ihtiyacınız olur ve bunları images adı altında bir klasörde toplarsınız böylece başınız cok agrımaz. Bunun yanında herhangi bir ses veya video türünde bir medyaya da ihtiyacınız olmaz. Fakat oyunlarda bu durumun tamamen tersi bir şey söz konusudur. Binlerce resim, binlerce 3D obje, binlerce ses doyası onlarca video gibi farklı farklı formatlarda bir çok medyaya ihtiyacınız olur ve bunları yönetebilmek başlı başına bir iştir. XNA’in bize sundugu bu içerik yönetim sistemi, içerikleri sadece fiziksel olarak yönetmenin yanında bunların ele alınış ve işleniş biçiminden de sorumludur. Yani bu şu demektir, ekrana bir resim çizileceği zaman veya bir ses cıkartılacagı zaman bu tamamen ContentPipeLine mimarisinin sundugu imkanlar dahilinde gerçekleşen bir şeydir.

ContentPipeLine mimarisi dedik peki bu mimari XNA’de nasıl işliyor buna kısaca bir bakalım isterseniz. İsterseniz kısaca aşağıdaki grafiğe bir göz gezdirin.



Öncelikle en baştaki mavi kutucuklar XNA’in desteklediği bazı dosya tiplerini niteliyor. Bu dosya tipindeki veriler öncelikle uygun Importer ’lar tarafından okunuyorlar. Ardından bu verilerin herbiri ContentDOM dediğimiz bir içerik bulutunda toplanıyor. Processor’lar kendilerine uygun olan verileri bu buluttan alıyorlar ve veriyi XNA ’in anlayacagı şekilde işliyorlar. ContentCompiler bu verileri derliyor ve .XNB formatına çeviriyor. Ardından bu .xnb’ler oyun icinde kullanılıyor. Kısaca XNA’deki ContentPipeLine mimarisini bu şekilde özetleyebiliriz.

Şimdi Importer’ların okuyabileceği farklı dosya formatlarına bir bakalım.

3D File Format : X dediğimiz DirectX ile oluşturulmuş dosyaları belirtiyor. Bunun yanında FBX ise çeşitli 3D programları ile yaratılan dosyaları belirtiyor. Mesela 3DS Max veya Maya ile oluşturdugunuz bir 3D model.

Material File Formats : FX, çeşitli 3D efektleri içeren dosya formatı.
2D File Formats : En sık kullanılan 2D dosya formatları. (BMP, DDS, DIB, HDR, JPG, PFM, PNG, PPM, TGA gibi)

Font : Yazı tipleri.

Audio File Format : .XAP, daha öncede bahsettiğimiz XACT adındaki ses yönetim aracı sayesinde oluşan dosya formatı.


Importer’ların okudugu bu dosyalar, ilerde oyun içinde birer nesne olarak ele alınabilmek için processor’lar tarafından runtime’da birer nesne olarak oluşturulur.



2 - Game Loop

Oyun genelindeki bir çok işlem oyun döngüsü içinde gerçekleşir.Bu yüzden oyun döngüsünü yönetebilmek son derece önemlidir. Oyun döngüsü aksi belirtilmedikce oyun genelinde sürekli çalışır. Bu yüzden bu döngü içinde yapılan işlemlere; kullanıcı girişlerinin kontrolü, yapay zeka işlemlerinin hesaplanması, oyun içindeki nesnelerin hareketleri ve bu bağlamda bu hareketler arasındaki etkileşimlerin hesaplanması, oyunu sonlandırıcı durumların kontrolü, oyun içindeki ses efektlerinin ve müziklerin gerçekleşmesi gibi şeyleri örnek verebiliriz. Aynı zamanda oyun döngüsü içinde oyunda yer alacak nesnelerin ekrana çizilmeside gerçekleşir.

Bu bağlamda XNA bize Microsoft.Xna.Framework.Game sınıfı içinde, oyun döngüsünü gerçekleştirebileceğmiz 2 tane override edilebilen method sunuyor.Bu methodlara artık aşina oldugunuzu düşünüyorum çünkü bunlar az önce yukarda bahsettiğmiz Update ve Draw methodlarından başkası değildir. Kısa ve basit bir şekilde özetlemek gerekirse, Update methodu içinde yapay zeka, çarpışma kontrolü veya oyunu sonlandırıcı etkenler gibi, oyun içinde genel olarak hesaplanması gereken tüm algoritmik işlemleri yapılabiliriz. Draw ise sadece ekrana bir şeyler çizmek için kullanılabilir. Böylece oyun döngüsünü sürdürebilmek icin gereken işlemleri daha kolay bir şekilde yönetilebiliriz.

Şimdi dikkat edilmesi gereken bir diğer nokta ise bu 2 methodun aldıkları parametre. Dikkat ettiyseniz her 2 methodda GameTime tipinden birer parametre alıyor.

protected override void Update(GameTime gameTime)
protected override void Draw(GameTime gameTime)
GameTime neden önemli derseniz, oyun içinde gerçekleşecek olan tüm olayların ortak bir zaman dahilinde oluşması ve bu zaman içinde kontrol edilmesi gerekir. İşte biz GameTime ile bu zamanı kontrol edebiliyoruz.GameTime’ in çeşitli propertylerini örnekler ile çalışmaya başladıgımız zaman daha detaylı bir şekilde göreceğiz.

Update methodu içinde yapılabileceklerden somut bir örnek vermek gerekirse, kullanıcının input cihazları ile yaptığı girişleri kontrol etmek söylenebilir. Mesela aşağıdaki kod ile kullanıcının ESC’e basıp basmadıgı kontrol ediliyor ve basıldıysa oyunu sonlandırıyor. Bu tarz örnekleri ilerde uygulama yapmaya başladıgınız zaman sık sık kullanacagız.(Kodu Update methodu içine yazmanız yeterli)

KeyboardState ks = Keyboard.GetState();
if (ks.IsKeyDown(Keys.Escape))
{
   this.Exit();
}
 

Draw methodu içinde bulunan aşagıdak kod ise ekran temizlendiği zaman arka plan renginin ne olacagını belirtiyor. Bu örnek biraz basit oldu ama bir sonraki dersimizde Draw methodu için cok daha somut ve işlevsel şeyler yapacağız.

GraphicsDevice.Clear(Color.CornflowerBlue);


3 - Game Finalization

XNA’ de, olayların ve nesnelerin sonlandırılması arka planda gerçekleşen ve son derece basit bir işlemdir. Bu işlem tabiki .net platformunun sahip olduğu güzelliklerden biri olan GarbageCollector sayesinde gerçekleşiyor. Bu sonlandırmayı oyunun bitmesi veya kapanması olarak algılamayın.Aksine oyun icinde gerçekleşen bir olayıdr.Nesnelerin oyun icinde olusturup kullanılmasından sonra, onlarla işimiz bittiken sonra, ramde tutulmasınında bir anlamı yoktur. Bu amacla bu nesnelerin bellekten cıkartılması gerekir.Bunuda GarbageCollector yapmaktadır.

Bu yazımızla XNA’i daha yakından tanımaya ve derinliklerine inmeye çalıştık. ContentPipeline gibi mimari yapılara değindik ve bir oyunun yaşam döngüsü XNA ’de nasıl gerçekleşiyor bunları kısaca gördük.


Hepinize iyi çalışmalar dilerim...

Kaynak : APress, Beginning XNA 2.0 Game Programming: From Novice to Professional

Mehmet Aydın Ünlü
aydinunlu85@gmail.com
http://aydinunlu.blogspot.com

Makale:
XNA İle Oyun Programalama - 2 C#, Visual C# ve .NET Mehmet Aydın Ünlü
  • Yazılan Yorumlar
  • Yorum Yaz
ŞUB
1
2013
Yav şu .xnb yi ben istemiyorum, yani hepsini xnb olması yerine ben textureleri biraraya getirip bir .xxx formatında tek bir dosya olarak kaydetmek istiyorum, modelleri ayrı bir formatta... bunu nasıl yapabilirim? yani xnb yi değiştirmek ve bir araya dosyaları getirip yapmak. ??
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor