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.

BLOCKMAP: mudanças entre as edições

De Brdoom wiki
MegaManx3 (discussão | contribs)
Criou página com '{{doomwiki}}O propósito do '''BLOCKMAP''' é detecção de colisão. Ou seja: o blockmap é usado para calcular quando um thing em movimento bate numa parede, ou quando dois things (um ou ambos em movimento) colidem. O blockmap é basicamente uma grade de “blocos”, cada um com 128×128 unidades (o dobro do tamanho da grade do chão). Se você quiser “ver” o blockmap, abra o automapa e habilite a grade. Assim como NODES são usados para calcular quando uma l...'
 
MegaManx3 (discussão | contribs)
Sem resumo de edição
 
Linha 1: Linha 1:
{{doomwiki}}O propósito do '''BLOCKMAP''' é detecção de colisão. Ou seja: o blockmap é usado para calcular quando um thing em movimento bate numa parede, ou quando dois things (um ou ambos em movimento) colidem. O blockmap é basicamente uma grade de “blocos”, cada um com 128×128 unidades (o dobro do tamanho da grade do chão). Se você quiser “ver” o blockmap, abra o automapa e habilite a grade.
{{doomwiki}}
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.


Assim como [[NODES]] são usados para calcular quando uma linha deve ou não ser desenhada, o lump BLOCKMAP é usado para calcular colisão thing/parede. Cada bloco contém zero ou mais linedefs, normalmente poucos (certamente não tantos quanto o mapa inteiro). Então, ao detectar colisões de um thing em movimento, o engine só precisa rodar cálculos nas linedefs que estão no mesmo bloco do thing (em vez de testar o mapa inteiro).
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 também é usado para colisões thing/thing: cada bloco mantém uma lista dinâmica de todos os things contidos nele. Pelo mesmo princípio, o engine só precisa checar possíveis colisões com os things que compartilham o mesmo bloco do thing em movimento.
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.


Curiosidade: remover o blockmap de um nível (o que hoje é praticamente impossível em ports modernos, que eles constroem um blockmap em memória se ele não existir) mantém o comportamento geral igual (exibição do mapa, linha de visão dos inimigos, etc.), mas tudo pode atravessar linhas “impassíveis” e nada consegue acertar nada.
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 de como o engine original fazia os cálculos, se o centro de um thing estivesse bem na borda de um bloco e o centro de outro thing na borda do bloco adjacente, a colisão podia “passar batido”, já que os centros caíam em blocos diferentes. Esse bug acontece porque o exe original (e muitos ports) usava apenas o centro do thing para determinar em qual bloco ele estava, ignorando o raio inteiro. No ZDoom isso foi corrigido. um artigo excelente do Colin Phipps em doom2.net sobre isso.
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 [http://doom2.net/doom2/research/things.html aqui no doom2.net].


== Estrutura do BLOCKMAP ==
==Estrutura do BLOCKMAP==
Blockmaps são compostos por três partes: header, offsets e blocklist.


=== Header ===
Blockmaps são compostos por três partes: o cabeçalho, os offsets e a lista de blocos.
<code>bytes:</code>


<code>2: coordenada X da origem da grade</code>
===Cabeçalho===
<tt>bytes:<br>
2: coordenada X da origem da grade<br>
2: coordenada Y da origem da grade<br>
2: número de colunas<br>
2: número de linhas<br>
</tt>


<code>2: coordenada Y da origem da grade</code>
===Offsets===
<tt>bytes:<br>
2: offset para o bloco 0<br>
2: offset para o bloco 1<br>
        .
        .
        .
2: offset para o bloco (N - 1)<br>
</tt>


<code>2: número de colunas</code>
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).


<code>2: número de linhas</code>
'''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.


=== Offsets ===
===Listas de blocos===
<code>bytes:</code>
<tt>bytes:<br>
2: 0x0000<br>
2: linedef 0 dentro do bloco<br>
2: linedef 1 dentro do bloco<br>
        .
        .
        .
2: 0xFFFF<br>
</tt>


<code>2: offset para o bloco 0</code>
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).


<code>2: offset para o bloco 1</code>
[[Category:Glossary]]
<code>
      .<br />
      .<br />
      .<br />
</code>
<code>2: offset para o bloco (N - 1)</code>
 
Note que existem N blocos, onde N = colunas * linhas (do header). Todos os offsets são relativos ao início do lump BLOCKMAP. Esses offsets são unsigned, então podem ir até 65536 em vez de 32767 (como várias outras estruturas de WAD).
 
'''Nota:''' No código-fonte de Doom, esses offsets eram tratados como “shorts” (em unidades de 2 bytes). Então, se você estiver lendo byte-a-byte, o offset real é <code>2 * offset</code>.
 
=== Blocklists ===
<code>bytes:</code>
 
<code>2: 0x0000</code>
 
<code>2: linedef 0 dentro do bloco</code>
 
<code>2: linedef 1 dentro do bloco</code>
<code>
      .<br />
      .<br />
      .<br />
</code>
<code>2: 0xFFFF</code>
 
A blocklist sempre começa com 0 e termina com -1. No meio fica a lista de todas as linedefs que têm qualquer porção dentro do bloco. Qualquer linedef na borda entre dois blocos vai ser colocada apenas no bloco à direita da linha (para linhas verticais) e apenas no bloco acima da linha (para linhas horizontais).

Edição atual tal como às 19h15min de 14 de fevereiro de 2026

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).