Ativa o menu
Alternar menu de preferências
Alternar menu pessoal
Não autenticado(a)
Your IP address will be publicly visible if you make any edits.
Revisão de 19h15min de 14 de fevereiro de 2026 por MegaManx3 (discussão | contribs)
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
DoomWiki.org
For more information on this article, visit the BLOCKMAP page on the Doom Wiki.

O propósito do blockmap é a detecção de colisão. Ou seja, o blockmap é usado para calcular quando uma coisa em movimento bate em uma parede ou quando duas coisas (uma ou ambas em movimento) colidem. O blockmap é simplesmente uma grade de “blocos”, cada um com 128x128 unidades (ou o dobro do tamanho da grade do piso). Se você quiser ver o blockmap, basta olhar o automapa e habilitar a grade.

De forma semelhante a como NODES são usados para calcular quando uma linha deve ou não ser desenhada, o lump BLOCKMAP é usado para calcular colisão coisa/parede. Cada bloco contém zero ou mais linedefs, embora normalmente não muitas (e certamente não tantas quanto o mapa inteiro), e então, ao detectar colisões de uma coisa em movimento, ele só precisa fazer cálculos em cada linedef no mesmo bloco da coisa em movimento (em vez do mapa inteiro).

Internamente, o blockmap é usado para colisões coisa/coisa, com cada bloco mantendo uma lista dinâmica de todas as coisas contidas nele. Usando o mesmo princípio das colisões coisa/parede, o motor só precisa checar colisões possíveis com cada coisa que compartilha o mesmo bloco da coisa em movimento.

Curiosamente, remover o blockmap de um nível (embora isso seja praticamente impossível com a maioria dos ports modernos, que vão construir um blockmap em memória se um estiver ausente) vai manter o comportamento de todo o resto igual (exibição do mapa, linha de visão dos inimigos e assim por diante), mas tudo poderá atravessar linhas intransponíveis e nada conseguirá acertar nada mais.

Também vale notar que, por causa da forma como o motor original fazia os cálculos, se o centro de uma coisa estivesse bem na borda de um bloco e o centro de outra coisa estivesse na borda de um bloco adjacente, essa colisão seria ignorada, já que ambas as coisas “estavam” em blocos diferentes. Esse bug, que sem dúvida muitos de vocês conhecem, é resultado do executável original (e sem dúvida muitos ports atuais) usar apenas o centro de uma coisa para determinar em qual bloco ela está, sem levar em conta todo o seu raio. Você deve notar que esse bug foi corrigido no ZDoom. Existe um artigo excelente escrito por Colin Phipps que você pode encontrar aqui no doom2.net.

Estrutura do BLOCKMAP

Blockmaps são compostos por três partes: o cabeçalho, os offsets e a lista de blocos.

Cabeçalho

bytes:
2: coordenada X da origem da grade
2: coordenada Y da origem da grade
2: número de colunas
2: número de linhas

Offsets

bytes:
2: offset para o bloco 0
2: offset para o bloco 1
. . . 2: offset para o bloco (N - 1)

Note que existem N blocos, o que é igual a colunas * linhas (do cabeçalho). Todos os offsets são relativos ao início do lump BLOCKMAP. Esses offsets também são sem sinal (unsigned), o que significa que podem chegar até 65536 em vez de 32767 (como a maioria das outras estruturas de WAD).

Nota: Esses offsets no código-fonte do Doom usavam shorts para iterar pela lista, em vez de bytes. Portanto, o offset real, se você estiver lendo byte a byte, é 2 * offset.

Listas de blocos

bytes:
2: 0x0000
2: linedef 0 dentro do bloco
2: linedef 1 dentro do bloco
. . . 2: 0xFFFF

A lista de blocos sempre começa com 0 e termina com -1. Entre eles há uma listagem de todas as linedefs que têm qualquer porção dentro do bloco. Qualquer linedef na borda de dois blocos será colocada apenas no bloco do lado direito da linha (para linhas verticais) e apenas no bloco acima da linha (para linhas horizontais).