Kaleci Oyunları: Keeper Gerçek Refleks Baskısını Nasıl Kuruyor?
Bir futbol oyununu, kurtarışın en zor kısmının etrafına kurmak istedim: şutu okumak ile vücudun bir parçasını topun yoluna sokmak arasındaki kısacık aralık.
Bu, tuşları neredeyse hemen eledi. Sola ya da sağa tıklamak sonucu üretebilir ama tepki vermenin hissini veremez. Oyuncunun futbolcunun koşusunu izlemesini, topun uçuşunu okumasını, uzanmasını, eğilmesini ve karar vermesini istedim. Webcam kumanda olmalıydı, karşısında duran kişi de kaleci.
Böylece Keeper çıktı. Dışarıdan basit görünen kaleci oyunlarından biri: bir seviyeyi geçmek için altı şuttan dördünü kurtar. Altında ise her seviye refleks problemini değiştiriyor. Şut hızlanıyor, top daha çok kavis yapıyor, kale genişliyor, köşelere daha sık atılıyor ve eşlenen kaleci daha az alanı kapatıyor.
Amaç, bir tarayıcı oyununun profesyonel bir maçı yeniden yarattığını ya da kaleci antrenmanının yerini aldığını iddia etmek değil. Almıyor. Amaç, gerçek şut kurtarmanın önemli kısıtlarını ödünç alıp webcam karşısında oynayabileceğin güvenli ve okunaklı bir oyuna sıkıştırmak.
Gerçek kaleci refleks baskısı neye benziyor?
Penaltı, kaleci hiç top hareket ederken görmediği için zor değil. Elindeki bilgi ve hareket süresi neredeyse aynı anda geldiği için zor.
Hakemli bir dergide yayımlanan, 88 penaltı vuruşunu inceleyen analiz, ortalama top uçuş süresini 525 milisaniye buldu. Araştırmacılar ayrıca kalecilerin ellerinin yüksek ve alçak şutlar için topa temastan yaklaşık 245 milisaniye sonra ayrılmaya başladığını, sol ve sağ yönündeki harekete ise temastan önce görülebilen işaretlerle başlanabildiğini gördü. Kalecilerin penaltı yönünü ve yüksekliğini nasıl sezdiğini inceleyen çalışmayı okuyabilirsin.
Bu ayrım Keeper'ı şekillendirdi. Gerçek bir kaleci yalnızca top hareket ettikten sonra tepki vermiyor. Yaklaşmayı, vücut duruşunu ve vuruşu okuyor, sonra bu kararı uçuşun ilk anlarına göre güncelliyor. O yüzden oyun, vuruştan önce koşan ve bacağını geriye alan bir futbolcu gösteriyor. Top çıkış yaptığında hız, kavis ve hedef yeri ne kadar düzeltme süresi kaldığını belirliyor.
Keeper doğrulanmış bir tepki süresi testi değil. Kamera gecikmesi, ekran boyutu, oda büyüklüğü ve büyütülmüş hareket modeli onu sahadan ayırıyor. Ama üst seviyeler bilerek profesyonellerden esinlenen bir baskı penceresine yaklaşıyor. 9. seviye oyuncuya 520 milisaniyelik top uçuşu veriyor; bu, o çalışmadaki 525 milisaniyelik ortalamayla neredeyse aynı. 10. seviye ve sonrası oyunun 500 milisaniyelik tabanına ulaşıyor.
İlk problem, kamerayı ayna gibi hissettirmekti
Keeper, tarayıcıdan ön kameradan bir video akışı isteyerek başlıyor. İzin penceresini tarayıcı MediaDevices.getUserMedia() ile yönetiyor. Bu API güvenli bir bağlam ve kullanıcının açık iznini şart koşuyor, yani kamera arka planda sessizce açılamaz.
Videoyu ideal olarak 1280'e 720 çözünürlükte istiyorum, sesi kapalı tutuyorum ve kullanıcıya bakan kamerayı tercih ediyorum. Sonra poz modeli video karelerini tarayıcıda işliyor. Keeper, MediaPipe Pose Landmarker'ı video modunda, tek bir poz ve hafif model ile, mümkünse GPU delegesi üzerinden çalıştırıyor. Google'ın web için Pose Landmarker rehberi aynı video karesi iş akışını anlatıyor.
Noktalar kamera koordinatlarında geliyor. Kullanmadan önce her x koordinatını aynalıyorum. Oyuncu kendi sağına giderse kaleci de onun bakış açısından ekranın sağ tarafına gitmeli. Bu ayna olmadan bir webcam oyunu daha ilk şut atılmadan yanlış hissettiriyor.
Bir poz henüz kaleci değil
Poz modeli bana oyuncunun başı, omuzları, dirsekleri, bilekleri, kalçaları, dizleri ve ayak bilekleri kamera karesinde nerede, onu söylüyor. Bu noktaların kalenin içinde nereye ait olduğunu söylemiyor.
Bunu, kaleyi kendi koordinat sistemi olarak ele alarak çözüyorum. Oyuncunun kalçalarının merkezi kalecinin hareketli merkezi oluyor. Diğer her nokta bu kalçalara göre ölçülüyor, kalenin genişliği ve yüksekliğiyle ölçekleniyor, sonra kale ağzına yerleştiriliyor.
Böylece farklı bedenler ortak bir oyun alanı kazanıyor. Oyuncu uzun, kısa, kameraya yakın ya da biraz geride olsun, bir bilek üst köşeye uzanabiliyor. Oyun ham kamera piksellerini ekrana kopyalamıyor. Pozun şeklini kalenin şekline eşliyor.
Eğilmek neden kamerada göründüğünden fazla hareket ettirmeli?
Oturma odası futbol sahası değil. Çoğu oyuncu tam bir dalışa güvenle atılamaz ve oyunun buna teşvik etmesini istemedim.
Bunun yerine Keeper, kalibre edilmiş duruş konumundan yatay kalça hareketini ölçüyor ve kale boyunca büyütüyor. Bilinçli bir eğilme, dalışa dönüşüyor. Kol ve bacak konumları yine önemli ama büyütülmüş kalça kayması, oyuncunun yere kapaklanmasına gerek kalmadan tüm kalecinin bir köşeye gidebilmesini sağlıyor.
Duruş çizgisi şutlar arasında yavaşça yeniden ortalanıyor. Bu önemli, çünkü insanlar birkaç kurtarıştan sonra doğal olarak kayıyor. Sabit bir kalibrasyon noktası zamanla düz durmayı kalıcı bir eğilme gibi gösterirdi.
İlk geri sayımdan önce oyun başın, omuzların ve iki kolun görünür ve makul ölçüde sabit olduğunu kontrol ediyor. Tek bir şanslı kareyi kabul etmek yerine bu hazır durumu kısa bir süre tutuyor. Kalibrasyon ekranı oyun tasarımından ayrı değil. Kameranın neyi görmesi gerektiğini belirliyor ve oyuncuya hareket alanı tanıyor.
Tüm vücut nasıl kurtarış alanı oluyor?
En önemli teknik karar, kurtarışın yalnızca bileğe bağlı olmaması oldu. Gerçek kaleciler şutları elleri, kolları, bacakları, gövdeleri ve bazen kafalarıyla durduruyor. Çarpışma sisteminin tüm silueti tanıması gerekiyordu.
Kalecinin vücudunu birkaç basit şekilden kuruyorum:
- Gövde, iki omuz ve iki kalçadan oluşan dolu bir çokgen.
- Kollar ve bacaklar, bir piksellik kemikler yerine kapsül gibi ele alınan kalın çizgi parçaları.
- Bileklerin biraz daha büyük, daire biçimli eldiven bölgeleri var.
- Kafanın kendi dairesel kurtarış bölgesi var.
Top kale çizgisine ulaştığında motor tek bir soru soruyor: top bu şekillerden herhangi biriyle örtüşüyor mu? Bir uzuv için parçadaki en yakın noktayı bulup mesafeyi uzuv kalınlığı artı top yarıçapıyla karşılaştırıyorum. Gövde için topun merkezinin çokgenin içine düşüp düşmediğini test ediyorum.
Görünürlüğü eşiğin altında kalan noktalar kurtarışa sayılmıyor. Böylece tahmin edilmiş bir bilek ya da saklı bir ayak bileği görünmez bir blok oluşturamıyor. Sonuç, fiziksel hissettirecek kadar hoşgörülü, ama oyuncunun yine de şuta doğru hareket etmesini gerektirecek kadar kesin.
Tepkiden önceki işaretleri canlandırmak
Adil bir futbol kalecisi oyunu okunabilir bir şut ister. Top hiçbir ipucu vermeden tam hızla belirirse oyuncu tepki vermiyor, tahmin ediyor.
Her şut kısa bir hazırlıkla başlıyor. Futbolcu topa yaklaşıyor, vuracak bacağı geriye gidiyor ve daralan bir halka vuruş anını okunur kılıyor. Top ayaktan çıkınca kaleye doğru ilerleyişi hızlanıyor. Top ayrıca uzaktaki boyutundan yakındaki boyutuna büyüyor; bu da bir derinlik işareti veriyor.
Falso, sinüs biçimli bir yay kullanıyor. Kavis, top ayaktan çıkarken sıfır, uçuşun ortasında en yüksek ve seçilen hedefte yine sıfır. Böylece top, şutçunun seçtiği hedefi kaçırmadan kavis yapabiliyor.
Bir kurtarış olduğunda top kaybolmuyor. Temas noktasından kısa bir an geri sekiyor ve kurtarışı yapan vücut parçası yanıp sönüyor. Bu küçük duraklama çarpışmayı anlamayı çok kolaylaştırdı. Oyuncular şutun neden durduğunu görebiliyor.
Üst seviyeler daha profesyonel bir refleks problemi kuruyor
Bir kaleci oyununu zorlaştırmanın bariz yolu top hızını artırmak. Sadece buna dayanmaktan kaçınmaya çalıştım, çünkü hızın bir tavanı var. Belli bir noktadan sonra yalnızca tepki verme şansını ortadan kaldırıyor.
Keeper, seviyeler yükseldikçe birbirine bağlı beş değişkeni değiştiriyor:
- Uçuş süresi kısalıyor, yani oyuncunun karar vermek için vakti azalıyor.
- Yanal kavis artıyor, yani topun ilk yolu daha az doğrudan oluyor.
- Kale genişliyor, yani savunulacak alan artıyor.
- Eşlenen kaleci kapsamı biraz daralıyor, yani yerinde durmak kalenin daha azını koruyor.
- Şutçu köşeleri daha sık hedefliyor.
İlk seviye topa yaklaşık bir saniyelik uçuş veriyor. Bu süre seviye başına 0,06 saniye azalıp yarım saniyelik tabana kadar iniyor. Aynı zamanda kavis ve köşe olasılığı sabit tavanlara doğru tırmanıyor. Kale, rastgele zorluk modları arasında sıçramak yerine kademeli olarak genişliyor.
Önemli olan tek bir sayı değil, değişkenlerin birlikte nasıl çalıştığı. İlk seviyeler eşlemeyi öğretiyor. Sonraki seviyeler oyuncudan hazırlıktan bilgi çıkarmasını, kavisi takip etmesini, daha erken karar vermesini ve yine de pozun tüm erişimini kullanmasını istiyor. Bu kombinasyon, aynı orta şutu sadece hızlandırmaktan çok daha fazla, tecrübeli bir kalecinin karşılaştığı karar baskısına yakın.
Seviye istatistikleri tüm ilerlemeyi gösteriyor
Güncel yayındaki ayarları doğrudan oyun yapılandırmasından kontrol ettim. Keeper'ın gerçekten kullandığı sayılar bunlar:
- Seviye 1: 1,00 saniye uçuş, yüzde 5 kavis katsayısı, yüzde 42 kale genişliği, yüzde 25 köşe olasılığı ve yüzde 102 temel erişim.
- Seviye 4: 0,82 saniye uçuş, yüzde 20 kavis katsayısı, yüzde 54 kale genişliği, yüzde 43 köşe olasılığı ve yüzde 96 temel erişim.
- Seviye 7: 0,64 saniye uçuş, yüzde 35 kavis katsayısı, yüzde 66 kale genişliği, yüzde 61 köşe olasılığı ve yüzde 90 temel erişim.
- Seviye 9: 0,52 saniye uçuş, en yüksek yüzde 45 kavis katsayısı, yüzde 74 kale genişliği, yüzde 73 köşe olasılığı ve en düşük yüzde 88 temel erişim.
- Seviye 12: 0,50 saniye uçuş, yüzde 45 kavis katsayısı, yüzde 86 kale genişliği, yüzde 90 köşe olasılığı ve yüzde 88 temel erişim.
Kavis katsayısı oyun uzayında bir değer; gerçek top hareketinin metre cinsinden karşılığı olduğunu iddia etmiyor. Kale genişliği ve erişim de ekrandaki kalenin oranları. Faydalı karşılaştırma ilerleme: 1. seviyeyle 12. seviye arasında uçuş süresi yarıya iniyor, kale iki kattan fazla genişliyor, köşe olasılığı dört şutta birden on şutta dokuza çıkıyor ve duruş kapsamı daralıyor.
Sonraki turların, rengi değiştirilmiş bir ilk seviye gibi değil, farklı bir standart gibi hissettirmesi bu yüzden. 9. seviyeye gelindiğinde tepki penceresi, profesyonel penaltı görüntülerinde ölçülen yarım saniye bandına girmiş oluyor; üstelik şutun kavis yapıp köşeye gitme ihtimali de daha yüksek.
Kurtarış hedefi bir oyun kuralı, profesyonel bir ölçüt değil
Her seviyede altı şut var. En az yüzde 60'ını, yani altı şuttan dördünü kurtarırsan sonraki seviye başlıyor. Skor, tamamladığın seviye sayısı.
Sabit bir blok seçtim, çünkü her seviyeye küçük bir hikaye veriyor. Oyuncu hedefi, o anki şutu ve hataya ne kadar yer kaldığını hep biliyor. Gereken dört kurtarış matematiksel olarak imkansız hale gelirse tur anlamsız şutlar atılmadan hemen bitiyor.
Altıda dört kurtarış, yüzde 66,7'lik bir seviye geçme oranı demek. Bunu gerçek penaltı kurtarma yüzdeleriyle kıyaslamamak gerek. Keeper'ın şutları, vücut ölçeklemesi ve hedef dağılımı, tekrar oynanabilir bir tarayıcı oyunu için tasarlandı; profesyonel müsabakayla istatistiksel eşdeğerlik için değil. Gerçek dünyadaki referans maç skorunda değil, tepki penceresinde ve görsel karar baskısında yatıyor.
Bu yapı, istikrarı bir defalık şanslı bir bloktan da ayırıyor. Tek bir muhteşem kurtarış güzel hissettiriyor ama seviye geçmek tekrarlanan kararlar ve hareketler gerektiriyor. Bu da kısa bir online kaleci oyunu için, görünür bir kontrol noktası olmayan sonsuz bir şut akışından daha uygun.
Motoru kameradan ayırmak
Çekirdek oyun motoru React'ı, webcam'i ya da poz noktalarını bilmiyor. Şutçu, hazırlık, top uçuşu, kavis, şut sonuçları, seviye kuralları ve skor onun sorumluluğunda. Sayfa ona sahne boyutunu ve bir kurtarış test fonksiyonu veriyor.
Bu sınır, önemli kuralları kamerayı başlatmadan test edilebilir kıldı. Motora belirlenimli bir rastgelelik kaynağı verip zamanı ilerletebiliyor, top yolunu inceleyebiliyor ve bir seviyenin ne zaman geçileceğini ya da biteceğini doğrulayabiliyorum. Poz geometrisi ayrı bir modülde duruyor ve geometri olarak test edilebiliyor.
Tarayıcı döngüsü requestAnimationFrame() kullanıyor. Kareler arasındaki geçen zamanı hesaplayıp motora veriyorum, böylece yenileme hızı yüksek bir ekranda top daha hızlı gitmiyor.
Keeper'ı yapmak bana ne öğretti?
Zor olan kişiyi tanımak değildi. O kişinin, şut gerçek refleks baskısına benzemeye başlarken dijital bir kalede nasıl yer alacağına karar vermekti.
Oyun, poz noktalarını bitmiş bir kumanda gibi görmeyi bıraktığımda çalışmaya başladı. Onlar ham madde. Kumanda; kalibrasyondan, aynalamadan, göreli koordinatlardan, büyütülmüş eğilmeden, görünürlük kontrollerinden ve çarpışma şekillerinden çıkıyor. His ise okunaklı hazırlıktan, görünür temastan ve kuralları değiştirmeden problemi değiştiren bir zorluk eğrisinden geliyor.
Webcam oyunlarında sevdiğim şey bu. Teknik sistem karmaşık ama oyuncuya verilen talimat basit kalabiliyor: koşuyu oku, şutu izle, topa uzan ve kurtar. İlk seviyeler bu diziyi öğrenmen için sana zaman veriyor. Üst seviyeler bunu yarım saniye içinde yapmanı istiyor.
Keeper'ı tarayıcında ücretsiz oynayabilirsin. Deneyime hızlıca göz atmak için AR futbol oyunu rehberimi oku. Aynı poz hattını kalecilik yerine koşu için nasıl kullandığımı görmek istersen Dino Survival'ı nasıl yaptığımı oku.