4 Temmuz 2013 Perşembe

Yeni Nesil İş Uygulamalarının Mimarı C# ve Diğer Diller

Şirket yöneticileri geliştirilecek proje için bir programlama dilini seçmek zorunda kaldığında genelikle şu soruyu sorar : Hangi programlama dili ile projeyi en etkin ve en hızlı şekilde müşterime sunabileceğim hale getirebilirim? Bu sorunun çözümüne ulaşmak o kadar da kolay olmuyor maalesef. Çözüme zor ulaşmada programlama dillerinin fazla olmasının etkisi omakla beraber her bir programlama dilinin sunduğu standart kütüphanenin farklı olmasının da etkisi oldukça fazladır. Özellikle günümüz iş uygulamaları birden fazla platformu destelemek zorunda kalmıştır. Buda seçilecek uygulama geliştirme ortamının önemini açıkca göstermektedir. Uygulamaların internet ortamına taşınması ile birlikte bir programlama dilinden beklenen özelliklerde doğal olarak değişmiştir. 1970’ li yıllarda bir mikroişlemciyi programlamak ne denli önemli olduysa 2000’li yıllarda interneti programlamak o kadar önemli olmuştur.
İnternet’in iş dünyasına girişi ile birlikte geliştirilen uygulamalardan beklenenler de değişmiştir. Bu durum doğal olarak uygulama geliştiricileri doğrudan etkilemiştir. İnternet ortamında çalışan ve dağıtık yapıda çalışabilen çok yönlü bir uygulama geliştirmek eski yöntemlerle imkansız değildir ancak inanılmaz derecede zaman ve insan gücü gerektirmektedir. Bu zorulukları aşmak için gelişen teknolojiye ve isteklere paralel olarak programlama dilleri de doğal gelişim içine girmiştir. Bu yazıda son yıllarda iş ve kişisel uygulama geliştiricilerin adını sıkça duyduğu C# programlama dili ve diğer dillerle olan ilişkisi anlatılacaktır. C# programlama dilinin sunduğu imkanları anlatmaya başlamadan önce programlama dillerinin tarihsel gelişimine göz atmak gerekir. Zira C# dili yıllardır yoğun bir şekilde kullanılan C,C++ ve JAVA dillerinin temelleri üzerine kurulmuştur. Şunu da hemen belirtelim ki, son geliştirilen ilk geliştirilenden çoğu zaman daha iyi olacaktır. Bu yüzden eski ile yeniyi karşılaştırırken ticari amaçları bir kenara bırakıp objektif bir gözle değerlendirmek gerekir.
C#’ı konuşmadan önce C, C++ ve C# ile yakından ilişkili olan JAVA’dan bahsetmek gerekir.
C dili ve Yapısal Programlama
Düşündüklerimizi makinelere yaptırma isteğimizin bir sonucu olarak programlama dilleri doğmuştur. Makineleri anlamak insanoğlu için o kadar da kolay olmamıştır. Zira makinelerin(bilgisayarların) anladığı dilden konuşmak insanlar için gerçekten zor bir iştir. Gün geçtikçe makineleri anlamak ve onları programlamak için yeni arayışlar içine girildi. Somutlaştırılmış makine komutları sayesinde bilgisayarları daha etkili bir şekilde yönetmek mümkün hale gelmiştir. Zaman ilerledikçe bilgisayarlar sadece belirli bilimsel hesaplamaları yapmak için kullanılan araç olmaktan çıkıp insanların yaşamlarında rutin işleri yapabilecek araç haline geldi. Bilgisayarların insanların ihtiyaçlarına hızlı bir şekilde cevap verebilmesi için onları hızlı bir şekilde programlamak gerekiyordu. Klasik yöntemlerle(makine komutlarıyla) hızlı çözümler üretilemez hale gelince daha yüksek seviyeli programlama dillerine ihtiyaç duyuldu. 1980’li yıllarda en çok kullanılan programlama dili olan “C” bu anlamda atılmış büyük bir adımdır. Yapısal programlama modeli her ne kadar C dilinden önce de yapılıyor idiyse de asıl büyük gelişmeler C dili ile birlikte olmuştur. C gibi makine diline göre yüksek seviyeli programlama dilleri ile büyük projeler yapılabiliyordu. Artık uygulamalar sadece bilimsel çalışma aracı olmaktan çıkıp iş dünyasında kullanılabilen uygulamalar haline geldi. Bütün bu iyi gelişmelerin yanında zaman su gibi akıp gidiyordu, buna paralel olarak projeler büyüyor ve teknoloji artan ivmeyle gelişiyordu. Yavaş yavaş anlaşıldı ki C dili çok büyük projelerde yetersiz kalıyordu. Yeni bir programlama modeline ihtiyaç duyuldu ve C++ dilinin temelleri atıldı.
C++ ve Nesne Yönelimli Programlama
Yapısal programlama modeliyle çok büyük projeleri kontrol altına almak neredeyse imkansızdır. Bu sorunun üstesinden gelmek için yeni bir model gerekiyordu. Nihayet Bjarne Stroustrup tarafından C dili baz alınarak yeni bir programlama dili geliştirildi. Bu dilin adı : C++’tır. C++, C’nin üzerine inşaa edildiği için ilk başlarda “C with Classes”(Sınıflı C) olarak adlandırıldı. Peki bu dil C’den farklı olarak programcılara ne sunuyordu? C++ dilinin sunduğu en büyük yenilik nesne yönelimli programlamayı destekliyor olmasıdır. Nesne yönelimli programlama tekniği günümüzde de yaygın bir şekilde kullanılan bir tekniktir. Bu teknik gerçek hayatı modellemede büyük bir başarı sağlamaktadır. Söz gelimi bir projeyi parçalara ayrıp bu parçalar arasında programlama yolu ile bağlantılar kurmak çok basit hale gelmiştir. Nesne yönelimli programlama tekniği proje geliştirme aşamasında burada sayamayacağımız birçok kolaylık sağlamaktadır.
C++ dilinin diğer bir özelliğide C programcılarına hitap etmesiydi. C dilindeki temel kurallar aynen C++ dilinde de mevcuttur. Bu yüzden C++ dilini ve nesne yönelimli programlama tekniğine geçiş yapmak için C dilini iyi bilmek gerekir. Daha doğrusu C++ dilini sadece nesne yönelimli programlamayı destekliyor şeklinde düşünmemek gerekir. Günümüzde birçok alt seviye işlemlerde(haberleşme, işletim sistemi, aygıt sürücüleri) C++ dilinin yoğun bir şekilde kullanılması bunun bir kanıtıdır.
İnternetin Gelişimi ve JAVA Dili
İnterneti’in gelişimi bilgisayar dünyasındaki en önemli ilerlemelerden biridir. Programlama dünyasında JAVA dilinin ortaya çıkması en az internetin ilerlemesi kadar önemlidir. Çünkü C ve C++ dilleri ile yalnızca belirli sistemlere yönelik uygulamalar geliştirilebiliyordu. Oysa internet sayesinde birçok farklı sistem birbirine bağlanır hale gelmiştir. Artık sistemlerden bağımsız uygulama geliştirmek gerekiyordu. Daha doğrusu interneti hedef alacak uygulama geliştirmek gerekiyordu. Programcılar gelişen internet ortamına yabancı kalamazdı. Bu amaç doğrultusunda Sun Microsystems isimli firma önceleri OAK olarak anılan JAVA isimli programlama dilini ortaya çıkardı. JAVA, dil olarak C++ dilinin devamı gibi düşünülebilir. Ama amaç tamamen farklıdır. Zira Sun firması ortaya JAVA dili ile birlikte yeni bir uygulama geliştirme modelide sunmaktaydı. Bu programlama modelinde en büyük hedef sistemler arası taşınabilir kod yazmaktır. Yani bir uygulamayı hem Microsoft platformunda hemde Unix ve Linux platformlarında çalıştırabilmek hedeflenmiştir. Böylece geliştirilen uygulamalar işletim sistemi ve işlemciden bağımsız hale gelecektir.
Peki sistemler arası bu yüksek taşınabilirlik nasıl olmaktadır? Cevabı basit : Ara Dil. Evet, JAVA dilinde yazılmış kodlar derlendiğinde kodlar makine komutların çevrilmeden “ara kod” denilen “bytecode” a çevrilmektedir. Bytecode’a çevrilen program çalıştırıldığında Java Sanal Makinesi devreye girer ve uygulamanın çalıştırıldığı sisteme özgün makine kodunu üretir. Bu durumda Sun firmasının bir çok sistemde çalışabilecek Java Sanal Makinesi üretmesi gerekiyordu. Nitekim zamanla günümüzde yaygın kullanılan bütün sistemlerde sorunsuz çalışabilecek Java Sanal Makineleri geliştirildi. Hatta şu an için bazı cep telefonları ve çeşitli sim kartlarında bile JAVA programlarını çalıştırabilecek Java Sanal Makineleri mevcuttur.
JAVA ile C++ dili her ne kadar birbirine çok benzer olsada aynı kategoride değildir. Elmayla armutu karıştırmamak gerekir. Eğer “JAVA mı C++ mı” diye bir soru sorulursa cevap “her ikisi de” olacaktır. Çünkü ikisininde kullanım amacı farklıdır. Bir firma bir proje için hiçbir zaman bu iki dilden birisini seçmek durumunda kalmayacaktır. JAVA ile aynı kefeye koyabileceğimiz dil birazdan anlatacağım C# dilidir.
C# Dili ve .NET Platformu
JAVA’nın platform bağımsız kod üretmedeki başarısı su götürmez bir gerçektir. Bir çok kurumsal dev projede JAVA dilinin ve J2EE platformunun olanaklarından faydalanılması bunun en önemli göstergesidir. Günümüzde büyük projelerde birden fazla programlama dili kullanılabilmektedir. Ancak JAVA’nın diller arası uyumlu çalışmaya destek verememesi JAVA’nın bir eksikliği olarak görülmüştür. Diller arası uyumlu çalışma alanında en büyük başarıyı Microsoft firması sağlamıştır. Son dönemlerde sıklıkla kullanılan COM teknolojisi bu uyumluluğa bir örnektir. COM sayesinde farklı dillerde yazılan yazılım parçacıkları diğer bir uygulamada kullanılabilmektedir.
JAVA’nın programlamadaki büyük bir boşluğu doldurması onun en büyük rakibi olan Microsoft firmasının gözünden kaçmadı. En sonunda Microsoft’un bir ürünü olan Visual Studio yazılım geliştirme aracına JAVA yı da ekleme kararı aldı. Visual J++ adı altında Windows platformuna entegre edilen JAVA dili bu platformda pek başarılı olamadı. Bu oluşumun başarılı olmadığını gören Microsoft yeni arayışlar içine girdi. Microsoft başkasının malını kendi ürününe entegre etmek yerine kendi ürününü geliştirmeye karar verdi ve .NET yazılım geliştirme platformunu ortaya çıkardı. .NET temel felsefe olarak J2EE platformuna benzemektedir ancak .NET’in derinliklerine daldıkça çok yeni kavramlarla karşılaşırız. Bu yeniliklerden en önemlisi “diller arası uyumluluk” tur. J2EE platformunda sadece JAVA dili kullanılıyorken .NET platformunda birçok dil kulanılabilmektedir. Bu dillerin sayısı oldukça fazladır. Üstelik Microsoft tarafından .NET platformu için sıfırdan yeni bir dil tasarlanmıştır. Yapı olarak C++ ve JAVA dilllerine benzerliği ile bilinen bu dil Anders Hejlsberg tarafından geliştirilen C# (C Sharp)’tan başka bir şey değildir..
JAVA, C++ diline nasıl benziyorsa C# dilide C++ ve JAVA’ya benzemektedir. Programlama modeli yine her üç ortamda da nesne yönelimlidir. Değişen şey bu modelin uygulanış şeklidir. C++’ta kaynak kod derleyici tarafından makine koduna, JAVA’da bytecode’a C#’ta ise IL(Intermediate Language-Ara Dil)’a çevrilmektedir. Burda vurgulanması gereken en önemli nokta JAVA’da bytecode JAVA sanal makinesi tarafından yorumlanarak çalıştırılırken, .NET’te IL kodları derlenerek çalıştırılmaktadır. Hemen şunu da belirtelim ki, derleme işlemi yorumlama işleminden performans açısından daha öndedir.
C# dil olarak C++ ve JAVA’ya çok benzemektedir. Bu yüzden C# dilini konuşurken .NET platformunu göz önünde bulundurmalıyız. Dilleri sadece birer araç olarak görmemizde fayda var. İsterseniz lafı daha fazla uzatmadan JAVA/J2EE ve C#/.NET’i karşılaştırıp benzerliklerini ve farklılıklarını ortaya koyalım ardından C#’ı diğer .NET dillerinden ayıran özellikleri inceleyip “neden C#” sorusuna cevap arayalım.
C# ile .NET mi JAVA ile J2EE mi?
Saf C# ve JAVA dilleri düşünüldüğünde birkaç nokta dışında bu iki dil birbirine benzemektedir. Bu yüzden karşılaştırma yaparken bu dillerin kullanıldıkları platformlarıda göz önünde bulundurmak gerekir. İsterseniz madde madde her bir özelliği iki platform için değerlendirelim.
1-) Mimari : .NET ve J2EE çalışma biçimi olarak birbirine çok benzer. Her iki platformda da uygulama kaynak kodu ara bir koda dönüştürülür. Aradaki en büyük fark bu ara kodun işletilmesi sırasında görülür. .NET’te ara kod çalışma zamanında derlendikten sonra çalıştırılırken JAVA’da yorumlanarak çalıştırılır.
2-) Çalışma Zamanı(Runtime) Mimarisi : J2EE platformundaki Java Sanal Makinesi ile .NET platformundaki CLR(Common Language Runtime) birimi eşdeğerdedir. JVM, bytecode’un işletilmesinden sorumlu iken CLR, IL kodlarının işletilmesinden sorumludur.
3-) Sistemler Arası Taşınabilirlik : Teorik olarak C# ve JAVA ile yazılmış uygulamalar sistemden bağımsızdırlar. Günümüzde C# ile .NET ortamında geliştirilen uygulamaların bir çok mobil cihazda ve Windows sistemlerinde kullanıldığını düşünürsek bu teorinin yavaş yavaş gerçeğe dönüştüğü görülebilir. Yakın bir gelecekte .NET altyapısının Linux versiyonunun da çıkacağı bilinmektedir. JAVA ise bu konuda kendisini çoktan kanıtlamış durumdadır.
4-) Diller Arası Uyumluluk : J2EE platformunda sadece JAVA dili kullanılırken .NET ortamında C#,C++,VB.NET ve hatta JAVA dili bile kullanılabilmektedir. Üstelik farklı dillerde yazılmış parçacıklar diğer bir dilde sorunsuzca kullanılabilmektedir. Bu sayede bütün programcıların .NET platformunda rahat programlama yapabilmesi sağlanmıştır. .NET uyumlu herhangi bir dilde geliştirilen bütün uygulamalar aynı ara koda dönüştürüldüğü için .NET dilleri arasında büyük performans farklılıkları meydana gelmez.
5-) Web Servisi Kullanımı : Web Servisleri dağıtık yapıda geliştirilen uygulamaların temel parçası olmuştur. Özellikle iletişimin XML tabanlı olması web servislerinin önemini göstermektedir. Her iki dil ile web servislerine erişmek mümkün olsada C# ile bir web servisini kullanmak oldukça kolaydır. C# ve .NET’in web servislerine kolay erişmesi bir avantaj olarak görülebilir.
6-) Bellek Yönetimi : C#’ta aynen JAVA’da olduğu gibi kullanılan nesneleri toplama programcının görevi değildir. Kullanılmayan gereksiz nesneler gereksiz nesne toplayıcısı tarafından zamanı geldiğinde bellekten silinirler. Buna rağmen C# programcıları isterse belleği kendileri de yönetebilir. Yani C# dilinde bellek adreslerini tutan göstericiler(pointer) hala kullanılabilmektedir. JAVA dilinde bu imkan yoktur. C#’ı JAVA dan ayıran en büyük fark budur. Zira gösterici kullanımı sayesinde geriye dönük uyumlulukta sağlanabilmektedir. Örneğin parametre olarak bir gösterici alan sistem fonksiyonunu C#’ta kullanmak mümkündür.
7-) Veri Tipleri : C# dilinin temel felsefesi herşeyin bir nesne olmasıdır. Temel veri türleride dahil olmak üzere herşey birer nesne olarak tanımlanır. C# ve JAVA sağladığı temel veri türleri bakımından birbirlerine çok yakındır.
8-) Tekrar Kullanılabilirlik : Nesne yönelimli programlama modelinin en önemli özelliği geliştirilen sınıfların paketlenerek sonradan tekrar tekrar farklı uygulamalarda kullanılabilmesidir. C#’ ta sınıflar isim alanları(namespace) içerisinde paketlenerek diğer uygulamalar içinde kullanılabilir. Java’da ise sınıflar “package” dediğimiz bir kavramla paketlenir. Sonuç olarak her iki dilde eşit oranda bu özelliği desteklemektedir. Ancak C#’ta sınıfların organizasyonu daha estetik bir şekilde düzenlenmektedir.
9-) Kontrol Mekanizmaları : Kodların içinde en çok görülen bloklar olan for,while ve if gibi yapılar her iki dilde de vardır. C#’ta JAVA dilinde olmayan ayrıca foreach döngüsü bulunmaktadır. foreach döngüsü ile koleksiyon tabanlı nesnelerin elemanları arasında tek yönde rahatça dolaşılabilmektedir.
10-) Türetme ve Çok Biçimlilik : Nesne yönelimli programlama modelinin C++ dilinden beri kullanılan mekanizmaları olan türetme ve çok biçimlilik her iki dilde de mevcuttur. C++’tan farklı olarak C# ve Java’da sadece tekli türetme mevcuttur.
11-) İstisnai Durumları Yönetme : Uygulamların en büyük düşmanı olan istisnai durumların(exceptions) her iki dilde de ele alınış biçimi hemen hemen aynıdır.
12-) Sınıf Kütüphanesi : Veritabanı ve dosya işlemleri gibi burada sayamayacağımız bir çok temel işi yapan sınıflar .NET ve J2EE platformunda mevcuttur. Gerek bu sınıfların organizasyonu gerekse de sınıfların kullanılış biçimi bakımından .NET platformunun daha avantajlı olduğunu söyleyebiliriz.
Bütün bu maddeler bir bütün olarak ele alındığında C#’ın JAVA’dan bir kademe önde olduğu görülmektedir. Bu durum elbette proje yöneticilerinin seçimlerini etkilemektedir. Microsoft faktörünüde göz önünde bulundurursak C# ve .NET’in gelecekte çok iş yapacağını söylemek için müneccim olmaya gerek yok. Bu arada JAVA’nın halen yaygın bir şekilde kullanıldığını da gözardı etmemeliyiz. Bu durum C# ve JAVA’nın seçiminde sadece teknik özelliklerin değil aynı zamanda Windows ve Linux’te olduğu gibi sosyal etkenlerinde rolü bulunduğunu gösteriyor.
Buraya kadar söylediklerimden belki şöyle bir soru işareti doğmuş olabilir : “C# mı JAVA mı” sorusunu “C# mı C++ mı” şeklinde sorsak neler değişir? Cevap : Çok şey değişir. Evet C#’ın JAVA ile olan ilişkisi C++ ile olan ilişkisinden tamamen farklıdır. C# ile JAVA’yı ancak saf dil olarak karşılaştırabiliriz. Yani dilin sentaksından bahsediyorum. Bu iki dilin kullanıldığı ortam farklıdır. Birinde bir sisteme özgün makine kodu üretilirken diğerinde sistemden bağımsız ara bir kod oluşturulmaktadır. Bu durumda C++ ve C#’ı bir bütün olarak karşılaştırmayı kişisel olarak doğru bulmuyorum. Çünkü ikisi farklı kategorilerde yarışıyor. Eğer bir gün .NET’in ürettiği ara koddaki komutlar ile çalışan mikroişlemci geliştirilirse o zaman belki C# ile C++’ı karşılaştırabiliriz. Peki C# mı C++? Cevap : Her ikiside. Eğer şirketiniz Intel işlemciler için bir işletim sistemi geliştiriyorsa elbette C++ ve C dilleri seçilmelidir. Şirketiniz dağıtık yapıda çok geniş bir çalışma ağı olan bir uygulama geliştiriyorsa o zaman C# ve .NET’i seçmeniz daha doğru olacaktır. Bu seçim bir projede hangi dilin kullanılacağını değerlendirmek içindi. İşe bir de programcılar açısından bakalım. Bir programcının hem C++ hem C# hemde JAVA bilmesine gerek var mı? Bence gerek var yada yok. Kesin bir cevabı verilemez bu sorunun. Daha doğrusu bir programcı ihtiyaç dahilinde herhangi bir programlama dilini kullanabilmelidir. Ancak şunu da unutmayalım ki iyi bir programcı çok sayıda programlama dili bilen demek değildir. İyi bir programcı .NET platformunda olduğu gibi programlama dilinden bağımsız kod üretebilmelidir.
Diğer .NET Dilleri ve C#
Daha öncede dediğim gibi .NET paltformunda bir çok programlama dilini kullanabiliriz. Bu dillerin en önemlileri C#, VB.NET, C++.NET ve J# dilleridir. Bu dillerden bir tanesinin özel bir konumu vardır. Tahmin edeceğiniz gibi bu dil C#’tır. C# .NET platformu için sıfırdan geliştirilmiş yeni bir dildir. Diğer diller ise eski versiyonları değiştirilerek .NET’e uyumlu hale getirilmiştir. Özellikle Visual Basic dilinin devamı gibi görünen VB.NET dilinde bir çok radikal değişiklik yapılmıştır. Örneğin VB dili nesne yönelimli programlama tekniğini destekler hale getirilmiştir. Bu eklentilerin çok başarılı oloduğu söylenemez. Çünkü bu şekildeki zoraki eklentiler dilin en başta tasarlanma amacına uygunluğunu ortadan kalkmaktadır. Bu amaçla Microsoft, hem nesne yönelimli programlama tekniğine tam destek veren, C++ dilinin güçlü özelliklerinden yoksun olmayan ve aynı şekilde Visual Basic dilinin kolaylığından esinlenerek C# dilini çıkardı.
Peki .NET dilleri arasında C#’ı tercih etmemize neden olacak başka neler var? Her şeyden önce C# öğrenilmesi kolay bir dildir. Az sayıda anahtar sözcük içermesine rağmen bir çok olanağı programcının hizmetine sunmuştur. C# nesne yönelimli programlama diline tam destek verdiği içinde seçilebilir. C#’ta değişken kavramı neredeyse kalkmıştır. Bunda bütün temel veri türleri de dahil olmak üzere bütün sınıfların Object diye adlandırılan bir sınıftan türetilmesinin etkisi vardır. C# dili güç ve hızlılık arasındaki dengeye estetik bir şekilde korumaktadır. Temsilci ve olaylarla VB’deki olay mantığına benzer bir model sunarken aynı zamanda göstericileri kullanmaya imkan vererek C++ dilinin güçlü özelliklerinden yoksun bırakmamıştır. .NET sınıf kütüphanesinin büyük bir kısmı C# ile geliştirilmiştir. Yani bu kütüphaneyi en etkin biçimde C# ile kullanabiliriz. Dahası C# dili .NET’in çalışma mimarisi de gözönünde bulundurularak sıfırdan tasarlandığı için .NET’in bütün olanaklarından en etkin biçimde C# ile faydalanabiliriz.
C# için söylenebilecek son söz : C#, modern programlama tekniklerine tam destek veren, internet çağının gerektirdiği tüm yazılım bileşenlerini geliştirmeye izin veren, hızlı ve etkin bir şekilde kodlama yapılabilen, C++ ve JAVA’nın güzel yönlerini alıp geriye dönük uyumluluğu JAVA’da olduğu gibi gözardı etmeyen bir programlama dilidir.
Sonuç
İnternet’in ve haberleşme teknolojisinin çok ileri bir seviyede olduğu bir dönemde internet üzerinde kullanılabilecek yazılım bileşenlerini programlamak son derece önem kazanmıştır. Her ne kadar C# ve JAVA öncesi dillerle herşey yapılabiliyor olsada projelerin boyutlarının büyümesi bu dillerin artık yetersiz olduğunun bir göstergesidir. Özellikle yeni nesil iş uygulamalarında C# ve JAVA, C++’tan bir adım önde görünüyor. Tabi bu durum C++ dilinin kötü olduğunu göstermez. Nitekim C# ve JAVA dillerinin her ikiside C++ dilini örnek almıştır. Değişen tek şey günün ihtiyaçlarıdır. Aynı zamanda C# dili JAVA, C++.NET, VB.NET ve J# gibi diller önünde de bir adım önde görünüyor.


