ZDoom. Создаем вертикальные двухсторонние двери.

Данный гайд был сделан по реквесту Егор Борисенко, свои реквесты в комментариях или в группе вк.

Предисловие.

В этой статье я расскажу вам о создании колонн (Pillar) в ZDoom. Научимся открывать и закрывать их, а также, создавать вертикальные двухсторонние двери.

Возводим колонну.

Сначала, откройте Ultimate Doom Builder, и создайте там, такие колонны.

Далее, задайте этому сектору — тег.

Линии с которыми вы собираетесь взаимодействовать обязательно должны выглядывать наружу. Поменять сторону линии, можно наведя мышкой на линию и нажав F в 2d режиме.

К зеленой линии, установите действие Pillar Build.

Разберем аргументы у Pillar Build:

  • Sector Tag — номер сектора колонны
  • Movement Speedскорость перемещения пола и потолка сектора.
  • Target Height (rel.) — если указан 0, то пол/потолок будет перемещаться до соприкосновения пола/потолка, в противном случае, на заданное значение.

В игре, это действие приведет к соединению пола и потолка.

К противоположной линии, установите действие Pillar Open.

У Pillar Open, разберем новые аргументы:

  • Lower Floor By — если 0, то пол колонны перемещается до пола вне колонны, иначе, перемещается на заданное значение.
  • Raise Ceiling by — тоже самое что и Lower Floor By, но с потолками.

В игре, это выглядит так.

Таким образом, мы можем открыть колонну, и закрыть её.

Создаем вертикальную двухстороннюю дверь.

К сожалению в ZDoom нет действия открывающего колонну и через некоторое закрывающего её, как у двери, в действии Door Generic (202). Однако, используя возможности ACS, и действия Pillar Open, Pillar Build, мы можем обойти это ограничение.

Добавьте следующий код к себе в ACS.

#include "zcommon.acs"

script 2(int tag){
	int waitTime = 40;
	Pillar_Open(tag,16,0,0);
	TagWait(tag);
	ACS_NamedExecuteAlways("pillarBack",0,tag,waitTime,0);
}

script "pillarBack" (int tag, int waitTime) {
	int myTimer = waitTime;
	while(myTimer != 0){
		myTimer--;
		Delay(1);
	}
	Pillar_BuildAndCrush(tag,16,0, 10,2);
}

Далее, создайте парочку закрытых колонн.

И привяжите к линиям колонн выполнение 2-го скрипта. В поле tag, укажите тег сектора колонны.

Все, двери созданы.

Далее разберем ACS код добавленный ранее.

Разбираем ACS код вертикальных двухсторонних дверей.

Разберем 2-ой скрипт.

script 2(int tag){ //Данный скрипт принимает число (int) и хранит его в переменной tag
	int waitTime = 40;
	Pillar_Open(tag,16,0,0); //Открываем колонную указанного тега, со скоростью 16,двигаем до максимума пол (0), и потолок (0)
	TagWait(tag); //Ждем пока действие в секторе tag (открытие колонны) закончится.
	ACS_NamedExecuteAlways("pillarBack",0,tag,waitTime,0); //Выполняем скрипт pillarBack в новом потоке, из первой карты (0), в качестве аргументов передаем tag и waitTime.
}

Т.е. скрипт 2, принимает tag сектора колонны, открывает её со скоростью 16, ждет пока она полностью откроется, и выполняет скрипт pillarBack, передав ему tag колонны и время ожидания.

Остальное я разобрал в комментариях (//), едем дальше.

script "pillarBack" (int tag, int waitTime) {
	int myTimer = waitTime; //Переносим значение waitTime в переменную myTimer 
	while(myTimer != 0){ //Делаем заддержку myTimer тиков
		myTimer--; //Уменьшаем myTimer на 1
		Delay(1); //Ждем 1 тик
	}
	Pillar_BuildAndCrush(tag,16,0, 10,2); //Вызываем закрытие колонны
}

Данный скрипт ждет waitTime тиков, и вызывает Pillar_BuildAndCrush. Разберем эту комманду.

Pillar_BuildAndCrush(тег_сектора,скорость_закрытия,расстояние_перемещения, урон_при_раздавливании, множитель_этого_урона);
  • тег_сектора — задает сектор колонны
  • скорость_закрытия — скорость перемещения потолка и пола.
  • расстояние_перемещения — если указан 0, то пол/потолок будет перемещаться до соприкосновения пола/потолка, в противном случае, на заданное значение.
  • урон_при_раздавливании — урон что получает игрок при раздавливании.
  • множитель_этого_урона урон_при_раздавливании множится на это число.

Вроде все рассмотрел, если остались вопросы, оставляйте их в комментариях или в группе вк.

Итоговый результат.

Пожалуйста отключи блокировщик рекламы, или внеси сайт в белый список!

Please disable your adblocker or whitelist this site!