14 Ekim 2009 Çarşamba

C# ile Pişti Oyunu (XNA Framework)

Xna teknolojilerini kullanarak bilgisayar ile kullanıcı arasında oynanabilen basit bir arayüze sahip
C# ile kodlaması gerçekleştirilmiş basit bir oyundur.
Bilgisayarın oynama mantığı çok gelişmiş değil.Kağıt saymıyor ancak mantıksız kağıtlar atmıyor. Gerçi oyunu ilk geliştirmeye başladığım zamanlarda yerde kağıt yokken vale attığı, elinde pişti yapıcak kağıt varken atmadığı oluyordu.:)

Uygulamanın örnek görüntüsü


Kaynak kodlara www.csharpnedir.com sitesinden Kaynak Kodlar bölümünden ulaşababilirsiniz.İndirmek için
http://www.csharpnedir.com/sourcecodes/download/?id=77&title=XNA%20ile%20Yap%C4%B1lm%C4%B1%C5%9F%20Pi%C5%9Fti%20Oyunu
bu link kullanabilirsiniz.

20 Ağustos 2009 Perşembe

XNA ile Oyun Programlama

XNA ile bugün geliştireceğimiz uygulamamızda 800x600 ekranımıza bir resim ekleyip bunu nasıl hareket ettirebileceğimiz konusu üzerinde duracağım.
Öncelikle çalışacağımız ekranın koordinat düzlemine benzer bir yapıda old
uğunu ve sol üst köşeşinden başladığını unutmayalım ancak bu düzlemde karışıklığa sebep olmamak için negatif değerler yerine koordinatlar için pozitif değerler kullanılmaktadır.
Öncelikle kullanacağımız görüntünün boyutunu, konumunu ve resmimizi tutacak
Texture2Dyapılarını tutan bir sınıf geliştirmek.Image a
dında bir sınıf oluşturuyoruz.Sınıfı oluştururken kullanacağımız Microsoft.Xna.Framework isimalanını ve diğer gerekli isim alanlarını eklemeyi unutmayalım.Vector2 bizim gerekli koordinatları tutabileceğimiz ,Texture2d ise 2D resim dosyalarını tutabileceğimiz bir sınıftır.Kullancağımız resim ve ses dosyalarını projemizde bulunan Contents altında bulundurmamızgerekiyor.Bu dosylarımız bir Asset Name özelliği bulunmaktadır.Bu özellik yardımıyla Texture2D im= Content.Load("Images/image"); şeklinde resmin uzantısını vermemize gerek kalmadan resmimiz yüklenmiş olur ancak henüz çizim işlemi yapılmamıştır.

Image instance = new Image(Content.Load("Images/image"), new Vector2(69, 79), new Vector2(0,0));
şeklinde nesnemizi üretiyoruz.Resmimizi çizdirmek için Draw metotu içerisine

spriteBatch.Begin(); spriteBatch.Draw(instance.image, instance.point, Color.CornflowerBlue);
spriteBatch.End();

şeklinde resmimizi çizdirmiş oluyoruz.Ancak görüldüğü gibi resmimiz harek
etsizdir. Hareket ettirebilmemiz için Update metotu içerisinde gerekli işlemleri tanımlamamız gerekmektedir.
Biz 800x600 yapımızda hareket eden bir top ve bu yapı içerisinde çarpışması ve her çarpışmada
MediaPlayer yardımıyla bir mp3 dosyayının nasıl çalışacağı ve çarpışmanın sayısını sayan bir yapı tasarlayacağız. Çarpışma kontrolunu oluşturduğumuz aşağıdaki metot yardımıyla gerçekleştireceğiz.
Update metotu içerisinden çağırdığımız metot şu şekilde tanımlandı.

Ekranımızın boyutları ve o anki konumları parametre olarak gönderildi.ref anahtar sözcüğü ile göndermemizin sebebi ise değer tipi olan x ve y değerlerinin direk değişmelerini sağlamak.Döndürülen değerlerin OR işlemine tabi tutulması ise herhangi bir çarpmanın gerçekleşip gerçekleşmediğidir.Metotumuz

yaptığı iş ve nasıl çalıştığı ayrıntılı şekilde tanımlanmıştır.
Update metotumuz ise
if (instance.ImageMove(800,600,5,10)) { MediaPlayer.Play(song); }
şeklinde çalışmaktadır ve çarpma işlemi gerçekleştiğinde MediaPlayer yardımıyla çarpma sesi
çalmamıza sebep olacaktır. Ses dosyasını oyuna dahil etmek için ise
Song song = Content.Load("Musics/crash");
kullanabiliriz.