XP Stilinde Kontroller ile Çalışma

Microsoft Framework v1.1’ de bu özellik henüz pratik bir şekilde yok. Bu yüzden yolumuz biraz uzun.
Elde edeceğimiz bu görünüm Windows Xp’ den önceki işletim sisteminde haliyle görünmeyecek, o işletim sisteminin default haliyle görünecektir(mesela butonlar önceki işletim sistemlerinde gri renkli görünüyordu).
Herhangi bir karışıklık çıkmaması için yönergeleri beraber takib edelim.
Hemen işlem adımlarımıza başlayalım:
Microsoft Visual Studio.NET’ i açın.
File/New/Project’ i tıklayın.
Açılan Pencerede Project Type alanında Visual C# Project seçili olsun.
Aynı pencerede Templates alanında Windows Application seçili olsun.
Aynı pencerede Name alanına XPStyle yazın.
Aynı pencerede Location alanında mevcut yolun sonundaki klasör isminide XPStyle yapın.
Projenin açılması için Okey butonuna tıklayın.
Şimdi Form1.cs[Design] görünümüne sahipsiniz.
Formumuza ; Button, radioButton, checkBox, textBox, progressBar ve trackBar ekleyin.
Button, radioButton, ve checkBox nesenelerinin Properties penceresinde Flat Style kısmını System yapın.
Düğerleri için bunu yapmaya gerek yok.
Menüden File/Save All tıklayın ve Menuden Build/Build Solutin tıklayın.
Elimizde mevcut bir görünüm oluştu, Projeyi bu haliyle çalıştırırsanız(Debug/Start),
Form elemanlarında XP Stilini göremeyeceksiniz,

