Categories
Oyun Geliştirme

Oyunda PI Kontrolör Algoritması Kullanımı

Lua programlama dili temelli Löve yapısı kullanarak oyun yazabiliriz. Çabuk prototipleme, kolay yazım, aktif kullanıcı sayısının fazla olması ve oyun tasarımına çok müsait yapısı gibi sayılabilecek bir çok sebep nedeniyle Lua dili ve Löve yapısını tercih ettim. Uzun zaman önce ilgilendiğim konulardan “bricks breaker” olarak adlandırılan (tuğla kırıcı diyebiliriz bence rahatlıkla) oyunu temel alarak birşeylere giriştim. Aşağıda yapılmış oyunların fotoğraflarına da gözatabiliriz.

https://www.google.com/search?q=bricks+breaker&rlz=1C1RLNS_trTR731TR731&source=lnms&tbm=isch&sa=X&ved=2ahUKEwiY5aidi9fqAhWF26QKHd7xAdUQ_AUoAnoECBcQBA&biw=1229&bih=604

Öncelikle oyunu oluşturdum. (Bu kısım çok zorlamadı) Ardından PI kontrolör algoritması kullanarak platformun otomatik olarak çalışmasını sağlamaya uğraştım. Bu sayfada kısaca bundan bahsedeceğim.

Önce biraz PID ve Löve konularına değineceğim.

PID kontrolör algoritmaları endüstride çoklukla tercih edilir. Genelde, geribeslemeli sistemlerde kullanılır. Oransal, integral ve türev kontrol etkilerini kullanarak, sürekli olarak hatanın bulunduğu sistemin kontrol edilmesi için kullanılan bir algoritmadır. (PID algoritmasına ilgim, geçmişte Arduino kartı ve akıllı malzemeler kullanarak, bir eyleyicinin pozisyon kontrolünü yapmamdan kaynaklanmaktadır.) Konuyla ilgili, web’de çokca içerik bulunabilir.

https://en.wikipedia.org/wiki/PID_controller

Yukarıda Löve yapısının şablonunu görebilirsiniz. Kabaca, load fonksiyonu bir seferde çalıştıracağımız durumları, update fonksiyonu, dt olarak tanımlanan zamanda oyunun güncellenen durumlarını içerir, draw ise bu durumları ekrana çizdirebilen fonksiyonu oluşturur. Web sitesi şöyle: https://love2d.org/

En üstteki kod ise print fonksiyonunun Löve ile kullanılmasını sağlamada işime çokca yaradı.

Web’deki içeriklerden de faydalanarak oyunu oluşturdum fakat bu kısımdan bahsetmeyeceğim. PI algoritmasıyla çalışan platformdan bahsetmeyi önemli buluyorum.

PI algoritmasının oyunda kullanılan kısmı aşağıdadır. Kodun bu kısmı, update fonksiyonunda çalıştırılmaktadır!

Kp orantı sabiti ve Ti integral zamanı olmak üzere, topun yatay konumu ve platformun yatay konumu arasındaki hata hesaplanarak, hata ve zaman tabloları oluşturuluyor. Hatanın zamana bağlı integrali, trapez_integral fonksiyonu kullanılarak (aşağıdaki kod parçası) hesaplanıyor ve platformun hızı ile kontrol sağlanıyor.

Elbette sadece oransal kontol girilmesiyle de güzel sonuç elde edilmektedir. PI algoritması burada daha hassas bir konum sağlamaktadır. Kp ve Ti ile oynanarak hassasiyeti geliştirmek mümkündür. PI ile sonuç yeterince faydalı olduğundan D yani türev kısmı hiç düşünülmemiştir. Hızın denklem olarak ifadesi şöyle:

Kp orantı sabiti, Ti integral zamanı, e hata

Sonuç olarak, PI algoritmasıyla topa doğru yönelen bir platform elde etmiş oldum! Eğlenceliydi!!! Teşekkürler PI algoritması…

Epeyce incelediğim, yararlandığım sitelerin linkleri de şöyle:

https://github.com/noooway/love2d_arkanoid_tutorial/wiki

https://sheepolution.com/learn

https://authors.curseforge.com/forums/world-of-warcraft/general-chat/lua-code-discussion/226246-trapezoidal-rule-in-lua

Kullandığım editör “ZeroBrane Studio” ile ilgili aşağıdaki linki de pek tabi yazmalıyım.

https://studio.zerobrane.com/

Son olarak faydalandığım konseptler ile ilgili otomatik kontrol kitabı da meraklısına…(!!!) (Prof. Dr. İbrahim Yüksel, Otomatik Kontrol: Sistem Dinamiği ve Denetim Sistemleri)

RunOnuR 23