Atölye › Bilardo › 13/33. adım
Oyunun iki hâli var: 'aiming' (nişan alınıyor, vuruş bekleniyor) ve 'rolling' (toplar yuvarlanıyor). Şu an toplar
dururken de hareket ederken de Boşluk'a basınca vuruluyor; top daha dönerken ikinci kez vurmak olmaz.
Durumu tek bir değişkende tutacağız: state. Vuruş yalnız nişan alırken olur ve durumu 'rolling' yapar. Her karede
bir top hâlâ hareket ediyor mu diye bakacağız; hiçbiri hareket etmiyorsa yeniden 'aiming'.
```js
let state // 'aiming', 'rolling' or 'won'
state = 'aiming'
function shoot() {
if (state !== 'aiming') return
cue.vx = Math.cos(aim) * power
cue.vy = Math.sin(aim) * power
state = 'rolling'
}
function update() {
if (state !== 'rolling') return
step()
let moving = false
for (const b of balls) {
b.vx *= FRICTION
b.vy *= FRICTION
if (Math.hypot(b.vx, b.vy) < 0.05) b.vx = b.vy = 0
else moving = true
}
if (moving) return
state = 'aiming'
}
```let state → oyunun durumu; yorum alabileceği değerleri söylüyor ('won' ileride gelecek). reset içinde
state = 'aiming'.shoot içinde if (state !== 'aiming') return → nişan almıyorsak vurma; sonunda state = 'rolling'.update içinde if (state !== 'rolling') return → toplar durmuşken hesap yapma.let moving = false → "hareket eden top var mı?" bayrağı; önce yok say.else moving = true → bir topun hızı sıfırlanmadıysa hâlâ hareket ediyor demektir.if (moving) return → biri bile hareket ediyorsa bekle; state = 'aiming' → hepsi durdu, yeniden nişan.let power satırının altına yorumuyla birlikte let state ... yaz.reset içinde power = 8 satırının altına state = 'aiming' yaz.shoot içinde en üste if (state !== 'aiming') return, en alta state = 'rolling' yaz.update içinde:if (state !== 'rolling') return,step()'in altına let moving = false,if (Math.hypot(...)) ... satırının altına else moving = true,}'sinden sonra if (moving) return ve state = 'aiming'.Beceriler: Oyun durumları
← Bantlar Yuvarlanırken nişanı gizle →