Uygulamamız üzerinde string ifadeler yazmak istersek
Content>Add>New Item> Sprite Font ile bir dosya ekliyoruz.Bu dosyamızda yazının
fontu özellikleri belirlebilmektedir. Bunu uygulalamıza çizdiribilmek için ise öncelikle LoadContent metotu içerisinde
Font font = Content.Load("yazi"); şeklinde yüklenmeli ancak bu nesnelere erişim için bunları global tanımlamamız gerektiğini unutmamalıyız.Ekranda çizdirilmesi işi diğer image dosyalarının olduğu gibi draw metotu içerisinde yapılır vespriteBatch.DrawString(font, "Carpma Sayisi=" + Image.Count.ToString(), new Vector2(0, 570), Color.Black); şeklinde yapılabilir.
Bu makalemizde XNA için resim, ses ve font dosyalarını ekleme resim dosyalarının hareket ettirme, ses dosyalarının çalınması ve font dosyasının ekrana nasıl çizilebileceğini incelemiş olduk.Uygulamanın örnek görüntüsü. Kaynak kodlara buradan ulaşabilirsiniz.





13 Ağustos 2009 Perşembe

XNA Nedir?

Kısaca ,Xna Microsoft'un oyun programlama için geliştirdiği framework'tür.Bu framework ve DirectX'e verdiği destek ile birlikte 2d ve 3d oyunlar yapılabilecek bir ortam oluşturulmuştur.

XNA ile çalışmak için neler yapmalıyız?
  1. 1)XNA Game Studio’ nun son versiyonu olan 3.0 kurulu olması gerekir.
    Dosyayı bu linkten indirebilirsiniz.
  2. DirectX Runtime dosyalarının kurulu olması gereklidir. Dosyayu bu linkten indirebilirsiniz.
Bu dosyaları kurduktan sonra Visual Studio 2008'i açıp XNA Game Studio'dan Window Game (3.0) seçiyoruz.
Karşımıza normal uygulamalarda kullandığımız proje yapısına benzer bir yapı geliyor.Content alanında ise oyun geliştirirken kullanacağımız resim ve ses dosyalarını burada konumlandırıyoruz.
Game1.cs dosyanı açtığımız zaman karşımıza override edilen bir çok metot gelmektedir.Bu metotlar oyun programlamada kullancağımız temel metotlardır.
protected override void Initialize() oyun için gerekli ilk değerleri verebileceğimiz kısımdır.

protected override void LoadContent() form uygulamalarında kullandığımız form load olayına benzemektedir.Oyun içinde kullanılacak nesnelerin oluşturulduğu yer olarak düşünülebilir.

protected override void UnloadContent() uygulama kapatılırken gerçekleştirilecek işlemlerin kodlanması gereken metottur.

protected override void Update(GameTime gameTime) uygulamamızın en önemli metodu olarak görebiliriz.Kullancıdan gelecek tuşa basılma mouse hareketleri gibi olaylar ve bundan sonra gerçekleştirilecek işlemler, cisimlerin hareket ettirilmesi gibi işlemler burada gerçekleştirilmelidir.

protected override void Draw(GameTime gameTime) metodu ise nesnelerin ekrana sürekli olarak çizdirilmesini sağlayan metottur.

Update ve Draw metotları sürekli çalışan iki metottur.

Kullanabileceğimiz bir kaç temel yapı şu şekildedir.
SpriteBatch nesnesi ekrana yazı yazmak ve kullanacağımız resimleri çizdirmek icin kullanacağımız yapıdır.
GraphicsDeviceManager tipindeki graphics nesnesi ise ekran kartı ile ilgili ayarlamalar gibi işlemlerin gerçekleştirilmesini sağlamaktadır.
Song oyun sırasında kullancağımız müziklerin tutabileceği bir sınıf, MediaPlayer ise bu yapıları çalabileceğimiz
temel bir sınıftır.

Bu makalemizde XNA ile oyun geliştirirken neler yapmamız gerektiği hangi araçlara ihtiyacımız olduğu
ve oyun geliştirken kullanacağımız temel metotları tanımaya çalıştık. Bir sonraki makalemde ufak bir XNA uygulaması geliştireceğiz.

Umarım yararlı olmuştur.



11 Ağustos 2009 Salı

WİNAPI Fonksiyonlarının Kullanımı

.Net ortamında Win32 apilerinin nasıl kullandıkları hakkında bilgiler ve bu yapıları kullanarak ufak bir uygulama geliştireceğim. Windows üzerinde çalışan çeşitli uygulama ve verilere .Net ortamında doğrudan erişmemiz mümkün değildir.Ancak sistemde bulunan dll dosyalarının yardımıyla bu bilgilere ulaşabildiğimizi göreceğiz.
C ya da C++ ile uğraşanlar pointer yapısını ve nekadar zorlayıcı olduklarını bilirler.Java'da pointer yapısı yoktur. Ancak bu ortamda pointer yapısına destek verilmektedir. Aralarındaki önemli farklardan biri olarak da bunu söyleyebiliriz.Bunun en önemli sebebi ise WinApi fonksiyonlarından yararlanmaktır.