Şimdi XP Stil görünümünü elde etmek için yönergeleri izleyin:
Menüden, Project/Add Class tıklayın.
Açılan pencerede Templates kısmında XML File(herhangi bir .cs dosyası da olabilir) seçin.
Aynı pencerede Name kısmındaki alanı tamamen temizleyin.
“[Proje Adı].exe.manifest” yazım biçiminde XPStyle.exe.manifest yazın.
Bu projenin adını XPStyle olarak belirlemiştik
Dosyamızın oluşması için OK butonuna tıklayın.
Oluşturduğumuz XPStyle.exe.manifest adlı dosyayı açın ve içine aşağıdaki kodları yapıştırın.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="Microsoft.Winweb.<Executable Name>" type="win32"/>
<description>.NET control deployment tool</description><dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*" />
</dependentAssembly>
</dependency>
</assembly>

NOT: “<” “>” karakterlerinin < ve > haline dönüşmesi söz konusu olabilir. Bu yüzden bu kodları önce bir NotePad’ e yapıştırın sonra buradan Select All deyip tekrar kopyalayın ve XPStyle.exe.manifest dosyamıza yapıştırın.
Bu kodda <Executable Name> kısmına Projemizin adı olan XPStyle yazın
Yeni hal: name="Microsoft.Winweb.XPStyle" şeklinde olacak.
Menüden File/Save All tıklayın ve Menuden Build/Build Solutin tıklayın.
Microsoft Visual Studio.NET’ i indirin ve projenizin bulunduğu klasöre geçin
Bu klasörün içinde XPStyle.exe.manifest dosyasını göreceksiniz.
Bu dosyayı kopyalayıp, Obj klasörünün içine girin, buradan da Debug klasörüne tıklayıp içine girin ve dosyayı buraya yapıştırın.
Çalışma esnasında faydalanmak içi bu dosyayı bin\debug klasörüne de kopyalayabilirsiniz
Microsoft Visual Studio.NET’ i açın
Menüden, File/Open/File tıklayın.
Açılan pencerede Obj\Debug klasörüne ulaşın.
Buradan XPStyle çalıştırılabilir dosyanızı seçin ve Open butonuna tıklayın.
Açılan XPStyle.exe dosyasının içindeyken sağ tıklayın.
Açılan menuden Add Resource tıklayın.
Açılan pencereden import butonuna tıklayın.
Açılan pencreden Files of type alanında All Files seçin.
Görünen dosyalardan XPStyle.exe.manifest dosyasını seçip Open butonuna tıklayın.
Açılan Custom Resource Type penceresinde Resource Type alanına “RT_MANIFEST” yazın ve Okey butonuna tıklayın.
XPStyle.exe(101-Data) dosyası açıldı. Bu dosyadayken Properties penceresinden ID alanının 101 olan değerini 1 yapın
Menüden File/Save All tıklayın ve Menuden Build/Build Solutin tıklayın.
Bu dosyayı kapatın.
Projeyi çalıştırın.


