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

Zelda Tarzı Zindan: Bir oda

Dört odayı keşfet, kılıçla savaş, anahtarı bul, kapıyı aç ve kaç. Metin olarak yazılan odalar, duvar boyunca yürüyüp kaymak, odalar arasında geçiş, bir kılıç çarpışma kutusu, dolaşan ve kovalayan düşmanlar, kalpler, anahtarlar ve aldıklarını hatırlayan bir dünya.

Ne yapıyoruz

Zelda tarzı bir zindan yapıyoruz: dört odada gez, kılıçla dövüş, anahtarı bul, kapıyı aç ve merdivenden kaç. Sonunda nasıl olacağını Bitmiş hâlini gör ile görebilirsin.

Önce dünya: yazıyla çizilmiş dört oda, her biri 15 kare genişliğinde ve 11 kare yüksekliğinde, 2'ye 2 dizilmiş. Harita uzun ama sadece bir çizim; dikkatle kopyala. İlk odayı yükleyip kare kare çiziyoruz; üstte kalp ve anahtarlar için bir şerit boş kalıyor.

```js
const canvas = document.getElementById('game')
const ctx = canvas.getContext('2d')

const T = 32 // one tile
const TOP = 48 // room for hearts, keys and the timer
// Four rooms, in a 2 by 2 grid. # wall, D locked door, k key, h heart, e enemy, E the stairs out, P the start.
// A gap in the wall at the edge of a room leads to the room next to it.
const ROOMS = [
  [
    [
      '###############',
      '#.............#',
      '#..P..........#',
      '#....###......#',
      '#....#.....e..#',
      '#....#.........',
      '#.............#',
      '#..........h..#',
      '#.............#',
      '#.............#',
      '#######.#######',
    ],
    [
      '###############',
      '#.............#',
      '#..e......e...#',
      '#....#####....#',
      '#.............#',
      '..............#',
      '#.............#',
      '#...##...##...#',
      '#.......e.....#',
      '#.............#',
      '#######D#######',
    ],
  ],
  [
    [
      '#######.#######',
      '#.............#',
      '#..e..........#',
      '#...#######...#',
      '#.............#',
      '#.....k.......#',
      '#.............#',
      '#...#######...#',
      '#..........e..#',
      '#.............#',
      '###############',
    ],
    [
      '#######.#######',
      '#.............#',
      '#.e.........e.#',
      '#.............#',
      '#....#####....#',
      '#....#.E.#....#',
      '#....#...#....#',
      '#.............#',
      '#......e......#',
      '#.............#',
      '###############',
    ],
  ],
]
const COLS = 15
const ROWS = 11

let tiles // the current room, as arrays of characters we can change (doors open, keys are picked up)
let room // { rx, ry }: which room we are in

function enter(rx, ry) {
  room = { rx, ry }
  tiles = ROOMS[ry][rx].map((line) => [...line].map((ch) => (ch === 'P' || ch === 'e' ? '.' : ch)))
}

function draw() {
  ctx.fillStyle = '#0c0a09'
  ctx.fillRect(0, 0, canvas.width, canvas.height)

  ctx.save()
  ctx.translate(0, TOP)
  tiles.forEach((line, row) => {
    line.forEach((ch, col) => {
      const x = col * T
      const y = row * T
      ctx.fillStyle = ch === '#' ? '#57534e' : '#d6c7a1'
      ctx.fillRect(x, y, T, T)
    })
  })
  ctx.restore()
}

enter(0, 0)
draw()
```

Ne işe yarıyor

Sıra sende

Satırları yorum satırlarının altına yaz (haritayı dikkatle) ve Çalıştır'a bas: ilk oda görünmeli.

Beceriler: Canvas üzerine çizim, Diziler ve nesneler

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