Winapi fonksiyonlarının ayrıntı bir listesini görebilmek için burayı ziyaret edebilirsiniz.

Bu yapıyı kullanabilmememiz için System.Runtime.InteropServices isimalanındaki DllImprtAttribute sınıfını temsil eden DllImport özelliği kullanılır.external anahtar sözcüğü ile bu yapının CLR tarafından yönetilmeyen bir metot olduğunu bildirmemiz gerekmektedir.Bu metot daha önceden yazıldığı için içerisi doldurulmayacak sadece bildiriminin yapılması gerekmektedir.

Sistemi saniyede bir kontrol ederek sistemde o an aktif durumda bulunan pencerenin process
adının ve id bilgisinin ekrana yazıldığı bir console uygulaması geliştirdim.Görüldüğü gibi

[DllImport("User32.dll")]
static extern IntPtr GetForegroundWindow();

şeklinde tanımlaması yapılmaktadır ve geriye pointer tipi diyebileceğimiz IntPtr nesnesi döndürnektedir.



Bu yapı kullanarak sistem üzerinde bir çok iş yapılabilir ancak eğer Framework içerisinde uygun sınıflar varsa onların kullanıması daha uygundur.Örneğin MessageBox winapi kullanılarak da çağrılabilir ancak framework içerisinde bulunan sınıfın kullanılması daha mantıklıdır.WinApi Framework'ten yapılamayan işler için tercih edilmelidirler.

Örnek kodlara buradan ulaşabilirsiniz..

10 Ağustos 2009 Pazartesi

Genişletme Metotları(Extension Methods)

C# 3.0 ile meydana gelen yenilikler arasındadır.
Bu yapının kolaylıkla anlaşılabilmesi için mirastan bahsetmek istiyorum.Bir sınıfın özellikleri miras alınarak yeni bir sınıf oluşturabilir ve bu yeni sınıfa istediğimiz metot ve alanları ekleyebiliriz.Ve miras aldığımız sınıfın bize erişim belirteçleriyle izin verdiği dahilde oranda metot ve alanlara erişebiliriz.Ancak sealed anahtar sözcüğüyle etiketlenmiş bir sınıftan türetme yapamayız.Örneğin System.String ve System.Int32 sınıfları sealed anahtar sözcüğüyle etiketlenmiştir ve bu sınıflardan türetme işlemini gerçekleştiremeyiz.Ancak bu sınıflara ek özellikler eklemek isteyebiliriz.Bunun için karşımıza genişletme metotları çıkmaktadır.

Bu yapıyı kullanabilmek için 3 temel şartı yerine getirmemiz ger
ekmektedir.
  1. Bu metodu tanımlayacağımız sınıf static olmalıdır.
  2. Tanımlayacağımız metot static olmalıdır.
  3. Metot parametresi verilirken metodun ilk parametresini işlem yapmak istediğimiz tipten bir nesne this anahtar sözcüğü ile belirtilmelidir.


Yandaki resimde görüldü
ğü üzere String tipine bir genişletme metodu eklenmiştir ve GetCrypt adlı metot ile md5 algoritmasından yararlanarak 128 bitlik bir checksum elde edebildiğimiz bir metot oluşturulmultur.128 bitlik bu ckecksum hexdecimal olarak oluşturulmaktadır.

Örneğin 12-AB-3F-00-DD-AA-45-23-FB-AC-52-11-23-78-9D-AA şeklinde bir string döndürmektedir.
Koddan da görüldüğü üzere genişletme metotu(overloading) aşırı yüklenmiştir.Yani genişletme metotları aşırı yüklenebilmektedir.

Sadece bu yapılara genişletme metotları eklenmez.Örneğin var olan tiplere yeni metotlar eklenebilmesi için de bu yapı kullanabilir.Temel amaç ise yazılmış olan uygulamaların çalışma sistemini bozmadan yeni fonksiyonellikler katarak genişlemelerine yardımcı olur.























Örneğin bir string tipinde veriler tutan bir list generic yapısı için geliştirilmiş bu metotta verilerin kaç kere geçtiklerini sayan ve bunu da Dictionary tipinde geriye döndüren bir yapı sağlanmıştır.GetData adlı metotta ise Dictionary tipinde veri alan bir metot geliştirilmiştir.


Bu yapı nesneye yönelik programlamanın özelliği değil .Net Framework yapısında bulunan özelliklerdir.
Kısaca
  1. Genişletemediğimiz sealed yapılarında
  2. Var olan veri tiplere yeni özelliklerin eklenmesini sağlamak için
  3. Kaynak koda erişilemediği durumlarda ek işlevsellik katabilmek için kullanılır.
Projenin kaynak kodlarına ulaşabilmek için:Download