Problem

Bir uygulamayı yarım bırakabilirsin — eksik ekran görünmez, kimse fark etmez. Bir oyunu bırakamazsın: kare döngüsü, çarpışma, zorluk eğrisi, skor, ölüm, yeniden başlama ve menü hepsi çalışmadan ortada oynanacak hiçbir şey olmaz. Bu yüzden oyunu, "bitirmek" fiilini test etmek için seçtim.

İkinci soru daha teknikti: hazır bir oyun motoru kullanmadan, sadece React Native'in kendi çizim ve animasyon araçlarıyla akıcı bir oyun döngüsü kurulabilir mi?

Çözüm

Motor yok: her top ve oyuncu, konumu her karede güncellenen sıradan bir görünüm. Döngü requestAnimationFrame üzerinde çalışıyor ve iki şeyi doğru yapıyor — hareketi geçen süreye göre ölçekliyor (yavaş cihazda oyun yavaşlamıyor, sadece adımlar büyüyor) ve bu ölçeği bir üst sınırla kesiyor, böylece uygulama arka plandan dönerken toplar duvarların içinden geçip ışınlanmıyor.

Çarpışma, çizilen kutunun değil, ondan kasten daha küçük tutulmuş bir dairenin merkez mesafesiyle ölçülüyor: oyuncu gözüyle "kıl payı kurtuldum" hissi, matematiksel olarak gerçekten kurtulmuş olmaktan daha önemli. Aynı ölçüm ikinci bir işi daha yapıyor — belli bir mesafeden yakın geçen her top skoru artırıyor ve yavaş çekim göstergesini dolduruyor. Yani oyunun ödül sistemi, kaçmayı değil az kalsın çarpmayı ödüllendiriyor.

Zorluk tek bir çarpanla değil, dört ayrı eksende artıyor: seviye eşikleri (önce doğrusal, sonra hızlanan bir eğri), top hızı, seviye ilerledikçe açılan yeni top tipleri (peşinden gelen avcı, ikiye bölünen, hızlı) ve sürekli daralan arena. Dördü ayrı ayrı ayarlanabiliyor, çünkü "oyun zorlaştı" ile "oyun sıkıcı biçimde imkansızlaştı" arasındaki fark bu ayarların birbirine oranında.

Teknoloji

Expo / React NativerequestAnimationFrame Döngüsü Animated APIPanResponderMotorsuz Render

Öne Çıkan Detay

Kontrol şeması küçük ama belirleyici bir karar: parmağını nereye koyarsan koy, karakter oraya ışınlanmıyor — dokunduğun andan itibaren parmağının farkı kadar kayıyor. Böylece parmağın hiçbir zaman karakterin üstünü kapatmıyor, ki dar bir arenada görüşünü kapatmak doğrudan ölüm demek. Aynı hareket, arenanın o anki (daralmış) sınırlarına da kırpılıyor.

Dürüst olmak gerekirse projenin en zayıf yeri de burada görünüyor: simülasyon her karede yeniden çizim tetikliyor ve en yüksek skor kalıcı olarak saklanmıyor — uygulama kapanınca rekor sıfırlanıyor. Bunları "yapılacaklar" diye kapatmak yerine burada yazmayı tercih ediyorum; bir projenin sınırını bilmek, olmayan bir mükemmelliği iddia etmekten daha kullanışlı.

Ekranlar

DodgeArena'nın menü ekranı — parlayan Dodge Arena logosu, oyuncu karakteri, Oyna düğmesi, karaktere kendi fotoğrafını ekleme seçeneği ve iyi/kötü toplanabilirleri ayıran açıklama kutuları
Menü — iyi ve kötü toplanabilirler baştan açıkça listeleniyor.
DodgeArena'nın oyun sonu ekranı — Game Over başlığı, sayarak yükselen puan, yeni rekor rozeti, tekrar oyna ve menü düğmeleri, altta ulaşılan seviye ile en iyi skor satırı
Oyun sonu — puan sayarak yükseliyor, seviye ve rekor altta.

Benzer bir problemi konuşalım

Kapsamı belirsiz bir ürün fikri ya da dijitalleşmesi gereken bir süreç varsa, bir e-posta yeterli.