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 15h05min de 15 de março de 2026 por MegaManx3 (discussão | contribs) (Criou página com '{{doomwiki|link=Polyobject|name=polyobject}}Como o uso de um {{dw|BSP}} pré-calculado para renderização força a geometria vertical do mapa a permanecer constante, é impossível mover uma estrutura nos eixos X e Y no vanilla Doom. O ZDoom resolve isso oferecendo '''PolyObjects'''. Um PolyObject normalmente consiste em um grupo de linhas unilaterais (one-sided) conectadas, contidas dentro de um único subsector. == Criando polyobjects simples == Fazer um polyobj...')
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
DoomWiki.org
For more information on this article, visit the polyobject page on the Doom Wiki.

Como o uso de um BSP pré-calculado para renderização força a geometria vertical do mapa a permanecer constante, é impossível mover uma estrutura nos eixos X e Y no vanilla Doom. O ZDoom resolve isso oferecendo PolyObjects. Um PolyObject normalmente consiste em um grupo de linhas unilaterais (one-sided) conectadas, contidas dentro de um único subsector.

Criando polyobjects simples

Fazer um polyobject é bem simples, embora possa parecer difícil no começo. Depois que você pega o jeito, dá pra fazer vários rapidinho.

Primeiro precisamos do mapa em si. Vamos fazer uma porta deslizante como polyobject (provavelmente o tipo mais fácil), então vamos precisar de duas salas com teto a 192 e um corredor central (onde os polys vão aparecer) com teto a 128. Todos os pisos ficam na altura 0.
Depois você precisa construir os polyobjects. Eles devem ficar em um setor “dummy” ou em algum lugar inacessível, porque o espaço que eles ocupam no mapa normalmente ainda é considerado bloqueado, o que pode causar situações indesejadas — por exemplo, uma porta giratória que, ao abrir, deixa uma barreira invisível no lugar. Além disso, os setores de “armazenamento” serão automaticamente ocultados no automap.

Note que os polyobjects são colunas “sólidas” de vazio, compostas apenas por linedefs de 1 lado (one-sided).

As linhas marcadas em amarelo devem ter o special Polyobj_StartLine, que recebe três argumentos: o número do polyobject, o polyobject espelhado (mirror) e o som que ele faz enquanto se move (definido em SNDSEQ). Para o poly de cima, use o número 0; e para o de baixo, use o número 1 (mas qualquer número serviria). Como esses polys vão espelhar um ao outro (as ações serão as mesmas, só que invertidas — por exemplo, o poly1 abre para a direita e o poly0 abre para a esquerda), você deve colocar o número do poly “oposto” no segundo campo. O som não é importante agora, então deixe 0.

Agora você precisa colocar as âncoras (polyobject anchors) e os start spots. Eles determinam onde os polyobjects realmente vão aparecer no mapa. Primeiro coloque as âncoras, que têm DoomEdNum 9300. Elas devem ficar dentro dos polyobjects do jeito que você desenhou no mapa (ou perto da borda), como na imagem. A coisa mais importante das âncoras é o ângulo, que deve corresponder ao número do polyobject. Então a âncora de cima tem ângulo 0 e a âncora de baixo tem ângulo 1.
Em seguida, coloque os start spots. Eles são colocados de forma parecida com as âncoras: em um local onde você quer que o polyobject apareça no jogo, relativo à âncora. Neste caso, colocamos a âncora no centro do poly, então queremos o start spot no centro de onde queremos que o poly apareça, como mostrado na imagem. Start spots têm DoomEdNum 9301, 9302 ou 9303:
9301: Polyobject normal — ele aborta o movimento se colidir com um ator.
9302: Polyobject “crush” — ele continua movendo e os atores no caminho são esmagados.
9303: Polyobject “harmful” — ele causa dano ao toque mesmo antes do ator ser esmagado.
Aqui temos a configuração completa. Note que desde o ZDoom 2.5.0, é possível ter geometria complexa para polyobjects e fazer eles se moverem para qualquer lugar do mapa. Versões anteriores tinham limitações rígidas sobre o que um polyobject podia ser e fazer. Como este exemplo já é antigo, ele mostra uma configuração bem simples.
Por fim, você provavelmente quer que os polyobjects realmente abram. Isso é bem simples: dê às “laterais largas” dos polyobjects o special Polyobj_DoorSlide, com os argumentos 0, 32, 128, 64, 105 — que são: número do polyobject, velocidade do movimento, ângulo, distância a mover e o atraso antes dos polys voltarem à posição original (em tics; 105 são 3 segundos, pois são 35 tics por segundo). Você não precisa se preocupar com o polyobject 1 neste caso, porque ele vai espelhar tudo o que o polyobject 0 fizer. Pronto — terminou!

Criando polyobjects avançados

Embora os polyobjects simples acima sejam suficientes na maioria dos casos, às vezes não dá. Por exemplo: e se você quiser um polyobject “vazado/see-through”? Nesse caso, você vai precisar usar linedefs de dois lados (two-sided). Porém, o engine não consegue criar o polyobject automaticamente nesses casos, então você precisa usar Polyobj_ExplicitLine em cada linha do polyobject.

  1. Construa seu polyobject em um setor de “armazenamento” como antes, mas transforme-o em um setor autorreferente (os dois lados do polyobject pertencem ao setor de armazenamento).
  2. Cada linha do polyobject deve ser marcada com Polyobj_ExplicitLine. Para a ordem de renderização, você pode usar o valor 1 em todas elas, já que esse parâmetro é um resquício da implementação original do Hexen.
  3. Se você quiser que algumas linhas do polyobject sejam ativáveis, você precisa dar um lineid a elas. No Hexen format, isso é feito por um dos parâmetros do Polyobj_ExplicitLine; no UDMF isso é uma das propriedades do linedef. Depois, você vai precisar de um script OPEN em ACS chamando SetLineSpecial no lineid escolhido para atribuir um special diferente.
  4. Como o polyobject agora é two-sided, garanta que ele realmente tenha uma textura no middle!
  5. O setor de armazenamento deve ter as mesmas alturas de piso e teto do setor de destino — não porque o engine exija, mas porque isso facilita MUITO ajustar os offsets verticais das texturas do polyobject. Use o flag “lower unpegged” se você quer que o polyobject encoste no chão.
  6. Dê às linhas do polyobject o flag de "3D middle texture" para que ele tenha uma caixa de colisão vertical finita. Note que o setor de armazenamento do polyobject será usado como referência para checar se há espaço acima/abaixo dele, e não o setor onde ele realmente está!

Personalizando o dano de polyobjects

Arquivo:Polyobject Damage.png

Para mudar o dano exato que polyobjects do tipo “crushing” e “hurts-to-touch” causam a cada toque em um ator, você precisa (no Ultimate Doom Builder ou no GZDoom Builder (Bugfix)) ir na aba Action/Tag/Misc das coisas âncora (anchors) e alterar o valor de health das âncoras — do mesmo jeito que polyobjects são ligados entre si usando o ângulo do start spot e das âncoras.

O health padrão 1 significa que o polyobject usa o dano padrão dele, que é 3. Qualquer valor acima de 1 mata instantaneamente qualquer coisa no caminho. E valores negativos definem o dano exato que o polyobject causa em cada impacto. Por exemplo, health = -10 causa 10 de dano por hit em vez de 3.

Veja também

Para specials relacionados a PolyObjects, veja:

Para scripting com PolyObjects: