Структуры построения уровня: вершины, стороны, линии, секторы¶
В этом разделе представлены лишь главные и самые используемые составляющие структур постороения уровней — в случае нужды все остальные есть и в u-/g-/q-/lzdoom.pk3.
Теория¶
Сектор (Sector) — единица разметки вертикального пространства уровня ("высоты"). Имеет такие основные характеристики, как высота пола, высота потолка, их текстуры, уровень освещённости, эффект (например, кислотный урон или мигание). Высота между полом и потолком и будет пространством уровня, тем, в котором обитают все объекты мира. Со всех сторон сектор ограничен линиями (linedef, см. ниже) — в простейшем случае тремя, получится форма треугольника.
Вся область внутри уровня делится на секторы, вне секторов есть только пустота, отсутствие уровня. В одной комнате может быть несколько секторов (например, ступени или полутень не могут состоять из одного сектора). Несколько комнат могут иметь в себе один и тот же сектор.
Обычно граница секторов является замкнутой, то есть, двигаясь по её линиям в одну сторону, в результате окажешься в точке, откуда начал движение. Такие секторы, соответственно, называются "замкнутыми". При нарушении этого правила (при незамкнутом секторе) зачастую возникают ошибки отображения; однако при аккуратном использовании также проявляются и недокументированные особенности движка — например, таким образом создаётся имитация глубокой воды в TNT: Evilution, или невидимый пол в The Plutonia Experiment.
Линия (Linedef) — единица отсечения секторов друг от друга и от пустоты вне уровня, реализует геометрию пространства и стены в частности. Обычно говорят о длине линии, её направлении, её свойстве/действии, её сторонах (Sidedef) и о секторах, которым она принадлежит. Когда линия отделяет сектор от пустоты (т. н. "односторонняя линия"), она является границей только одного сектора, и принадлежит только ему. Когда линия разделяет разные секторы ("двусторонняя линия"), то говорят о принадлежности к переднему и заднему сектору.
Любая линия является отрезком, то есть имеет ровно два конца и не может продолжаться до бесконечности в любую сторону. Точки, в которых начинается и заканчивается отрезок, называются вершинами (Vertex). Одна вершина может являться концом неограниченного числа линий.
Сторона линии (Sidedef) всегда связана с линией (Linedef), реализует визуальную отрисовку — текстуру с этой стороны, смещение текстуры, её растяжение и так далее. Как говорилось ранее, у линии может быть или одна, или две независимые стороны.
Пол сектора, также как и его потолок, на самом деле является плоскостью (Plane). Это плоскость в математическом понимании — она имеет только вектор нормали (т. е. наклон плоскости) и расстояние от базовой точки мира.
Все изменяющиеся объекты на уровне, такие как двери, лифты, мерцание света, создаются через разновидности класса Thinker.
Содержимое составляющих уровня¶
Вершина ("Vertex") хранит только неизменяемую позицию:
Сторона линии ("Side") уже гораздо более интересна.
native readonly Sector sector; // Сектор, на который выходит эта сторона.
native readonly Line linedef; // Линия, которой принадлежит эта сторона.
native int16 Light; // Уровень освещённости стороны.
native uint8 Flags; // Флаги стороны.
native TextureID GetTexture(int which); // Функция, позволяющая получить id текстуры на этой стороне.
native clearscope Vertex V1(); // Функция, возвращающая указатель на первую вершину для стороны.
native clearscope Vertex V2(); // Функция, возвращающая указатель на вторую вершину для стороны.
native int Index(); // Функция, возвращающая индекс стороны.
Линия ("Line"):
Сектор ("Sector"):