Atölye › Zelda Tarzı Zindan › 5/22. adım

Duvarlar

Ne yapıyoruz

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)
      }
```

Ne işe yarıyor

Sıra sende

  1. move fonksiyonunu sil; yerine yorumlarıyla solidTile, blocked ve yeni move'u yaz.
  2. Kare çiziminde ctx.fillRect(x, y, T, T) altına kapı bloğunu yaz. Çalıştır ve bir duvara yürü.

Beceriler: Çarpışma tespiti

Tüm adımlar

  1. Bir oda
  2. Kahraman
  3. Oyun döngüsü
  4. Yürü
  5. Duvarlar
  6. Dokunmatik ped
  7. Sonraki oda
  8. Kılıç
  9. Düşmanlar
  10. Vur!
  11. Peşine düşüyorlar
  12. Dolaşıyorlar
  13. Ah
  14. Yanıp sönme ve kalpler
  15. Anahtarlar ve kalpler
  16. Hatırlayan dünya
  17. Kilitli kapı
  18. Süre
  19. Oyun bitti
  20. Çıkış merdiveni
  21. En iyi süre
  22. Kendin yap: temizlenen odalar