Atölye › Zelda Tarzı Zindan › 8/22. adım
Boşluk (ya da pedin dışına bir dokunuş) kılıcı 12 kare boyunca sallasın. Kılıç kahramanın baktığı yönde, önünde bir kutu. Sallarken kahraman durur; Boşluk'u basılı tutmak kılıcı tekrar tekrar sallamaz.
```js
let swing // frames left of the sword swing
swing = 0
if (DIRS[event.key] || event.key === ' ') event.preventDefault()
if (event.key === ' ' && !event.repeat) {
if (swing === 0) swing = 12
}
else if (swing === 0) swing = 12
// The sword: a box from the middle of the player out to 30 pixels in front, so it also hits an enemy right on top of you.
function swordBox() {
const [dx, dy] = player.dir
const cx = player.x + SIZE / 2 + dx * 15
const cy = player.y + SIZE / 2 + dy * 15
const w = dx ? 30 : 8
const h = dy ? 30 : 8
return { x: cx - w / 2, y: cy - h / 2, w, h }
}
if (dir && swing === 0) {
if (swing > 0) swing -= 1
if (swing > 0) {
const s = swordBox()
ctx.fillStyle = '#e5e7eb'
ctx.fillRect(s.x, s.y, s.w, s.h)
}
```!event.repeat → basılı tutulan tuşun otomatik tekrarları değil, yalnız gerçek basış sallar.if (swing === 0) → sallama sürerken yeniden başlamasın.swordBox → kılıcın ortası kahramanın ortasından baktığı yöne 15 piksel ötede; baktığı yönde 30, yanlara 8 piksel.
dx ? 30 : 8 → yana bakıyorsa (dx 0 değil) geniş, değilse dar.dir && swing === 0 → sallarken yürünmez.swing -= 1 her karede; 0'a inince kılıç kaybolur.const held satırının üstüne swing, reset'in en üstüne swing = 0 yaz.keydown'da preventDefault satırına Boşluk'u ekle ve altına sallama bloğunu yaz; dokunmada ped satırının altına
else if satırını yaz.update'in üstüne swordBox yaz; if (dir) → if (dir && swing === 0); update'in sonuna geri sayım satırını
yaz.draw'da ctx.restore() satırının üstüne kılıç bloğunu yaz. Çalıştır ve Boşluk'a bas.Beceriler: Klavye ve fare girdisi, Oyun durumları