Atölye › Pinball › 13/42. adım
Duvarlarımız ince çizgiler. Top bir karede 16 piksel giderse, bir karede duvarın önünde, sonrakinde arkasında olabilir; aradaki anı hiç görmeyiz ve top duvardan geçer. Hızlı bir arabanın fotoğrafını saniyede bir çekmek gibi.
Çözüm iki parça:
SUB) bölmek: top her seferinde hızının dörtte biri kadar gider ve her küçük
adımda duvarlar denenir.MAX_SPEED. Böylece en hızlı top bile küçük adımda duvarı atlayamaz.```js
const SUB = 4 // physics steps per frame
const MAX_SPEED = 18
function step() {
ball.vy += GRAVITY / SUB
ball.x += ball.vx / SUB
ball.y += ball.vy / SUB
for (const w of WALLS) hitSegment(w[0], w[1], w[2], w[3], 0.5)
}
function update() {
for (let i = 0; i < SUB; i++) step()
const speed = Math.hypot(ball.vx, ball.vy)
if (speed > MAX_SPEED) {
ball.vx *= MAX_SPEED / speed
ball.vy *= MAX_SPEED / speed
}
}
```const SUB = 4 → her karede kaç küçük fizik adımı.const MAX_SPEED = 18 → en yüksek hız (piksel/kare).function step() { → eski update'in içi, ama her şey SUB'a bölünmüş: yerçekiminin dörtte biri, hareketin
dörtte biri. Dört küçük adım toplamda yine aşağı yukarı bir kare eder.for (let i = 0; i < SUB; i++) step() → sayan bir döngü: i 0'dan başlar, i < SUB doğru olduğu sürece
step()'i çağırır, her turda i++ ile 1 artar. i 0, 1, 2, 3: dört tur.const speed = Math.hypot(ball.vx, ball.vy) → hızın büyüklüğü (yatay ve dikey hızdan Pisagor ile).if (speed > MAX_SPEED) { → sınırı aşıyorsa:ball.vx *= MAX_SPEED / speed → *= "şununla çarp". İki hız da aynı oranla küçülür; top aynı yöne ama
tam MAX_SPEED hızla gider.const GRAVITY = ... satırının altına SUB ve MAX_SPEED satırlarını yaz.update fonksiyonunun tamamını sil; yerine step fonksiyonunu ve yeni update fonksiyonunu yaz (aralarında
bir boş satır).Beceriler: Hız ve yerçekimi, Döngüler
← Duvardan sek Hazır mı, oyunda mı →