PolyObjects
Mais ações
Como o uso de um
BSP pré-calculado para renderização força a geometria vertical do nível a permanecer constante, é impossível mover uma estrutura nos eixos X e Y no vanilla Doom. O ZDoom resolve esse problema fornecendo PolyObjects. Um PolyObject normalmente consiste em um grupo de linhas de um lado (one-sided) conectadas, contidas em um único subsector.
Creating simple polyobjects
Fazer um polyobject é bem simples, embora possa parecer difícil no começo. Depois que você pega o jeito, vai conseguir criar vários rapidinho.
| Primeiro, precisamos do mapa em si. Vamos fazer um polyobject de porta deslizante (provavelmente o tipo mais fácil), então vamos precisar de duas salas com altura de teto 192 e um corredor no meio (onde os polys vão aparecer) com teto 128. Todos os pisos estão na altura 0. | |
| Em seguida, você precisa construir os polyobjects. Você deve colocá-los em um setor “dummy” ou em outro lugar inacessível porque o espaço que eles ocupam no mapa geralmente ainda será considerado bloqueado, resultando em situações indesejadas, como uma porta giratória que deixa uma barreira invisível quando aberta. 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 de linedefs de 1 lado. As linhas marcadas em amarelo devem ser | |
| Agora você precisa colocar as âncoras e os start spots dos polyobjects. Eles determinam onde os polyobjects realmente serão posicionados no mapa. Primeiro coloque as âncoras (DoomEdNum 9300). Elas devem ser colocadas dentro dos polyobjects como você os desenhou no mapa (ou perto da borda), como na imagem. A única coisa realmente importante sobre as âncoras é o ângulo, que deve corresponder ao número do polyobj. Então, a âncora de cima tem ângulo 0 e a âncora logo abaixo tem ângulo 1. | |
Em seguida, colocamos 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 em relação à âncora. Então, neste caso colocamos a âncora no centro do poly e, por isso, 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:
| |
| Aqui temos a configuração completa. Note que desde o ZDoom 2.5.0, você pode ter geometria complexa para polyobjects e fazê-los se mover 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: basta dar aos lados largos dos polyobjects o especial Polyobj_DoorSlide, com os argumentos 0, 32, 128, 64, 105 que são: número do polyobj, velocidade de movimento, angle, distância para mover e atraso antes dos polys voltarem à posição original (em tics; 105 é 3 segundos (35 tics por segundo)). Você não precisa se preocupar com o polyobject 1 neste caso porque ele vai espelhar o que o polyobject 0 fizer. Pronto, terminou!
|
Creating advanced polyobjects
Embora os polyobjects simples explicados acima sejam suficientes na maioria dos casos, às vezes eles não bastam. E se você quiser um polyobject “vazado” (see-through), por exemplo? Aí 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.
- Construa seu polyobject em um setor de armazenamento como antes, mas transforme-o em um setor auto-referenciado (os dois lados do polyobject vão pertencer ao setor de armazenamento).
- Cada linha do polyobject é 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.
- Se você quiser que algumas linhas do polyobject sejam ativáveis, você precisa dar a elas um lineid. No Hexen format, isso é feito com um dos parâmetros de Polyobj_ExplicitLine; no UDMF é uma das propriedades de linedef. Depois, você vai precisar ter um script OPEN em ACS chamando SetLineSpecial) no lineid escolhido para dar a ele um especial diferente.
- Como o polyobject agora é de dois lados, certifique-se de que ele realmente tenha uma textura do meio (middle texture)!
- 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 para o modder ajustar os offsets verticais das texturas do polyobject. Use a flag “lower unpegged” se você quiser que o polyobject apareça no chão.
- Dê às linhas do polyobject a flag de "3D middle texture" para dar a ele 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 ou abaixo dele, não o setor em que ele está de fato!
Customizing the damage of polyobjects
Para mudar o dano exato que polyobjects do tipo esmagador e “dano ao toque” causam toda vez que encostam em um ator, você deve (no Ultimate Doom Builder ou no GZDoom Builder (Bugfix)) ir na aba Action/Tag/Misc das âncoras e mudar 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 de 1 significa que o polyobject usa o dano padrão de 3. Qualquer valor acima de 1 mata instantaneamente qualquer coisa que ficar no caminho. E valores negativos definem o dano exato que o polyobject causa a cada impacto. Por exemplo, um health de -10 vai causar 10 de dano por batida em vez de 3.
See also
Para specials relacionados a PolyObjects, veja os seguintes tópicos:
- Polyobj_DoorSlide
- Polyobj_DoorSwing
- Polyobj_ExplicitLine
- Polyobj_Move
- Polyobj_MoveTimes8
- Polyobj_MoveTo
- Polyobj_MoveToSpot
- Polyobj_OR_Move
- Polyobj_OR_MoveTimes8
- Polyobj_OR_MoveTo
- Polyobj_OR_MoveToSpot
- Polyobj_OR_RotateLeft
- Polyobj_OR_RotateRight
- Polyobj_RotateLeft
- Polyobj_RotateRight
- Polyobj_StartLine
- Polyobj_Stop
- GetPolyobjX
- GetPolyobjY
Para scripting com PolyObjects:
