Risk ve Ödül: Pogo Oyununda Hava Numaraları
5 dk okuma

BOINGWARD'ın ilk sürümünde pogo yalnızca zıplıyordu. Oynarken aklıma basit bir şey geldi ve olduğu gibi yazdım: "havalı hareket çekerse daha yüksek zıplasın." Bu cümle güzel bir fikir ama bir tasarım değil. Hangi hareket? Ne kadar yüksek? Ya oyuncu hareketin ortasında yere çakılırsa? Bu yazı, o tek cümlenin tasarım belgesine, sonra sayılarla tanımlı bir sisteme nasıl dönüştüğünü anlatıyor.
Oyunun genel hikâyesini serinin merkez yazısında, numaraların üstüne kurulduğu zıplama fiziğini fizik yazısında bulabilirsiniz.
Önce sınırlar
Tasarım belgesi işe ödülden değil, sınırlardan başlıyor. Numaralar şu kurallara uymak zorunda:
- İsteğe bağlı. Her parkur numara yapmadan da bitirilebilir. Parkurları test eden botlar hiç numara yapmıyor; bir platform numara gerektirirse test kırılır.
- Riskli. Numaranın ortasında yere inmek bedava bir fırlatma değil, bir cezadır.
- Deterministik. Numaranın durumu fizik adımında ilerler; saniyede 30 ya da 144 kare çizen iki telefon aynı numaradan aynı sonucu alır.
- Zıplama tuşu yasağı sürer. Zıplama yine otomatik; numara düğmesi yalnızca havada döndürür.
- Kozmetikler fiziksizdir. Dönüş yalnızca görsel; çarpışma gövdesi hiç dönmüyor.
Son madde önemli. Robotun havada takla atması bir animasyon; fizik açısından pogo hep dik duruyor. Böylece numaralar çarpışmaları, platform kenarlarını ya da çok oyunculu adaleti hiç etkilemiyor.
Girdi: tek düğme, dört numara
Tasarımda oyuncu, sağ alttaki NUMARA düğmesini havadayken basılı tutuyor. Hangi numaranın yapılacağına düğmeye basıldığı anda sol çubuğun yönü karar veriyor:
| Basış anında çubuk | Numara | Dönüş ekseni |
|---|---|---|
| İleri | Öne takla | Kameranın sağ ekseni, burun öne |
| Geri | Arkaya takla | Kameranın sağ ekseni, burun arkaya |
| Sağ ya da sol | Yan takla | Gidiş yönü ekseni |
| Ortada | Dönüş | Dikey eksen, 360 derece |
Düğme basılıyken çubuk yönlendirme yapmıyor, çünkü numarayı o seçti. Düğme bırakılınca yönlendirme geri geliyor. Ayrı bir menü ya da kombinasyon ezberi yok; dokunmatik ekranda tek başparmakla yapılabilecek kadar basit.
Ne zaman başlanabilir?
Her zıplamada numara yapılabilseydi sistem anlamsızlaşırdı. Bir numara ancak pogonun, son fırlatma yüksekliğine geri düşmesine en az 0,7 saniye varsa başlayabiliyor. Standart bir atlayış toplam yaklaşık 1 saniye sürdüğü için bu, numaraların ya yükselirken ya da büyük atlayışlarda (trambolinler, hızlandırıcılar, düşük yerçekimi) yapılabileceği anlamına geliyor. Oyuncunun bu pencereyi öğrenebilmesi için tasarımda düğmenin, numaraya başlanabilecek anlarda parlaması öngörülüyor.
Dönüş, tam tur ve geri toparlanma
Düğme basılıyken robot saniyede 1,6 tur dönüyor. Bırakıldığında kaç tam tur atıldığı şöyle sayılıyor:
var turns := floori((angle + snap) / TAU) # snap = 60 derece60 derecelik pay sayesinde 300 derecelik bir dönüş tam tur sayılıyor ve robot kalan açıyı tamamlayıp dikleşiyor. Bırakıldıktan sonra kalan açı 0,15 saniyede sıfıra dönüyor. 300 dereceden az bir dönüş hiçbir şey kazandırmıyor; ama robot yere değmeden toparlanırsa bir şey de kaybettirmiyor.
İniş: üç olası sonuç
Bütün sistemin kalbi iniş anı. Uç yere değdiğinde üç şeyden biri oluyor:
- Temiz iniş: En az bir tam tur tamamlanmış ve robot dikeyden en fazla 20 derece sapmışsa bu iniş "stil" sayılıyor. Bu zıplamanın fırlatma hızı ödül oranı kadar artıyor.
- Çuvallama: Robot hâlâ dönerken ya da dikeyden 45 dereceden fazla sapmışken yere değerse sendeliyor, kombo sıfırlanıyor ve bu iniş hiç fırlatmıyor.
- Arada: Tur tamamlanmış ama eğiklik 20 ile 45 derece arasındaysa turlar kayboluyor, normal bir zıplama oluyor, ceza da yok.
Bu üçlü önemli. Yalnızca "başarı ya da ceza" olsaydı oyuncular numara denemekten çekinirdi. Ortadaki bölge, hatayı cezalandırmadan ödülü geri alıyor.
Ödül formülü ve tavan
Ödül, atılan turların ve numara çeşitliliğinin birleşimi:
ödül = toplam(tur x numara başına oran) x (1 + 0,5 x (farklı numara sayısı - 1))
ödül = en fazla moda göre tavanTur başına oranlar: takla 0,10, yan takla 0,08, dönüş 0,06. Aynı atlayışta farklı numaralar birleştirmek her ek tür için yüzde 50 artırıyor. Örneğin bir arkaya takla ve bir dönüş: (0,10 + 0,06) x 1,5 = 0,24.
Asıl tasarım kararı tavanda. Tavanı oyun modu belirliyor:
| Mod | Tavan | Etkisi (12 m/s temel fırlatma) |
|---|---|---|
| Spire | 0,10 | 13,2 m/s, tepe 3,0 m'den 3,6 m'ye |
| Tırmanış | 0,30 | 15,6 m/s, tepe 3,0 m'den yaklaşık 5,1 m'ye |
Spire madalyalı bir zaman yarışı; orada numara küçük bir zaman kazancı ya da bir kestirme demek, parkuru kırmamalı. Uzun tırmanış modunda ise numaralar asıl heyecan; ödül büyük. Yukarıdaki örnekteki 0,24, Spire'da 0,10'a kırpılıyor, tırmanışta olduğu gibi kalıyor.
Ödül, normal fırlatma hesabından sonra uygulanıyor ama genel hız sınırı yine geçerli. Hızlandırıcı pedler ödülü yok sayıyor, çünkü onların sonucu sabit olmak zorunda. Ödül yalnızca bir zıplama sürüyor; bir sonraki iniş sıfırdan başlıyor.
Neden kare hızından bağımsız olmalı?
Dönüş açısı çizim karesinde değil, fizik adımında ilerliyor. Bu bir ayrıntı gibi görünüyor ama değil: açı çizim karesine bağlı olsaydı, 120 karede çizen bir telefonda tur biraz farklı bir anda tamamlanır, aynı numara bir cihazda temiz, diğerinde çuvallama olurdu. Test paketi aynı numara denemesini saniyede 30, 60 ve 144 karede çalıştırıp sonucun (inilen numara sayısı, ödül oranı, zıplama sayısı) birebir aynı olmasını şart koşuyor.
Ekranda nasıl görünüyor?
Numaraların görsel tarafı ayrı bir oturumda yapıldı. Robot, pogonun ucundan bir metre yukarıdaki gövde merkezi etrafında dönüyor; dönüşte eller pogo sopasını bırakıyor, temiz inişte robot hafifçe ezilip parlıyor, çuvallamada sallanıyor. Tasarım belgesinde arayüz için de plan var: temiz inişte ekranda kısa bir "STYLE +18%" yazısı, çuvallamada kırmızı bir "BAIL".
Dürüst bir not: 4 Ekim itibarıyla numaraların fiziği, testleri ve robot animasyonları ana dalda, ama dokunmatik NUMARA düğmesi henüz girdi sistemine bağlanmadı. Yani sistem hazır, oyuncunun eli henüz ona ulaşmıyor. Güncel durumu BOINGWARD sayfasında tutuyorum.
Sık Sorulan Sorular
Oyun tasarımında risk ve ödül dengesi nasıl kurulur?
Ödülü tanımlamadan önce sınırları yazın: isteğe bağlı mı, ceza ne, en fazla ne kadar kazandırır? BOINGWARD'da numara hiçbir zaman zorunlu değil, başarısızlık kısa bir ceza, kısmi başarı ise cezasız ama ödülsüz. Tavanı da oyun modu belirliyor.
Neden ödülün bir tavanı var?
Tavansız bir ödül, parkur tasarımını kırar: oyuncu numarayla tasarımcının hiç düşünmediği bir yüksekliğe çıkar. Zaman yarışında küçük, serbest tırmanışta büyük bir tavan, aynı sistemin iki modda farklı roller oynamasını sağlıyor.
Kısmi başarıyı cezalandırmamak neden önemli?
Her başarısız deneme cezalansaydı oyuncular denemeyi bırakırdı. Tur tamamlanıp iniş biraz eğik olduğunda ödülün kaybolup cezanın gelmemesi, oyuncuyu denemeye teşvik ediyor; ceza yalnızca açıkça kötü inişe veriliyor.
İlgili Yazılar
Bir Günde 3B Oyun: Yapay Zekâ Ajanlarıyla BOINGWARD
Unity paketiyle başlayıp aynı sabah Godot'ya geçtim. Paralel Claude Code oturumlarıyla bir günde 148 commit ve telefonda oynanan bir 3B pogo oyunu çıktı.
Ölçülmüş Metriklerle Seviye Tasarımı ve Test Botu
BOINGWARD'da parkurlar ölçülmüş zıplama değerlerinden üretiliyor, bir bot her atlamayı gerçek fizikle deniyor. Madalya süreleri de bu botun koşusundan çıkıyor.
Godot'da Pogo Fiziği: Kendiliğinden Zıplayan Karakter
BOINGWARD'ın pogo fiziği: RigidBody ile otomatik zıplama, fırlatma yönü formülü, kartopu gibi büyüyen hızın ayarı ve 30, 60, 144 fps'te aynı sonucu veren test.