Atölye › Pinball › 17/42. adım
İki daire ne zaman birbirine değer? Merkezleri arasındaki uzaklık, iki yarıçapın toplamından küçükse. İki
bozuk parayı masada birbirine yaklaştırmayı düşün: kenarları merkezler arası r + R olduğunda değer.
Duvarda olduğu gibi, değen topu dışarı iteceğiz. Burada normal daha da kolay: tamponun merkezinden topun merkezine giden yön.
```js
function hitBumper(b) {
const dx = ball.x - b.x
const dy = ball.y - b.y
const d = Math.hypot(dx, dy)
if (d >= b.r + R) return
const nx = dx / d
const ny = dy / d
ball.x = b.x + nx * (b.r + R)
ball.y = b.y + ny * (b.r + R)
}
BUMPERS.forEach(hitBumper)
```dx, dy → tamponun merkezinden topun merkezine giden ok; d onun uzunluğu, yani iki merkez arası uzaklık.if (d >= b.r + R) return → uzaklık iki yarıçapın toplamından küçük değilse değmiyorlar: bir şey yapmadan çık.nx = dx / d, ny = dy / d → oku 1 piksel uzunluğa indir: tampondan dışarı bakan normal.ball.x = b.x + nx * (b.r + R) → topu merkezden bu yönde tam b.r + R uzağa koy: tampona tam değiyor.BUMPERS.forEach(hitBumper) → step içinde her tamponu dene. forEach'e bir fonksiyonun adını verdik;
o da hitBumper'ı her tamponla kendisi çağırır: hitBumper(BUMPERS[0]), hitBumper(BUMPERS[1]), ...hitBumper fonksiyonunu function step() { satırının üstüne yaz; altında bir boş satır kalsın.step içinde duvarları deneyen for (const w of WALLS) ... satırının altına BUMPERS.forEach(hitBumper) yaz.Beceriler: Çarpışma tespiti