XNA İle Oyun Programalama

ANALİZ

Oyun geliştirme işi birçok farklı adımdan oluşsada özünde bir yazılım çalışmasıdır. Her yazılım çalışmasına da başlamadan önce yapılması gereken bazı şeyler vardır ve bunların en önemlisi de iyi bir analiz çalışmasıdır. Analiz çalışmaları uygulama geliştirme aşaması için hayati derecede önem taşır. Oyun geliştirme gibi uzun soluklu projelerde, eksik yapılmış bir analiz projenin başarısız olmasına kadar çok büyük negatif etkiler yaratabilir. Bu bağlamda, bir oyun geliştirme projesinde yapılması gereken temel analiz adımlarına bakalım isterseniz.

Hedef Kitle Seçimi

Öncelikle yazacağınız uygulama tipi bir oyun olduğu için, hedef kitlesi ilk aşamada çok doğru bir şekilde tespit edilmelidir. Bu yüzden hedef belirleme aşaması oyunun geleceği için son derece hayati önem taşır. Bunun nedeni ise, yazacağınız programın bir işin olmasına, bir ticari amacın gerçekleşmesine veya bu tarz bir şeye hizmet etmeyecek olmasıdır. Yani ortada sizin anlaştıgınız, sizin projenizi bekleyen bir kimse yoktur. Bir başka deyişle siz bir ticari ihtiyacı kapatmak için yazılım geliştirmeyeceksiniz. Evet yine bir ihtiyacı karşılayacaksınız ama bu ihtiyacın adı eğlence olacak. Buradan yola cıkarsak, yazacağınız oyunlardan insanların tek bir beklentisi olacak oda eğlenmek. Hedef kitle seçiminede işte tam bu noktada ihtiyac duyuluyor çünkü her insanın eğlence anlayışı farklıdır. Eskiden oyunlar küçüklere hitap etsede artık günümüzde yaş faretmeksinizin hemen hemen bir cok insan bilgisayar oyunu oynuyor. Ama yinede ortada yaş farkından doğan seçimler mevcuttur. Mesela SuperMario oyununu ele alalım. Bu oyunu her ne kadar bir çoğumuz hala seve seve oynasada oyunun asıl hedef kitlesi cocuklardır. Her oyunun hedef kitlesi belli bir yaş grubu olmalı demiyorum tabiki ama eğer herkesi hedef alacaksanızda ona göre bir analiz yapıp çalışmanızada o yönde yol vermeniz gerektiğinide unutmamanız gerekiyor.Şimdi geliştireceğiniz oyunları oynayacak olan oyuncu profilerini kısaca tanımaya çalışalım isterseniz.

Araştırmalara göre bilgisayar oyuncuları 6 profile ayrılıyor;

1. Heavy Gamers (Ağır oyuncular)
2. Console Gamers (Konsol oyuncuları, PlayStation, XBOX, WII)
3. Mass Market Gamers (Sadece çok etkileyici oyunları tercih edenler)
4. Prefer Portable Gamers (Taşınabilir cihazlarda oyun oynamayı tercih edenler)
5. Secondary Gamers (İkincil oyuncular, oyun almazlar sadece cevresindekilerden buldukları herhangi bir oyunu alıp türüne bakmaksızın oynarlar)
6. Infrequent Gamers (Nadir oyuncular, ara sıra oyun oynayanlar)

