Atölye › Zelda Tarzı Zindan › 5/22. adım
Duvarlar # ve kilitli kapılar D gövdeleri durdursun. blocked 22 piksellik bir kutunun dört köşesine bakıyor.
move yana ve aşağı hareketi ayrı ayrı deniyor: gövde duvara yapışmak yerine duvar boyunca kayar; durdurulup
durdurulmadığını da söylüyor. Kapılar kahverengi çiziliyor.
```js
const solidTile = (ch) => ch === '#' || ch === 'D'
// Does a box at (x, y) overlap a wall? Outside the room counts as open, so the player can walk out of a gap.
function blocked(x, y) {
for (const [cx, cy] of [[x, y], [x + SIZE - 1, y], [x, y + SIZE - 1], [x + SIZE - 1, y + SIZE - 1]]) {
const row = Math.floor(cy / T)
const col = Math.floor(cx / T)
if (row >= 0 && row < ROWS && col >= 0 && col < COLS && solidTile(tiles[row][col])) return true
}
return false
}
// Move a body, one axis at a time, stopping at walls. Returns true if it was stopped.
function move(body, dx, dy) {
let stopped = false
if (blocked(body.x + dx, body.y)) stopped = true
else body.x += dx
if (blocked(body.x, body.y + dy)) stopped = true
else body.y += dy
return stopped
}
if (ch === 'D') {
ctx.fillStyle = '#92400e'
ctx.fillRect(x + 2, y + 2, T - 4, T - 4)
}
```x ve x + SIZE - 1'de (gövdenin son pikseli), y için de aynısı.Math.floor(cy / T) → pikselden kare numarası.row >= 0 && row < ROWS && ... → oda dışı duvar sayılmaz: duvardaki boşluk dışarı açılır; sonraki adımda
oradan başka odaya geçeceğiz.move → önce yana, sonra (belki yeni x'le) aşağı; kapalıysa o payı yapma. stopped → bir yerde durduruldu mu;
düşmanlar duvara çarpınca dönmek için kullanacak.move fonksiyonunu sil; yerine yorumlarıyla solidTile, blocked ve yeni move'u yaz.ctx.fillRect(x, y, T, T) altına kapı bloğunu yaz. Çalıştır ve bir duvara yürü.Beceriler: Çarpışma tespiti