Prototype ve Decorator Design Patternleri .Net Core Bir Oyunda Kullanma

Selamlar,

Bu makalede, benim oyun yazarken çok işime yarıyan 2 design pattern üzerinde konuşacağız. Prototype ve Decoratorler.

Oyunda kullanım amacı uçak, tank, helikopter gibi araçların random sayıda yaratılması ve kendilerine özgü özelliklerin atanmasıdır. Siz bu sınıflar yerine, kendi bussines objelerinizi aynı mantıkta yaratıp, istenen özellikleri ekleyebilirsiniz.

 

 

 

 

 

Vehicle: Öncelikle ortak olarak kullanılan araç yani “Vehicle” abstract sınıfımızı tanımlayalım. Kısaca bu sınıf bizim araçların ortak özelliklerini barındıran bir yapı. İlerde bu araca çeşitli özellikler ekliyeceğiz. Yani dekore edeceğiz :)

WarMachine : Esas yeni özellikler eklenecek en basit aracımız WarMachine.

VehicleDecorator : Vehicle’ı bünyesinde bulunduran ve ana özelliklerin implemente edildiği ara abstract sınıftır.

WarMachineDecorator: Esas üretimin yapıldığı sınıftır. WarMachineDecorator kendi bünyesinde Vehicledan gelen bir araç beklemektedir.

Plane: Oyunda kullanılan birçok özelliğin eklendiği en önemli ve kapsamlı araçtır. Bütün özelliklerini “WarMachineDecorator“‘dan almıştır. “WarMachineDecorator” da, “WarMachine” sınıfından dekore edilerek elde edilmiştir.

Helicopter: Bu da yine size örnek teşkil etmesi amacı ile yazılan özellikleri “WarMachineDecorator“‘den genişletilmiş bir başka Helicopter sınıfıdır.

Decorator:

Şimdi farkettiyseniz amaç önce base bir sınıf yaratmak ve sonra da diğer sınıfları bu sınıftan inherit edip, özelliklerini geliştirmek yani Decore etmektir. Visual Studio IDE’si de bu design pattern’i bolca kullanmaktadır. Aşağıdaki diyagramda, LCD’den türemiş bir pencere ve pencereden dekore edilerek eklenen özellikler görülmektedir. Ben de bu oyunda basitçe yarattığım savaş araçlarının özelliklerini, en basitten karmaşığa doğru özelliklerini bir birine aktarıp, hem kod kalabalığından kurtuldum, hem de istediğim bir özellikde yaptığım değişikliğin tüm araçları etkilemesini sağladım. Ayrıca istenir ise, tek bir araç özelliği override edilerek, tüm araçlar için genel olan özellik değiştirilip, o araca özel hale getirilebilir.

Image Source: https://upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Decorator_UML_class_diagram.svg/800px-Decorator_UML_class_diagram.svg.png

Prototype:

Sıra geldi Creational Design Patternlerden Prototype’ı neden kullandığıma. Oyuna eklenen her arcın sürekli üretilmesi gerekmektedir. Oyun devam ettiği sürece, tanklar ve helikopterler random olarak yaratılmaktadır. Her seferinde oluşturulacak aracın tüm özellikleri atanarak, yeniden yaratılması yerine, daha en başta tekil tüm araçların yaratılıp bir container’a konup, daha sonra da istenene araç tipine göre yeni bir eşleniğin oluşturulması çok daha performanslı gözükmektedir. Aşağıda bu anlatım ile alakalı diyagram görülmektedir.

Image Source: https://www.gencayyildiz.com/blog/wp-content/uploads/2016/04/C-Prototype-Design-Pattern-Prototip-Tasarım-Deseni.png

Bir aracın tam bir eşleniğinin çıkarılması, yani DeepCopy işleminin TypeScript’de yapılabilmesi için, bu projede “lodashkullanılmıştır. Aşağıda görüldüğü gibi lodash, ilgili komut ile projeye dahil edilir.

Clone Object : Bir nesnenin birebir kopyası lodash ile aşağıdaki gibi alınmaktadır.

Prototype Object: Araçların eşleniklerinin oluşturulması ve bir containerda saklanması için yazılan sınıf aşağıdaki gibidir.

Kullanım Şekli : Daha en başta oyunda kullanılabilecek tüm araçlar, decoration design pattern ile özellikleri birbirine aktarılıp oluşturulmuş ve “VehicleManager” container’ına eklenmişlerdir. Daha sonra istenen araç, prototype design patternine göre ilgili containerdan eşleniği oluşturulup çekilmektedir.

Design Patternler kullanılması zorunlu olmayan ama kullanıldığı zaman hem kod kalabalığından kurtaran hem de  genişlemeye çok açık yapıları bize sağlamaktadır. Bu projeden örnek vermek ister isek, araçlara ortak yeni özellik eklenmesi istenir ise, örneğin “Fuel” yani benzin özelliği sadece en basit araç tipine eklemek yeterlidir. Böylece istenen özellik bundan türüyen ve Decore edilen tüm araçlar için eklenmiş olacaktır. Ayrıc sürekli bir nesne üretimi olan senaryolarda, Prototype design patern’inin kullanılması ile her seferinde yeni nesnenin üretilmesi yerine var olan bir nesnenin deep copy’sinin oluşturulması performansda gözle görülür bir artışa sebep olmaktadır. Ben oyun yazarken bu 2 patternden bolca faydalandım. Umarım sizin de işinize yarar.

Geldik bir makalenin daha sonuna.  Yeni bir makalede görüşmek üzere hepinize hoşçakalın.

Tüm Kod:

Source:

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. Kerem dedi ki:

    İyi günler. Hocam Microsoft un XNA adında oyun yapımını kolaylaştırmak için bir framework desteği varmış. Bununla ilgili bir yazı okudum ve çok hoşuma gitti acaba yakın zamanda C#/XNA/DirecX gibi araçları kullanarak bir oyunu 2D ve 3D tasarlama makalesi gelir mi? Oyunlarınızı daha efektif yazmak ve ilgi cekici, sürükleyici kılmak için bu araçların ne gibi artıları var, kullanabileceğimiz kütüphaneler ve Design pattern hakkında ayrıca detaylı bir makelenizide dört gözle bekliyor olacağız. İyi çalışmalar, esenlikle kalın.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.