Полиобъекты

Материал из DoomDev

(Различия между версиями)
Перейти к: навигация, поиск
 
-
''[Этот раздел с небольшими изменениями взят из официальных спецификаций Hexen]''
+
Так как для рендеринга используются предварительно рассчитанные [[BSP]], то в ванильном Doom невозможно передвигать конструкции уровня по X и Y координатам. В ZDoom эту проблему решает поддержка полиобъектов. Полиобъект - группа односторонних линий, содержащихся в одном субсекторе.
-
Полиобъекты – это односторонние линии, которые строятся на карте где-то в другом месте, а затем при загрузке уровня преобразуются в желаемые точки появления на карте.
+
----
 +
Создавать полиобъекты несложно, когда вы понимаете как это делается. Конечно, первое время, их создание может казаться сложным.
-
При построении полиобъектов можно использовать два различных спецификатора линий, определяющих порядок рисования линий:
+
<table border="0">
 +
<tr><td><center>
 +
[[Image:Poly01.png]]
 +
</center></td><td>
 +
Для начала нам нужна сама карта. Я буду создавать скользящие двери (наверное, самый простой тип полиобъектов), поэтому нам нужно две комнаты с высотой потолка 192 и коридором между ними (где и появятся полиобъекты) с высотой потолка 128. Пол везде находится на высоте 0.
 +
</td></tr>
 +
<tr><td><center>
 +
[[Image:Poly02.png]]
 +
</center></td><td>
 +
Теперь нужно создать полиобъекты. Их можно разместить в любой точке карты (как вы увидите позже ZDoom сам перенесет их в точку появления), но для простоты их лучше всего разместить рядом с местом, где они появятся. Если вам нравится, можно поместить их в пустой сектор, но, наверное, самое лучшим местом для них будет сектор, где они и должны появиться (особенно, если вы пользуетесь [[Doom Builder]], в котором нет автопереноса полиобъектов в точку появления в 3D-режиме). Для простоты в этом примере я разместил их в пустом секторе. Обратите внимание, что полиобъекты - твердые колонны, состоящие только из односторонних линий.
 +
<br><br>
 +
Линии, помеченные желтым, должны иметь спецификатор <tt>[[Polyobj_StartLine]]</tt>, который принимает три аргумента: номер полиобъекта, номер полиобъекта-зеркала и звук, издаваемый при движении (определяется в [[SNDSEQ]]). Верхний полиобъект должен иметь номер 0, нижний - 1 (подойдет любое число от 0 до 255). Так как эти полиобъекты должны "отражать" движения друг друга (полиобъект1 должен открываться направо, а полиобъект0 должен открываться налево), то в поле "зеркало" нужно ставить номер противоположного полиобъекта. Звук нам пока не важен, поэтому пусть останется 0.
 +
</td></tr>
 +
<tr><td><center>
 +
[[Image:Poly03.png]]
 +
</center></td><td>
 +
Далее нужно разместить якоря полиобъектов и точки появления. Они определяют, где полиобъект фактически будет размещен на карте (то есть, куда ZDoom перенесет их при запуске карты). Сначала поместим на карту якори, они имеют [[DoomEdNum]] 9300. Они должны находиться внутри полиобъектов (или близко к их краям), как показано на картинке. Важный параметр якоря - угол, значение этого параметра должно быть равно номеру полиобъекта. То есть якорь сверху должен иметь угол 0, а якорь внизу - 1.
 +
</td></tr>
 +
<tr><td><center>
 +
[[Image:Poly04.png]]
 +
</center></td><td>
 +
Следующим пунктом мы расставим точки появления. Это делается похоже на якори: в точках, где полиобъекты должны появиться в игре относительно якоря. То есть мысленно переносим полиобъекты вместе с их якорями в нужное место и ставим точки появления там, где оказались якори. Точки появления имеют [[DoomEdNum]] 9301 и 9302, если полиобъект должен наносить ущерб прищемлением.
 +
</td></tr>
 +
<tr><td><center>
 +
[[Image:poly05.png]]
 +
</center></td><td>
 +
Теперь начинается сама хитрая и самая важная часть. Каждый полиобъект должен появляться в собственном [[субсектор]]е. Даже если вы не знаете, что это такое, это не сильно помешает при создании полиобъектов. В общем неплохо делать так, чтобы каждый полиобъект был в отдельном секторе или разместить линию между ними (как в нашем примере). Кроме того, субсектор, в котором появится полиобъект, должен быть выпуклым. А чтобы субсектор (или сектор) был выпуклым, он должен быть похож на круг или квадрат. Думаю, в чуть более научных терминах выпуклость означает, что любую точку фигуры можно соедить с любой другой точки фигуры (но не на том же отрезке) не пересекая других ее линий. Впрочем, если размещать полиобъекты в прямоугольных секторах, то проблем не должно возникнуть.
 +
Обратите внимание, на изменения, которые я произвел на карте. Добавлены "отводы" там, куда будут смещать полиобъекты, что предотвратит их смещение в пустоту и не позволит им просачиваться (что было бы самым худшим).
 +
</td></tr>
 +
<tr><td><center>
 +
[[Image:Poly06.png]]
 +
</center></td><td>
 +
