Categories
Oyun Geliştirme

PONG:HARDON COLLIDER

“Pong” ilk bilgisayar oyunudur. İlgilenenler için tarihçesi hakkında birçok kaynak bulunuyor. Uzun bir süre kafamdaki “Pong” benzerini oluşturmak için çabaladım. Fakat benim ilgimi çeken fizik bakış açısı olduğu için yaptığım çalışmalar pek içime sinmedi. Ayrıca ilk başta “Multiplayer” ve “Network tarafına baya kafa yordum ve birçok şey öğrendim fakat sonradan “Collision”(Çarpışma) denen olayın üzerine daha çok gittim ve aldığım sonuçtan memnunum. Belki ilerleyen zamanda “Multiplayer” konusuna da değinen bir yazı yazabilirim. O zaman başlayalım!

“Multiplayer” özelliklerini göz önünden kaldırdıktan sonra, daha tecrübeli olduğum “Lua” dili ve “Löve” yapısıyla “Collision” olayına eğildim. Birçok “Collision” kütüphanesi ile karşılaştığımı söylemeliyim. Bunlar içinde “Hardon Collider” yaptığım çalışmaya daha uygun bir kütüphane olduğu için öne çıktı. ( İsmini başka bir “Collider” ile karıştırmak mümkün. Ama o bambaşka bir “Collider”.* ) *https://en.wikipedia.org/wiki/Large_Hadron_Collider

Pong “Hardon Collider”
Proje dosyaları ve düzeni

Ana kod içerisinde “Hardon Collider” kütüphanesini ve kendi oluşturduğum fonksiyonları çağırıp kullanabiliriz.

Ana kod

Ama en önemlisi “Collision” ve bunu aşağıda kısım kısım görebiliriz.

“Collision” (Top ile duvarlar arasındaki etkileşim)

Statik duvarlarla dinamik topun etkileşimi yukarıdaki fonksiyonlarla tanımlandı. Buna göre “collidesWith” fonksiyonuyla statik duvarlarla dinamik topun çarpışması koşuluna bakılıp, dinamik topun hız vektörü bileşenlerini değiştirmek ve böylece dinamik topun yönünü değiştirmek sonucu elde edilebilir.

“Collision” (Platform ile duvarlar arasındaki etkileşim)

Oyuncuların kontrol ettikleri dinamik “Platform” ile statik duvarların etkileşimi için ise yukarıdaki fonksiyon parçası kullanıldı.

“Tunneling” denen topun platformların üst veya alt kısmından içeri süzülmesi olayının önüne geçmek istiyoruz. Bu sebeple, “Platform” için yardımcı şekiller “Collision” amacıyla oluşturuldu.

“Platform” Üst ve Alt kısımları için Oluşturulan Şekiller (Kırmızı Renkte Gözükmektedir)

Dinamik nesnelerin (Platform ve top) etkileşimi aşağıda görülmekte. Topun platformun ön kısmında etkileşimi için “collidesWith” fonksiyonu ile önce yine “Collision” koşuluna bakılıyor sonrasında ise for döngüsüyle iki nesnenin “Collision” ayrıştırıcı vektör bileşenleri (delta.x, delta.y) “move” fonksiyonunda kullanılarak ve hız vektörü bileşeninin değiştirilmesi ile topun “Collision” bölgesinden çıkarılması sağlanıyor.

Dinamik nesnelerin “Collision” etkileşim fonksiyonu

Topun platformların üst ve alt kısımlarıyla etkileşimi için ise kod biraz farklılaşıyor. Burada ayrıştırıcı vektör birleşenleri platform hız bileşenleri ile çarpılıyor, for döngüsünden önce de topun hız vektör bileşeni değiştirilerek, “Tunnelling” problemi çözülüyor ve daha güzel bir etki gözlemleniyor.

Bu çalışmanın diğer kodlarını da ilgilenen olursa diye paylaşayım. “Platform” fonksiyonları için kodları aşağıda belirttim.

Platform Fonksiyonları

Diğer fonksiyonlar için ise kodlar aşağıda görülebilir.

Pong Diğer Kodlar

“Collision” olayının oyun tasarımında önemli bir yeri vardır. Dikdörtgen- Dikdörtgen “Collision” olaylarını daha iyi çözümleyen kütüphaneler bulunuyor. Farklı şekillerde geometrik nesnelerin “Collision” işlemleri biraz daha fazla çaba gerektirebiliyor.

İnternette “Hardon Collider” ile ilgili fazla kaynak bulunmuyor. Umarım faydalı bir yazı olmuştur.

Aşağıda yararlandığım kaynakları ve kütüphane web linklerini belirttim. Kullandığım kod editörünün linkini de aşağıda görebilirsiniz.

RUNONUR
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