Webcam Oyunları: Dinozor Koşu Oyununu Nasıl Yaptım?
Bir tuşa basmanın koşmak sayılmadığı bir koşu oyunu yapmak istedim. Oyuncu hareket etmeyi bırakırsa karakter de durmalıydı. Oyuncu bir hız patlaması daha bulursa kaçış kolaylaşmalıydı. Sadece kollarını kameraya doğru sallıyorsa da oyun farkı anlamalıydı.
Bu fikir Dino Survival oldu: bir T-Rex'ten kaçmak için olduğun yerde koştuğun bir tarayıcı oyunu. Tek cümleyle yazınca kulağa kolay geliyor. Yapması ise çok daha zor bir soruyu çözmeyi gerektirdi: webcam hareket eden bir bedeni nasıl adil hissettiren bir kumandaya çeviriyor?
Webcam oyunları neden farklı bir kumanda istiyor?
Çoğu sonsuz koşu oyunu hareketi bir tuşa, bir kaydırmaya ya da otomatik ileri hıza indirir. Bu işe yarar, çünkü girdi kesindir. Bir tuş ya basılıdır ya da değildir.
Beden daha dağınık. İnsanların boyları, oda büyüklükleri, kamera açıları ve koşu stilleri farklı. Dizler kadrajın altında kaybolabilir. Kıyafetler bir eklemi gizleyebilir. Loş ışıkta kamera, kişi hareketsiz dururken bile bir noktayı titretebilir.
O yüzden tek bir pozu tek bir hıza bağlayamazdım. Hareketi zaman içinde izleyebilen, gürültüyü eleyebilen ve yine de bağlantı hissi verecek kadar çabuk tepki veren bir hat gerekiyordu:
- Tarayıcıdan kamera erişimi iste.
- Her video karesinde vücut noktalarını tahmin et.
- Sırayla çalışan bacak hareketini ve tüm vücut hareketini ölç.
- Son dakikadaki adım hızını kararlı bir oyun temposuna çevir.
- Bu tempoyla koşucuyu ilerlet ve dinozorla arasındaki mesafeyi değiştir.
Tarayıcı kamera iznini MediaDevices.getUserMedia() ile yönetiyor. Dino Survival yalnızca video istiyor ve varsa ön kamerayı kullanıyor. Canlı kareleri sonra poz modeli tarayıcıda işliyor.
Poz noktaları koşmakla aynı şey değil
Dino Survival, MediaPipe Pose Landmarker'ı video modunda kullanıyor. Model 33 vücut noktası döndürebiliyor ama daha fazla veri, kendiliğinden daha iyi bir oyun kumandası demek değil.
Kadans için daha küçük bir gruba odaklanıyorum: omuzlar, kalçalar, dizler ve ayak bilekleri. Omuzlar ve kalçalar bana kabaca bir gövde ekseni veriyor. Dizler ve ayak bilekleri de bacakların bu eksene göre nasıl hareket ettiğini gösteriyor.
Bu göreli ölçüm önemli. Bir dizin ekranda ne kadar yüksekte göründüğüne bakıp bırakırsam, eğik bir telefon ya da ortadan kayık duran bir oyuncu sonucu değiştirebilirdi. Bacak hareketini oyuncunun kendi gövde ekseni boyunca yansıtmak, dedektörün kameranın nasıl yerleştirildiğine daha az bağımlı olmasını sağlıyor.
Oyun ayrıca iki kalçanın ve iki dizin görünür olup olmadığını kontrol ediyor. Görünür değilse eksik veriden sessizce bir tempo uydurmak yerine oyuncudan geri çekilmesini istiyor. Bir hareket kontrollü oyunda girdi güvenilirmiş gibi davranmaktansa dürüst geri bildirim vermek daha iyi.
Sırayla hareket eden bacakları kadansa çevirmek
Yerinde koşmak tekrar eden bir örüntü yaratıyor. Bir diz yükseliyor, tepeye çıkıyor ve iniyor. Sonra öbür bacak aynısını yapıyor. Dedektör diz ve ayak bileği hareketini izleyip bu sırayla gelen tepeleri arıyor.
Her bacak için uyarlanabilir eşikler kullanıyorum, çünkü tek bir sabit sayı her bedene ya da kameraya uymuyor. Uzun boylu bir oyuncu, daha uzakta duran kısa boylu bir oyuncuya göre ekranda çok daha büyük bir hareket yaratabilir. Dedektör işe yarar bir yerel aralığı öğreniyor, sert bir tavan da bu uyumun fazla gevşek olmasını engelliyor.
Geçerli bir tepeden sonra aynı bacak 130 milisaniyelik kısa bir bekleme süresine giriyor. Bu, diz kaldırışının tepesindeki nokta titremesinin iki üç hayali adıma dönüşmesini önlüyor. Geçerli adımlar üç saniyelik kayan bir pencereye giriyor. Bu, sayıyı yumuşatacak kadar uzun, çabadaki gerçek bir değişikliği fark edecek kadar kısa.
Yaklaşık 1,1 saniye adım gelmezse kadans doğrudan boşta konumuna dönüyor. Uzun, yavaş bir sönümleme yerine bu kesin sıfırlamayı tercih ediyorum. Oyuncu durduğunda oyun da durmalı.
Kol sallamanın sprinte dönüşmesini nasıl engelledim?
Erken hareket sistemleri çoğunlukla karedeki her hareketi ödüllendirir. Bu bariz bir kestirme doğuruyor: ayaklarını sabit tut, ellerini oynat. Kamera sarsıntısını da egzersiz gibi gösteriyor.
Dino Survival kalçalara dayanan ikinci bir kapı ekliyor. Kısa bir pencerede gerçek bir dikey vücut sıçramasını arıyor. Kadans yalnızca sırayla çalışan bacak örüntüsü ile bu daha geniş hareket sinyali birbirini tuttuğunda sayılıyor.
Kimsenin koşu formunu notlamaya çalışmıyor. Sadece işi alt vücudun yaptığına dair kanıt istiyor. Tek başına kol hareketi kapıyı açmıyor, poz tahminindeki küçük gürültü de koşucuyu ileri götürmüyor.
Webcam oyunları yaparken en büyük derslerimden biri bu oldu: iyi girdi, en çok hareketi saptamak değil, doğru hareketi saptamak ve kameranın göremediği durumda bunu net biçimde anlatmak.
Dakikadaki adımdan dinozor kovalamacasına
Kadans dedektörü dakikadaki adım sayısını üretiyor ama oyunun laboratuvar ölçümüne ihtiyacı yok. Net, oynanabilir bir sinyale ihtiyacı var. Sonucu üç anlaşılır çaba bandına eşliyorum: dakikada yaklaşık 70 adımda yavaş tempoda koşu, 120'de koşu, 160'ta sprint.
Bu bantlar normalleştirilmiş bir tempo oluyor. Hayatta kalma motoru bu tempoyla oyuncuyu 50 birimlik kaçış hedefine doğru ilerletiyor. Aynı zamanda dinozorun, koşu boyunca artan kendi hızı var.
Mesafe, bu iki hız arasındaki farka göre değişiyor. Dinozordan hızlı koşarsan aranda boşluk açılıyor. Gevşersen kazanmaya başlıyor. Jipe ulaşırsan kaçıyorsun. Mesafe sıfıra inerse kovalamaca bitiyor.
Oyunu sıradan bir dinozor koşu oyunundan farklı hissettiren kısım bu. Dinozor, dişli bir süre sayacı değil. Oyuncunun o anki çabasının görsel bir açıklaması.
Dünya yalnızca sen hareket edince hareket ediyor
Patika, bir dizi orman karesinden oluşuyor. Bu kareleri saat zamanına göre değil, biriken mesafeye göre seçiyorum. Oyuncu koşmayı bırakırsa çevre donuyor. Yeniden başlarsa patika koşucunun altından akmaya devam ediyor.
Dinozorun görünen boyutu ve konumu mesafeye bağlı. Yaklaştıkça sahnenin daha büyük bir kısmını kaplıyor. Toz, hız çizgileri ve tempo göstergesi aynı mesajı destekliyor. Birkaç küçük işaret tek bir soruyu yanıtlıyor: kaçıyor muyum?
Çizim döngüsü, tarayıcıdan bir sonraki yeniden çizimden önce animasyon işini çalıştırmasını isteyen requestAnimationFrame() kullanıyor. Geri çağırmanın zaman damgasıyla geçen süreyi hesaplıyorum, böylece hareket her cihazın saniyede aynı sayıda kare çizdiğini varsaymak yerine zamana göre ilerliyor.
Canlı kişiyi her karede sahneye ayrıştırmak yerine önceden çizilmiş bir koşucu da kullanıyorum. Bu tercih, mobil cihazlarda görsel işlem yükünü azaltıyor ve oyuna tutarlı bir karakter veriyor. Webcam yalnızca kumanda, ekranda gördüğün sanat değil.
Kalibrasyon neden oyun tasarımının parçası?
Kamera kurulumu, oyuncudan saklayabileceğim teknik bir ekran değil. İlk seviye o.
Dino Survival bir kadraj rehberi gösteriyor ve gerekli noktalar görünene kadar bekliyor. Ne zaman geri çekilmen gerektiğini söylüyor ve kovalamacadan önce sana kısa bir geri sayım veriyor. Bu an sözleşmeyi kuruyor: alt vücudunu görünür tut, olduğun yerde koş, oyun seni izlesin.
Bir klavye demo modu da var. Kamera izni vermeden oyunu keşfetmeni, desteklenmeyen bir kurulumda denemeni ya da önce kuralları anlamanı sağlıyor. Tam deneyim hâlâ kameralı sürüm, çünkü çaba ile kaçış arasındaki fiziksel bağ işin özü.
Dino Survival'ı yapmaktan ne öğrendim?
En zor kısım bir T-Rex çizmek değildi. Neyin adım sayılacağına karar vermekti.
Güvenilir bir beden kumandası, birlikte çalışan birkaç mütevazı kontrol istiyor. Noktalar vücudun nerede olduğunu belirliyor. Sırayla gelen diz ve ayak bileği tepeleri kadansı düşündürüyor. Kalça hareketi oyuncunun gerçekten koştuğunu doğruluyor. Kayan pencere sonucu yumuşatıyor. Hızlı bir boşta sıfırlaması durmayı dürüst tutuyor. Oyun motoru da bu sinyali, oyuncunun kullanım kılavuzu okumadan anlayabileceği bir mesafeye çeviriyor.
Tarayıcı tabanlı hareket kontrolünün bana çekici gelen yanı bu. Geri bildirim doğru olunca teknoloji ortadan kayboluyor. Noktaları, eşikleri ya da kare zaman damgalarını düşünmüyorsun. Bir dinozor görüyorsun, yaklaştığını duyuyorsun ve koşuyorsun.
Tasarım ve araştırma açısını merak ediyorsan Dino Survival'ın neden doğru türde bir egzersiz oyunu olduğunu düşündüğümü oku.
Dino Survival'ı tarayıcında ücretsiz oynayabilirsin. İndirme yok. Aynı webcam hattının üst vücut hareketini nasıl ele aldığını görmek istersen Monster Punch'ı online boks oyunu olarak nasıl yaptığımı oku. Anında açılan daha fazla oyun için indirmesiz ücretsiz oyunlar rehberime göz at.