Atölye › Pinball › 30/42. adım
Dene: paletin üstünde duran topa palet kalkınca top neredeyse kıpırdamıyor. Neden? Sekme hesabı yalnız topun hızına bakıyor; top ise duruyordu. Palet onu yolundan itiyor ama fırlatmıyor.
Çözüm göreli hız: sekmeyi "topun hızı eksi duvarın o noktadaki hızı"na göre yapmak. Yürüyen bir otobüste topa vurmak gibi düşün: önemli olan topun otobüse göre hızıdır. Duvar topa doğru hızla geliyorsa, top dursa bile duvara göre hızla çarpıyor demektir ve hızla seker.
hitSegment'e isteğe bağlı altıncı bir parametre ekliyoruz: surface (yüzey). Bu bir fonksiyon: ona bir
nokta verirsin, sana yüzeyin o noktadaki hızını söyler. Duvarlar onu vermez (kıpırdamazlar); paletler bir sonraki
adımda verecek.
```js
// Push the ball out of a segment and bounce it. `surface` is how fast the segment itself moves at that point:
// the bounce works on the speed of the ball relative to the surface, which is how a flipper throws the ball.
function hitSegment(x1, y1, x2, y2, bounce, surface) {
const sx = surface ? surface(px, py).x : 0
const sy = surface ? surface(px, py).y : 0
const vn = (ball.vx - sx) * nx + (ball.vy - sy) * ny
```surface → altıncı parametre, bir fonksiyon. Fonksiyonlar da sayı ya da yazı gibi bir yerden bir yere
verilebilir.undefined (tanımsız) olur ve bir koşulda yanlış sayılır.const sx = surface ? surface(px, py).x : 0 → yüzey fonksiyonu varsa onu en yakın nokta (px, py) ile çağır
ve dönen hızın x'ini al; yoksa 0 (yüzey duruyor).const vn = (ball.vx - sx) * nx + (ball.vy - sy) * ny → artık topun kendi hızı değil, yüzeye göre hızı.vn eksi, top seker ve yüzeyin
hızını alıp yukarı gider.vx/vy satırları da aynı kalır.hitSegment'in üstündeki tek satırlık yorumu koddaki iki satırla değiştir; bounce parametresinin arkasına
, surface ekle.hitSegment içindeki const vn = ball.vx * nx + ball.vy * ny satırını sil; yerine koddaki üç satırı yaz.
(hitBumper içindeki aynı görünen satıra dokunma.)Beceriler: Hız ve yerçekimi, Fonksiyonlar