Bu 6 profil ise, 2 tür altında toplanıyor.

1. Infrequent Gamers

Bu tarz oyuncular gelişigüzel oyun oynarlar. Yani canları istedikleri zaman. Bu nedenle kısa sürede eğlenmek isterler. Bu tarz oyuncular için oyunun çok basit olması gerekir. Ayrıca karmaşık bir hikayesi olmaması gerekir, hatta oyunun bir hikayesi olmasa bile olur. Oyun bölümlerinin kısa aralarla geçmesi gerekir. Yani bir bölüm saatlerce sürmemeli.Bunun yanında oyuncuya başarma hissinin yansıtılması hem gerekli hemde çok önemlidir. Çünkü oyuncu dediğim en kısa zamanda en fazla eğlenceyi almak ister. Eğlence ise oyun oynamak ile geçirdiği sürenın dışında bu sürenin bir ödülle desteklenmesidir. Çok basit bir örnek mesela mario oynarken, 100 altın’a sahip olduktan sonra ekstra’dan 1 can verilmesi.

Bunların dışında oyunda çok abartı 3D efektlerin veya cok etkileyici ses efektlerinin olması çokta önemli değildir. Şunu asla unutmayın, yazdıgınız şey bir bilgisayar oyunu ve sadece oynayanı eğlendirmeyi hedefliyor. Böyle bir hedefe saf 2D görüntüler ilede ulaşabilmeniz mümkündür. 3D olması şart değildir. Örnek vermek gerekirse yine mario’ u gösterebiliriz.

2. Heavy Gamers

İşte büyük oyunların hedef kitlesi arkadaşlar. Bu arkadaşlara "hardcore gamers" derler. Oyunları çok ciddi bir şekilde ele alırlar. Hatta eminim bunu yaşam tarzı olarak görenler bile vardır.Bu profildekiler için oyunun son derece gerçekçi olması gerekir. WarCraft cıkacagı günden bir gün önce magaza önünde sabahlayanları görmüştük haberlerde, işte bu profildeki arkadaşlar onlar oluyor. Bunun dışında bu oyuncuların oyundan etkilenmesi ve oyunu benimsemesi için oyunun bir hikayesi olması gerekir. Hikaye’nin de gerçekçi olması çok önemli değildir, ama hikaye kendi içinde yani kendi dünyası içinde realist olmalıdır. Mesela Yüzüklerin Efendisi son derece gerçek dışıdır ama kendi evreni içinde her karakterin kendine özgü bir yapısı ve dünyanın da kendine ait bir gerçekçiliği vardır. Ayrıca dikkatinizi bir noktaya çekmekte fayda var, eskiden filmlerin oyunları yapılırdı, ama artık günümüzde oyunların filmleri yapılıyor. Buda oyun sektörünün ne kadar geliştiğinin en güzel göstergesidir. Bakınız Tomb Raider, Max Payne, Resident Evil ilk aklıma gelenler. Bu ufak notlardan sonra bu tarz oyuncuların istekleri kutu kutu düşmanlar, düz mavi zemin üzerinde yuvarlak yuvarlak bulutlardan oluşan 2D bir dünya asla değildir tam aksine son derece detaylara sahip olan, o dünyanın içinde olduklarını onlara hissettirebilecek son derece gerçekçi 3D grafiklere sahip bir oyundur.Ayrıca bu görsellik, yine cok gerçekçi ses efektleri ve o anki oyun içinde gerçekleşen duruma özel müziklere sahip olmalıdır.Oyunun başında çalan eğlenceli müziğin, karakteriniz öldükten sonra da çalması CD’leri kırmak için yeterli bir sebeptir. Ve bu tarz oyuncuların bir beklentiside uzun oyun zamanıdır. Bir bölümü geçmek için günlerce uğraşabilirler. Bundan sıkıldıklarını sanmayın aksine zevk alırlar. Ama bu çabalarını mutlaka ama mutlaka bir şekilde ödüllendirmeniz gerektiğinide asla unutmayın.Bu ödüllerinde adil ve mantıklı dağıtmanız gerekiyor tabiki. Mesela karakteriniz sıradan bir düşmanı öldürünce 100 altın kazanıyorsa, bir boss’u öldürdüğünde cok daha büyük ödüller kazanmalıdır.

Bugüne kadar hiç oyun geliştirme üzerine kafa yormadıysanız buraya okuduklarınız farklı gelmiş olabilir.Bunlar daha başlangıç tabiki. Bunları asla bir CRM, ERP veya bu tarz uygulamalar geliştirirken düşünmezsiniz. İşte bu yüzden oyun geliştirmenin çapı çok daha büyüktür. Bu yüzdendir ki, sizin programcılıga bakışınızı değiştirir ve ufkunuzu açar.

Evet hedef kitlemizi seçtikten sonra bir sonraki önemli analiz aşamasına geçebiliriz.

Oyun Türü Seçimi

Az önce yazdıgımız, "uygulamanın bir tek hedefi var ve oda eğlendirmek" demiştik. Şimdide "her insan farklı şekilde eğlenir" dediğimiz noktaya geliyoruz. Oyun geliştirmeye başlamadan önce vermeniz gereken bir karar da oyunun türüdür. Bazı oyun türlerini örnek vermek gerekirse;

Tür Oyun Strategy Red Alert, WarCraft, StarCraft Shoter (kendi içinde 4 ’e ayrılır) Shot’em up DuckHunt, Virtu Cop LightGun Shoter Shot’em up’ın tabanca ile oynananı
Firs Person Shooter(FPS) DOOM, Quake, Half-Life, CounterStrike Third Person Shooter MaxPayne, GTA 3 Tactical Shooter TomClany’s RainbowSix, GhostRecon, OperationFlashpoint Role-Playing Game (RPG) Diablo, NeverWinterNights Adventure Alone In The Dark, Monkey Island Action
Unreal Tournament Sports
FIFA, NBA Racing NeedForSpeed, GranTourismo Fighting StreetFighter, Tekken
Uygulama geliştirme sürecinde, uygulamanın sınırlarını en net belirleyen aşama oyun türünün belirlendiği bu aşamadır. Bu yüzdende çok önemlidir. Şöyle düşünün siz FPS tarzında bir oyun geliştiriyorsunuz diyelim. Bu tarz bir oyunda kimse sizden flight simulator’da kullanılan, fizik motoruna benzer bir fizik motoru yazmanızı beklemez. Yani bir FPS’de kullanacagınız fizik motoru ile bir uçuş simülasyonunda kullanacagınız fizik motoru arasında büyük farklar vardır. İşte bu ve bunlar gibi kararların verilmesindeki önemli etken oyun türüdür. Tabi bu kalıpların dışına çıkıp, kendi yaratıcılığınız doğrultusunda çok farklı türden oyunlarda yaratabilirsiniz. Listede en temel türler verilmiştir.
Oyun geliştirmenin analiz aşamasında yapılması gereken en temel adımları bu şekilde özetleyebiliriz. Bunların yanına bir sıradan bir yazılım projesinin, analiz aşamasında yapılması gereken real ögeleri çok rahat bir şekilde burayada ekleyebiliriz tabiki.


Oyun Geliştirme Ekibini Tanımak

Geliştirdiğimiz uygulama bir oyun olduğu için, oyunun türüne uygun takım içinde her biri kendi alanında uzman bir çok farklı karakterler olmalıdır. Bu karakterlerin hepsi saf oyun programcısı olmak zorunda değildir. Şimdi gelin bu karakterler neler olabilir bunlara kısaca değinelim.

Project Management (Proje Yöneticisi)

Geliştireceğimiz uygulama özünde bir yazılım projesidir. Ve her profosyonel yazılım geliştirme sürecinde oldugu gibi oyun geliştirme süreci içinde takımı, motive edecek, kontrol edecek, iletişimi ve koordinasyonu sağlayacak, kaynak yönetimini yapacak bir proje yöneticisi şarttır. Olmazsa ne oluru hiç düşünmeyin bile.

Script Writers (Senarist)

Eğer oyununuz bir hikayeye sahipse bir senaryosu vardır. Karakterler arasında belli diyaloglar geçer. Kimi zaman bu diyaloglara oyuncu da müdahale edebilir ve bunun sonucunda oyun farklı bir şekilde yol alabilir. İşte senaristler oyunun hikayesini belirleyen ve hikayenin ön plana cıktıgı özellikle adventure tarzı oyunlardaki en önemli karakterdir.Bir futbol oyununda senariste gerek yoktur belki ama bir adventure’ da mutlaka olması gerekir.