Наконец, полиобъекты должны открываться. Это делается очень просто: широкие бока полиобъекта должны иметь спецификатор <tt>[[Polyobj_DoorSlide]]</tt> и аргументы 0, 32, 128, 64, 105 (номер полиобъекты, скорость, направление ([[байтовый угол]]) и расстояние перемещения) и время задержки перед возвращением назад (в тиках, 105 - 3 секунды*35 тиков в секунде). О полиобъекте 1 беспокоиться не нужно, так как он отражает действия полиобъекта 0. Вот и всё!
 +
</td></tr>
 +
</table>
-
Polyobj_ExplicitLine(polyNumber, orderNumber, polyMiror, sound);
+
<center>[[Image:Polyexample.zip|Пример (729 байт)]]</center>
-
Polyobj_StartLine (polyNumber, polyMirror, sound);
+
-
Каждый полиобъект должен иметь уникальный '''polyNumber''', используемый в спецификаторах линий полиобъектов, чтобы связать их с конкретным полиобъектом.
+
-----
 +
См. также:
 +
* [[Polyobj DoorSlide]]
 +
* [[Polyobj RotateLeft]]
 +
* [[Polyobj OR RotateLeft]]
 +
* [[Polyobj RotateRight]]
 +
* [[Polyobj OR RotateRight]]
 +
* [[Polyobj StartLine]]
 +
* [[Polyobj DoorSwing]]
 +
* [[Polyobj Move]]
 +
* [[Polyobj OR Move]]
 +
* [[Polyobj MoveTimes8]]
 +
* [[Polyobj OR MoveTimes8]]
 +
* [[Polyobj ExplicitLine]]
-
'''polyMirror''' указывает на второй полиобъект, который будет «отражать» все действия первого. Например, если полиобъект вращается вправо на 90 градусов, то зеркало полиобъекта будет вращаться влево на 90 градусов.
+
{{zdoomwikibased2|PolyObjects}}
-
 
+
-
 
+
-
Обратите внимание, что иметь два полиобъекта, отражающих друг друга, считается плохой идеей, но обычно это не вызывает проблем, так как в каждый конкретный момент времени полиобъект может выполнять только одно действие.
+
-
 
+
-
 
+
-
То есть: если полиобъект, вращающийся влево на 90 градусов, отражает полиобъект, вращающийся вправо, то он будет игнорировать все попытки вращать его снова, так как он уже что-то делает.
+
-
 
+
-
+
-
Последний параметр этих спецификаторов определяет конкретную дверную последовательность звуков, проигрываемую при движении или вращении полиобъекта. Более подробную информацию можно получить в разделе последовательности звуков.
+
-
 
+
-
== Polyobj_StartLine ==
+
-
 
+
-
Очень простой спецификатор. Установите его у отдельной линии полиобъекта, и она будет первой отображаемой линией полиобъекта.
+
-
 
+
-
 
+
-
Порядок отображения остальных линий, определяется путем перебора линий, пока не встретится такая, у которой первая точка совпадает со второй точкой первой линии. Третьей отображаемой линией будет линия, у которой первая точка совпадает со второй точкой второй линии, и т.д. и т.п.
+
-
 
+
-
 
+
-
Этот способ работает хорошо, если полиобъекты выпуклы, и имеет то преимущество, что оставляет свободными все линии кроме одной для других спецификаторов линий.
+
-
 
+
-
== Polyobj_ExplicitLine ==
+
-
 
+
-
Использование этого спецификатора чуть сложнее. Его должна использовать каждая линия в полиобъекте, определенном при помощи этого спецификатора. Затем значение 1-255 должно быть помещено в '''orderNumber'''.
+
-
 
+
-
 
+
-
Этот аргумент определяет порядок отображения линий, причем 1 – означает первую отображаемую линию и т.д. Он полезен для невыпуклых полиобъектов, но его недостатком является то, что нужно указывать спецификатор для каждой линии полиобъекта.
+
-
 
+
-
== Точки появления полиобъектов и якори ==
+
-
 
+
-
Каждый полиобъект должен иметь якорь и точку появления. Якорь размещается около полиобъекта и определяет точку отсчета для полиобъекта или точку, вокруг которой он будет вращаться. Якорь (и все линии полиобъекта) напрямую преобразуются в точку появления полиобъекта.
+
-
 
+
-
 
+
-
Итог:
+
-
 
+
-
Якорь – это точка недалеко от полиобъекта, а точка появления полиобъекта – точка на самой карте, определяющая местонахождения полиобъекта.
+
-
 
+
-
 
+
-
Существует два различных типа точек появления: давящие и не давящие. Очевидно, чем они отличаются J
+
-
 
+
-
 
+
-
Если полиобъект нажимает на объект, то сначала он пытается его сдвинуть, а в случае неудачи или попытается нанести ему повреждение или просто остановится. Что именно произойдет, зависит от типа точки появления.
+
-
 
+
-
 
+
-
Обратите внимание, что поле ANGLE точки появления и якоря должны быть равны '''polyNumber''', ранее указанному для соответствующего полиобъекта.  абота над полиобъектами была закончена перед реализацией кода TID/спецификаторов, поэтому Raven сделала такой временный ход, который оказался постоянным, так как проектировщики уже сделали очень много полиобъектов и не захотели исправлять их. ''[А Randy сохранил это для совместимости с картами Hexen.]''
+

Текущая версия