Atölye › Flappy tarzı kuş › 28/30. adım
Oyunda gizli bir hata var. requestAnimationFrame ekran her yenilendiğinde bir kez çalışır. Çoğu ekran saniyede 60
kez yenilenir, ama birçok telefon ve oyun monitörü 120 ya da 144 kez. update her karede bir kez çalıştığı için
120 Hz'lik ekranda kuş iki kat hızlı düşer; yavaş bir bilgisayarda ise oyun ağır çekimde oynar.
Çözüm: fiziği ekrandan ayırmak. Bir zaman kumbarası tutacağız: her karede gerçekten geçen süreyi kumbaraya
atacağız, kumbarada bir adımlık süre (1/60 saniye) oldukça bir update harcayacağız.
```js
const STEP = 1000 / 60 // one physics step, in milliseconds
let last = 0
let lag = 0
function loop(time) {
// Run the physics at a fixed 60 steps per second, whatever the screen's refresh rate.
lag += time - last
last = time
while (lag >= STEP) {
update()
lag -= STEP
}
draw()
```const STEP = 1000 / 60 → bir fizik adımı: 1 saniye = 1000 milisaniye; 1000 / 60 ≈ 16,7 ms.let last = 0 → bir önceki karenin zamanı. let lag = 0 → kumbarada biriken süre.function loop(time) → tarayıcı loop'u çağırırken ona şu anki zamanı (ms) verir.lag += time - last → son kareden beri geçen süreyi kumbaraya at. last = time → şimdiki zamanı hatırla.while (lag >= STEP) { ... } → while döngüsü: "koşul doğru olduğu sürece tekrarla". Kumbarada bir
adımlık süre oldukça bir update yap ve o süreyi (lag -= STEP) kumbaradan çıkar. Her turda lag azaldığı için
döngü mutlaka biter.update iki karede bir çalışır.update her karede iki kez çalışır.draw() → while'ın dışında: fizik kaç adım atarsa atsın, ekrana bir kez çizeriz.function loop() { satırının üstüne STEP, last ve lag satırlarını ve bir boş satır yaz.loop'u kodda görüldüğü gibi değiştir: parantez içine time; yorum, lag, last satırları; update() çağrısı
while döngüsünün içine. draw() ve requestAnimationFrame(loop) aynı kalır.Beceriler: Oyun döngüsü, Hız ve yerçekimi
← Rekoru göster Aradan sonra telafi yok →