Ayrıca AgeOfEmpires gibi oyunlarda, takım içinde tarih bilgisi çok yüksek, oyunun geçtiği çağlardaki dönemleri çok iyi bilen mimarlar, sanat yönetmenleri gibi hikayeye ortak olacak bir çok karakterde bulunabilir.

Level Designers (Bölüm Tasarımcıları)

Hikayenin akışına göre veya bölümün hedeflerine yönelik o bölümde kullanılacak araçların tanımlanması gibi işlemleri yaparlar. Bölümün hedefine uygun oyun akışını düzenlerler. Mesela bölüm sonunda bir BOSS’u öldürmeniz gerekiyor ama elinizdeki silahla onu öldürmeniz çok zor. Fakat oyunda kenarda köşede kalmış bir karakteri öldürünce onun silahını alıp, o silahla cok rahat bir şekilde BOSS’u öldürebilirsiniz. İşte bu gibi kararları (tabi hikaye dışına taşmadan) Level Designer’lar verir.

Bir oyunun yapısı hızlı işliyorsa çok uzun bölümler genelde oyuncuyu sıkar. Herşey çok hızlı ilerliyordur oyun çok eğlencelidir ve hemen bölüm sonuna gelinmek istenir. Yine bir Mario örneği, bölümler asla uzun değildir. Bu noktada Level Designer’ ın önemi daha net görülmektedir.

Artist

Oyun menülerinin tasarımı, 3D karakerler için dokuların hazırlanması gibi aşamalarda yer alırlar.Mesela bir otelin lobisinde geçen dövüş bölümü için lobi’nin tasarımı gibi şeyelere karar verirler. Gereksiz yerlerde gereksiz nesneler konulması oyuncuyu oyundan sogutur.Oyunun gerçekçi olmasını engeller. Lobi’de buzdolabı olması çok saçma bir örnek kabul ediyorum ama öyle olsada çok saçma ve gerçek dışı olurdu.

Modelers (Modelleyiciler)

Çeşitli 2D veya 3D tasarım programları ile oyun içindeki karakterleri, binaları, köprüleri kısaca nesneleri modelleyen kişilerdir. Bir oyun için görsel zenginlik çok önemlidir, bu bağlamda modelleyicinin ortaya koydugu modeller çok önemlidir.Siz bir uçuş similasyonu için çok iyi bir fizik motoru yazmış olabilirsiniz ama modelleyiciniz, bir boeing 737’yi , kutu gibi tasarlar ise oyununuzun pek tutmayacagını rahatlıkla söyleyebilirim.

Animators (Animatörler)

Tasarımcıların yaptıgı animasyon işinden bahsetmiyoruz. Bölümlerin başında, sonunda veya hikayenin gidişatına göre ortaya çıkan izlenme amaçlı yapılmış animasyonları hazırlayan kişilerdir. Hikayenin akışını tamamen destekleyen oyuncuyu oyuna bağlayan en önemli öğelerden biridir. Siz oyunun menülerine hikayenin okunabileceği bir menü koyup, düz text şeklinde hikayeyi oyuncuya sunabilirsiniz ama bu kadar uzun yazıyı herkes okumak istemez.İşte bunu hikayeyi özetleyen kısa animasyonlarla gerçekleştirebilirsiniz.Bunuda animatörler yapar.Hikayenin pekiştirilmesi ve daha net anlaşılması için çok önemlidirler.

Musicians (Müzisyenler)

Müzikler oyuncuyu oyuna çeken, grafikten sonraki en önemli etkendir.Gerçekçi ve dogru zamanda oluşan ses efektleri ve duruma uygun fon müziği oyunun çok daha iyi olmasını sağlar. Bu müzikleri ve ses efektlerinide müzisyen arkadaşlar hazırlar. Oyunun tarzına uygun müzik seçilmeside ayrı bir özen ister. DOOM’daki ateş etme efektini asla mario ’da aramazsınız mesela.

Programmers (Programcılar)

Bu arkadaşlar bizler oluyoruz işte :) Ortada bu kadar fazla öğe varken, bu kadar öğenin koordine bir şekilde nerde ne zaman işleyeceğini belirleyenlerdir.Bir karakterin can sayısından tutunda, bir strateji oyunundaki kaynak yönetimine kadar arka plandaki tüm mantıksal işlemleri programlayan kişilerdir. Yukarda saydıgım karakterler olmadan oyun yazılabilir ama programcı yoksa oyunda yoktur ama hiç bir oyun diğer karakterler olmadan türündeki en iyi oyun olamaz.

Testers

Her yazılım çalışması bittikten sonra mutlaka testi yapılır. Oyun geliştirmedede durum farklı değildir. Oyunun her anının tek tek testleri yapılmalıdır.Gözden kaçan çok ufacık bir bug oyun cıkar cıkmaz ardından bir patch yayınlamanıza neden olur. Buda ekstra maliyet demektir. Böyle olsa iyi, birde bazı durumlarda oyununuz oyuncuların gözünden düşebilir. Bu yüzden test aşaması en az analiz aşaması kadar detaylı yapılmalıdır.Bu aşamada oyundaki hatalar tespit edilir ve düzeltilir.Tüm hatalar düzeltildikten sonra oyun piyasaya sürülür. Ne varki her yazılım çalışmasında oldugu gibi buglar mutlaka olacaktır, bunları kapamak için patch’ler yayınlanır. Bu süreçtede testlere devam edilir.Test yapan kişilerin testi iyi yapmasıda bu noktada hayati önem taşır.

Takım arkadaşlarımızıda tanıdıktan sonra bu kavramlar hakkında son birşey söylemek istiyorum. Bu işe yeni başlayan veya amatör hislerle bu işle ilgilenmek isteyen kişiler için bu bilgiler hiç bir anlam ifade etmeyebilir. Fakat ben bir işi en temelinden öğrenilmesi gerektiğine inanıyorum. Profosyonel bir oyun geliştirme süreci içinde bulunmadıgınız sürece, hiç bir durumda bu karakterle belki karşılaşmayacaksınız ama bu işin dünyada profosyonel şekilde bu tarz kişilerle bu şekilde yapıldıgını bilmek önemlidir. Bu karakterler ve kavramlar en temel ortak ögelerdir. Oyunun türüne tarzına göre yeni özelliklere sahip karakterlerde eklenebilir tabiki.


Bir Oyunda Olması Gereken Temel Yapılar
Aslında bu öğeler bir çoğunuzun bildiği sıradan şeyler ama ilk başlarda oyun kodlamanın büyüsüne kapılıp bu tarz şeylerin varlığını bile unutabiliyoruz. Ama bunlar daha en başında neyin, nerede ve nasıl yapılması gerektiğini belirten analiz aşamasının en önemli adımlarından biridir. Bu yüzden bunlara değinmekte büyük fayda var diye düşünüyorum. Faydalı olması dileğiyle şimdi bu öğeleri kısaca inceleyelim isterseniz.

Amaç

Öncelikle her oyunun bir amacı olmalıdır. Mesela Mario örneğinden gidersek yine, onlarca bölümü geçmek için uğraşıyoruz değilmi, bu kadar uğraşmamızın tek nedeni prensesi kurtarmak değilmi :)

Sonlandırıcı Etkenler ve Kaydetme

Oyunun amacının yanında bu amaca ulaşmak okadarda kolay olmamalı değilmi. Mutlaka oyuncuyu zorlayan yerler olmalıdır. Bu aynı zamanda ulaşılması gereken amacı daha da cazip bir hale getirir. Hatta gerekirse karakterinizin belli bir hakkı olmalı ve bu hak tükendikten sonra oyun orda sonlanmalıdır. Daha sonra oyun belli bir yerden tekrar başlamalıdır. İşte bu noktalara SavePoint diyoruz. Bu noktalarda oyun kaydedilir ve bir sonraki save pointe kadar gecen sürede eğer oyun sonlanırsa, oyun ulaşılan en son save pointten tekrar başlar. Bu mantık özellikle platform tabanlı oyunlarda sıkça görülür. Mesela aynı mantık Mario ’da vardır. Haritada sürekli ilerliyorsunuz ama öldüğünüz zaman, öldüğünüz yere göre, oyuna tekrar belli bir noktadan başlıyorsunuz. Ya en baştan yada haritanın ortasından gibi.

Birde bir çok oyunda gördüğümüz, istediğimiz anda oyunu kaydetme özelliği vardır. Oyuncu oyunun herhangi bir anında oyunu kaydedip, daha sonra oyuna oradan devam edebilir. Bu iki farklı teknik, oyunun türüne göre seçilmelidir. Eğer SavePoint mantıgı kullanılacaksa iki savepoint arası cok uzak olmamalıdır. Aksi halde karakter ölürse veya görev başarısız sonuçlanırsa, oyuncu aynı şeyleri uzun uzun tekrarda yapmaktan sıkılacaktır.

Gerçekçi Bir Hikaye

Oyunun hedefine giden yolda, oyunun oyuncuyu taşıyabilmesi için gereken en önemli noktalardan biride gerçekçi bir hikayedir. Aslında daha önceden bahsettiğim gibi oyunun tarzı ve sizin verdiğiniz farklı bir karar ile siz oyunu çok gerçek dışı yapabilirsiniz. Ama oyun gerçek dışı dünyasında, kendi içinde çelişmeyecek bir gerçekçiliğe sahip olmalıdır. Oyundaki bölümlerde bu hikayenin gidişatına göre şekillenmelidir. Karşınıza çıkacak herşey hikayenin gidişatına göre doğru zamanda çıkmalıdır. Aksi taktirde oyuncu heran, "bu ne alaka şimdi", "bu nerden çıktı" tarzında cümleler kurabilir ve bu da insanların oyununuzdan soğuması için yeterli bir nedendir.

Oynanabilirlik

Gelelim bence en önemli olan noktaya. Oynanabilirlik bir çok oyun dergisi tarafından oyuna verilecek puan’a etki edecek en önemli kriterlerden biri olarak ele alınır. Oynanabilirlik dediğimiz kavram tamamen, oyunu daha basit nasıl oynatabiliriz sorusunun altında yatan cevaptır. Bir başka deyişle geliştirdiğiniz oyun mümkün olduğu kadar basit bir oynanışa sahip olmalıdır. Buna klavye kısayollarından tutunda, ekrandaki nesnelerin kullanılabilirliğine kadar bir çok etken etki edebilir. Oynanabilirlik neden bu kadar önemli peki bunu basit bir örnek ile kısaca özetleyelim. Bir oyun geliştirdiniz diyelim. Oyun cıktığı zamanın en iyi 3D görseline sahip. Sesler mükemmel.Hatta bu oyunu orta seviye bir pc bile rahatlıkla çalıştırabilir. Bu yüzden daha oyun cıkar cıkmaz bir sürü potansiyel müşteriniz var. Fakat oyunda ufak bir sorun var. Kamera acıları bazen cok kötü bir şekilde oyunun oynanmasını engelliyor. 3D’nin ilk cıktıgı dönemdeki oyunları hatırlayın. Siz tam bir hamle yapacaksınız ama kamera öyle bir şekilde dönüyorki bir türlü istediğinizi yapamıyorsunuz. Bu tarz buglar olacaktır illaki ama oyunun geneline yayılmış bir durum söz konusu ise emin olun oyuncunun ilk yapacagı işlem oyunu pc ’den kaldırmak olacaktır. Yani insanlar oynasın diye oyun yapıyorsunuz ama oynatamıyorsunuz. Sorun tam olarak budur. Ve en önemli sorunlardan biridir. Bu nedenledirki oynanabilirliği elinizden geldiği kadar basit ve kullanışlı tutmaya çalışmalısınız.

Tekrar Oynanabilirlik

Bunu açıklamak için size şöyle bir soru sormak istiyorum. Öncelikle bir oyun yazdıgınızı ve bu yazdıgınız oyunuda benim oynadıgımı düşünün. Ben bu oyunu oyanamaya başlıyorum ve 1 hafta gibi bir sürede bitiriyorum. Şimdi bana öyle bir neden söyleyinki, ben bu oyunu oturup 1 hafta daha oynayıp bir kez daha bitireyim. İşte bu sorunun cevabı ne kadar geniş olursa oyununuz okadar tekrar oynanabilecek potansiyeli olan bir oyundur. Burada oyuna yön verecek karakter sayısını fazla tutup, her birine farklı özellikler vermek ilk akla gelen yöntemdir. Veya RedAlert gibi bir strateji oyununu ele alalım. Allied gücleri ile Soviet güçlerinin sahip oldukları üniteler tamamen birbirlerinden farklıdır. Bu şu demek oluyor; oyunu oynayacak kişi bu oyunu en az 2 farklı şekilde bitirebilir. Burada tabi hikayede ön plana cıkan başka bir detaydır. Bu sefer her farklı güce, karaktere ve bu gibi öğelere özel hikaye akışı ve senaryolar olmalıdır. Bu geniş ve detaylı bir şekilde kurgulanması gereken bir konudur ama emin olun bence, oyununuzun en az 2 kat daha güzel olmasını garanti eder. İnsanlar yıllar sonra oturup Diablo’yu tekrar oynuyorsa eğer, bu sadece oyunun tekrar oynanabilen bir yapıya sahip olmasından dolayıdır.

Denge

Oyunun mutlaka sahip olması gereken bir dengesi olması gerekir. Şöyle özetlemek gerekirse oyundaki karakterimiz geliştikçe, karşımıza cıkan düşmanlarında güçlenmesi gerekir.Aksi halde oyunun seviyesinde gözle görülür bir şekilde düşüş görülür. Buda herşeyin kolaylaşması demektir ve bu durum oyuncunun oyunu bırakması için yeterli bir sebeptir. Veya oyunun daha en başında çok zor bölümlere sahip olması oyun dengelerini altüst eden hatalardandır. Mümkün olduğu kadar bu dengenin sağlanması gerekir.

Ödül

En önemli öğelerden biride ödüldür tabiki.Bu ödül oyunun türüne göre değişkenlik gösterebilir. Ekstra can, enerji, para, veya diğer kaynaklar gibi düşünebilirsiniz. Mesela bir boss’u öldürdükten sonra mutlaka bir ödül verilmesi gerekir. Bunun dışında ödül illaki bir başarının sonucunda gelmeyedebilir. Mesela oyun dünyasında gizli yerlere çeşitli ödüller koyabilirsiniz. Oyuncunun böyle bir durumdan haberdar olması demek tüm haritayı didik didik etmesi demektir, buda oyun süresinin uzaması demektir.Yani oyununuzun ömrü uzar. Tabi olayı abartmamak gerektiğini söylememe gerek yok herhalde. Ayrıca burada ödüllerde yine dengeli davranılması gerekir. Bir boss’u öldürünce verilen ödül ile rastgele bir kutudan cıkan ödül aynı olmamalıdır.

Çevre

Günümüzde oyunlar artık sadece bir oyun olarak ele alınmıyor. Bunun yanında artık oyun dünyası bir sosyal platform haline geldi desek abartmış olmayız sanırım. Artık oyunların fanlarının toplandıgı, görüşlerini paylaştıgı forumlar, internet siteleri, komiteler mevcuttur.Hatta oyun dünyasına ait materyallerin satıldıgı, paylaşıldıgı ve bu işin artık bir ticarete döndüğünüde söylemek gerekiyor.Bu gibi altyapılara destek vermeniz gerektiğini unutmayalım. Bunların yanında birde belli dönemlerde update’ler veya expansion pack’ler çıkarmanız yine oyunun ömrünü uzatan bir başka yöntemdir.


Windows XP Stillerinin Kontrollere Uyarlanması

Herşeyden önce bu isteğimizi gerçekleştirmek için isteğimizi uygulayacağımız bir sınıfa sahip olmamız gerekir. Ne yazık ki standart ProgressBar sınıfı “sealed” olduğu için ben sınıfımı Control sınıfından türettim:

public class XPProgressBar:Control
{
}
Daha sonra yapmamız gereken standart ProgressBar özelliklerini (Maximum, Minimum, Value, Step) özelliklerini sınıfımıza uygulamaktır. Bu özelliklerin hepsi integer’dir. Kolay olduğu için bu kısmı geçiyorum. Dikkat edilmesi gereken nokta Value özelliğine bir değer geçerken sınıf örneğimizin yeniden boyanmasını sağlamaktır. Bunu da Refresh() fonksiyonu ile yapabiliriz. Uygulamamızın amacı XP sitillerinin uygulanması olduğu için Style isminde bir özellik tanıtırız. Bu özellik Normal ve System isimlerinde iki enum değeri tutar. Eğer özelliğimizin değeri System ise XP sitili uygulanır.

public Styles Style
{
get {<return FStyle;}
set
{
FStyle=value;
Refresh();
}
}
Şimdi sınıfımızın boyanması için OnPaint metoduna geçebiliriz. İlkönce Normal değerini görelim.
<SPANSTYLE16739" ?? New="FONT-SIZE:9PT;COLOR:BLUE;FONT-FAMILY:'COURIER

designtimesp="protected<SPANSTYLE16740" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" override void OnPaint(PaintEventArgs e)
{
<SPANSTYLE16749" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" Rectangle rect = ClientRectangle;
<SPANSTYLE16753" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" rect.Width-=6;
<SPANSTYLE16757" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" rect.Height-=6;
<SPANSTYLE16761" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" if(Maximum!=Minimum)
{
rect.Width =(Value-Minimum)*100/(Maximum-Minimum)*rect.Width/100;
}
<SPANSTYLE16778" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" if(Style==Styles.Normal)
{
ControlPaint.DrawBorder3D(e.Graphics,ClientRectangle,Border3DStyle.Sunken);
<SPANSTYLE16794" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" rect=new Rectangle(new Point(rect.X+3,rect.Y+3),rect.Size);
<SPANSTYLE16800" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" e.Graphics.FillRectangle(Brushes.Blue,rect);
}
else
{
//Burada Styles.System değerini uygulayacağız.
}
}
Yukarıdaki kodda yapılan Maximum ve Minimum değerlerine göre boyanacak alanın bulunup daha sonra boyanmasıdır. Dikkat edeceğiniz gibi segment şeklinde değil de düz boya şeklinde boyanmıştır. Eğer isterseniz bu aşamada bileşenimizi test edebilirsiniz.
Dikkat edeceğiniz gibi standart bir ProgressBar’ın yapacağı işlemleri gerçekleştirdik. Şimdi asıl amacımız XP sitillerinin uygulanması olduğuna göre bu aşamaya geçelim.
Öncelikle kullandığımız işletim sisteminin yapacağımız bu işlemi desteklemesi için Windows XP olması lazım. Bunu nasıl anlayacağımızı görelim:
<SPANSTYLE16846" ?? New="FONT-SIZE:9PT;COLOR:BLUE;FONT-FAMILY:'COURIER

designtimesp="bool<SPANSTYLE16847" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" IsThemedos()
{
if(Environment.OSVersion.Platform != PlatformID.Win32NT
<SPANSTYLE16859" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" || Environment.OSVersion.Version.Major < 5
<SPANSTYLE16863" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" || Environment.OSVersion.Version.Minor < 1)
<SPANSTYLE16867" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" return <SPANSTYLE='COLOR:BLUE'false;
<SPANSTYLE16873" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp="
<SPANSTYLE16876" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" return <SPANSTYLE='COLOR:BLUE'true;
}
Yukarıdaki fonksiyonda yapılan kullanılan işletim sisteminin version numaralarına bakarak Windows XP olup almadığını anlamaktır. Eğer değilse program XP sitillerinin kullanımına izin vermeyecektir.
Şimdi burada bir ara verip XP sitillerinin kullanımına olanak veren WinApi leri tanıtmak istiyorum. Öncelikle kullanacağımız dll “UxTheme.dll” dir. Bizim bu programda kullanacağımız 4 tane WinApi fonksiyonu var. Şimdi bunları tanıyalım:
HTHEME OpenThemeData( HWND hwnd,LPCWSTR pszClassList);
Bu fonksiyon bir window için ilgili sınıfın datasını açar. Dönüş değeri IntPtr dir. “pszClassList” parametresi ise kullanacağımız sınıfın string değeridir. Bizim örneğimizde bu değer "PROGRESS" dir.
BOOL IsAppThemed(VOID);
Bu Api bir kontrol fonksiyonudur. uygulamamızın visual sitilleri uygulayıp uygulamayacağını sorgular.
BOOL IsThemeActive(VOID);
Bu da başka bir kontrol fonksiyonudur. Visual sitillerin uygulamamız için aktif olup olmadığını denetler.
HRESULT DrawThemeBackground(     
    HTHEME hTheme,
<SPANSTYLE='FONT-SIZE:12PT'    HDC hdc,
<SPANSTYLE='FONT-SIZE:12PT'    int iPartId,
<SPANSTYLE='FONT-SIZE:12PT'    int iStateId,
<SPANSTYLE='FONT-SIZE:12PT'    const RECT *pRect,
<SPANSTYLE='FONT-SIZE:12PT'    const RECT *pClipRect
<SPANSTYLE='FONT-SIZE:12PT');
Uygulamamızın belki de en can alıcı Api si budur. Bu fonksiyonla visual sitillerin çizim işlemini gerçekleştiriyoruz. Dönüş değeri integer dir. Parametrelerine gelince:
hTheme: OpenThemeData fonksiyonu ile elde ettiğimiz IntPtr değerini kullanacağız.
hdc: Controlümüzün hdc değeri. <SPANSTYLE16960" ?? New="FONT-SIZE:10PT;FONT-FAMILY:'COURIER designtimesp="CreateGraphics().GetHdc() ile elde edilir.
iPartId ve iStateId: Bu parametreler çizeceğimiz kontrolün bölümlerini ifade eder. Visual Studio nun yardım indeksi bölümüne “Parts and States” yazarsak konuyla ilgili dökümanı bulabiliriz. Bu durumda Controlümüzün arkaplanını çizeceksek iPartId 1 değerini, eğer öndeki ilerleme bölümünü çizeceksek 3 değerini almalıdır. StateId değeri ise ProgressBar için kullanılmaz. Eğer dökümanı iyice incelersek yapacağımız diğer uygulamalarda XP sitillerini nasıl uygulayacağımız kolaylıkla anlaşılır.
pRect ve pClipRect: <SPANSTYLE='MSO-SPACERUN:YES' Bu parametreler <SPANSTYLE='MSO-SPACERUN:YES' çizeceğimiz dörtgen bölümü ifade eder. ClipRect “null” değerini alabilir.
Şimdi programımıza geri dönüp anlattığımız Api lerin kullanımına geçebiliriz. Öncelikle sınıfımızın yapıcısında <SPANSTYLE='MSO-SPACERUN:YES' OpenThemeData apisini kullanarak XP sitilimizin değerini tutabilirz. Daha sonra sınıfımızın OnPaint metodunda boş bıraktığımız “else” ifadesini dolduralım.
<SPANSTYLE16974" ?? New="FONT-SIZE:9PT;COLOR:BLUE;FONT-FAMILY:'COURIER

designtimesp="if<SPANSTYLE16975" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp="(IsThemedos() && IsAppThemed() && IsThemeActive())
{
DrawThemeBackground(e.Graphics,1,1,ClientRectangle);
DrawSystemSegments(e.Graphics,rect);
}
<SPANSTYLE16994" ?? New="FONT-SIZE:9PT;COLOR:BLUE;FONT-FAMILY:'COURIER

designtimesp="private<SPANSTYLE16995" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" void DrawSystemSegments(Graphics g, Rectangle rc)
{
int segwidth = 8;
<SPANSTYLE17008" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp="
<SPANSTYLE17011" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" int Count = ((rc.Width)/(segwidth+2))+((rc.Width<=0)?0:1);
<SPANSTYLE17016" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp="
<SPANSTYLE17019" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" Rectangle rect = new Rectangle(3,3,Count*(segwidth+2),rc.Height);
<SPANSTYLE17024" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" if (rect.Width>(Width-2*3))
{
<SPANSTYLE17033" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" rect.Width = rc.Width;
<SPANSTYLE17038" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" }

DrawThemeBackground(g,3,1,rect);
}
Öncelikle kontrolümüzün arka planını çizdik. Daha sonra DrawSystemSegments fonksiyonu ile segmentleri hesaplayıp sonra da bunu çizdirdik.