Welcome to U.A.C. [O.S.A.]
login / register 
Status: Guest
Архивы форума | iddqd.ru
Wolf 3D
ПравилаПравила ПоискПоиск
18+
Дверь "вниз" на ACS
   Список разделов - Местечко мапперов и моддеров - Дверь "вниз" на ACSОтветить
АвторСообщение
qwe8013
- Lance Corporal -
Next rank: = Lance Corporal = after 12 points
148

Doom Rate: 1.9

Posts quality: +49
Ссылка на пост №1 Отправлено: 19.04.25 17:27:10
Маплю под gzdoom/vkdoom UDMF. Возникло желание сделать дверь, которая открывается не вверх как обычно, а вниз. Казалось бы, есть action для linedef типа Floor_LowerToNearestFloor, но тут есть проблемы:
1) Если использовать action Floor_LowerToNearestFloor то пол опуститься и подниматься обратно через время не будет.
2) Я бы хотел чтобы эта "дверь" опускалась не до самого пола, а останавливалась где-то на 4 пункта выше.

В итоге я решил просто написать скрипт на ACS и использовать его вызов в качестве action у linedef. Но здесь есть свои проблемы:
1) Как узнать высоту у "NearestFloor"? Функция "Floor_LowerToNearestFloor" как-то внутри себя узнаёт, но как мне в скрипте получить соответствующее значение я не понял. Можно конечно в качестве параметра скрипта использовать нужную высоту, но это не слишком удобно.
2) Скрипт можно запускать в "единственном" экземпляре, тогда его нельзя использовать пока не завершился предыдущий вызов, т.е. пока одна дверь не откроется и закроется обратно, другую дверь открыть нельзя.
3) Можно запускать скрипт так, чтобы он мог работать в любом количестве экземпляров на карте, но тогда если уткнуться в дверь и непрерывно нажимать действие (в классике -- пробел) то может начаться бредятина связаная с тем, что один и тот же скрипт работает в разных экземплярах одновременно для одной двери.

В общем вопрос в том, как найти высоту ближайшего пола и как устроить нормальную синхронизацию скриптов, чтобы с одной стороны не дожидаться постоянно закрытия двери, а с другой не начинались баги при постоянном тыкании в дверь?
TheTaintedSlav
= 2nd Lieutenant =
Next rank: - 1st Lieutenant - after 79 points
1561

Doom Rate: 1.33

Posts quality: +348
Ссылка на пост №2 Отправлено: 19.04.25 17:36:54
А на что вам луноходцам функция "Lift" спрашивается?

Рейтинг сообщения: +2, отметил(и): Артём, SilverMiner
6 1
Zeberpal_98
Chief Petty Officer
Next rank: - Warrant Officer - after 93 points
947

Doom Rate: 2.14

Posts quality: +266
Ссылка на пост №3 Отправлено: 19.04.25 18:38:10
Deleted
1 3
Shadowman
UAC General
Next rank: Unavailable after 0 points
8690

Doom Rate: 2.06

Posts quality: +2219
Ссылка на пост №4 Отправлено: 19.04.25 18:42:47
qwe8013
Смотри экшены во вкладке Platform.
Например:
Platform Lower Wait Raise
либо
Platform Lower Wait Raise (lip)
Во втором случае можно настроить отступ снизу, который останется при опущенной платформе (т.е. она опустится не до самого пола, а с учетом указанного отступа от пола).
Также советую внимательно изучить все стандартные экшены GZDoom и их параметры, прежде чем что-то делать. Скрипты побереги для более навороченных приемов :)

Рейтинг сообщения: +1, отметил(и): qwe8013
1 7 2
qwe8013
- Lance Corporal -
Next rank: = Lance Corporal = after 12 points
148

Doom Rate: 1.9

Posts quality: +49
Ссылка на пост №5 Отправлено: 19.04.25 19:42:17
Shadowman
Благодарю, смотрел видимо не внимательно.
SAM
- Master Corporal -
Next rank: = Master Corporal = after 39 points
201

Doom Rate: 1.86

Posts quality: +17
Ссылка на пост №6 Отправлено: 19.04.25 22:12:15
Если эта дверь прописана в ACS, то можно добавить строчки для воспроизведения звуков открытия и закрытия от обычных дверей...
Shadowman
UAC General
Next rank: Unavailable after 0 points
8690

Doom Rate: 2.06

Posts quality: +2219
Ссылка на пост №7 Отправлено: 19.04.25 22:38:38
qwe8013
Хотя вопрос с "дверью вниз", надеюсь, решился, но вопросы, которые были заданы о скриптах, могут всплыть снова при похожей ситуации. Потому постараюсь прояснить (не для двери, а в целом).
qwe8013 пишет:
2) Скрипт можно запускать в "единственном" экземпляре, тогда его нельзя использовать пока не завершился предыдущий вызов, т.е. пока одна дверь не откроется и закроется обратно, другую дверь открыть нельзя.

Тут решается просто - для каждого случая надо писать свой скрипт. Да, количество скриптов от этого множится, но если они короткие, то код можно уместить на одну строку, а дальше сделать кучу аналогичных скриптов для соответствующего объекта (например, тебе надо, чтобы при нажатии на запертую дверь проигрывался звук "Заперто", запертых дверей на карте штук 10, они могут быть расположены рядом, так что игрок может успевать нажать на 2 двери раньше, чем проиграется звук от первой двери и т.п. Или, например, какие-то двери становятся потом открытыми - звук не играется, но какие-то остаются закрытыми).
Можно, конечно, обойтись 1 скриптом с переменной, которая принимает разное значение для каждой двери. Но мне было не удобно, например, спустя год вспоминать, где какие двери с какими переменными значениями расположены на карте, а когда 1 дверь = 1 скрипт, то ориентироваться легче.
qwe8013 пишет:
3) Можно запускать скрипт так, чтобы он мог работать в любом количестве экземпляров на карте, но тогда если уткнуться в дверь и непрерывно нажимать действие (в классике -- пробел) то может начаться бредятина связаная с тем, что один и тот же скрипт работает в разных экземплярах одновременно для одной двери.

Тут не очень понял. Для подобных скриптов я обычно вставляю в код задержку, например, на 1 секунду, т.е. delay(35). Потому пока скрипт полностью не завершится, новый цикл этого скрипта не начнется - сколько бы раз ты ни барабанил бы в дверь пробелом :) Также полезно для скрипта, описанного выше (задержка должна соответствовать примерно длительности проигрыша звука "Заперто", чтобы звук не зацикливался сам на себя. Но при этом от разных дверей звуки "Заперто" не зависят друг от друга и могут накладываться).
1 7 2
Zeberpal_98
Chief Petty Officer
Next rank: - Warrant Officer - after 93 points
947

Doom Rate: 2.14

Posts quality: +266
Ссылка на пост №8 Отправлено: 20.04.25 00:43:04
По уму будет сделать более комплексную систему с массивом. Я быстренько набросал,

Дверь вызывается 226 Script_executeAlways ("FloorDoor", 0, Индекс Двери)


#libdefine 	dr_TAG		0
#libdefine 	dr_HEIGHT	1
#libdefine 	dr_STATUS	2

#libdefine 	DoorCount	5	//kol-vo dverei

int Door[DoorCount][3]	=
{
// Tag,  Height, Status

    {2, 128,  FALSE},		//dver 0

    {13, 128, FALSE},	//dver 1

    {24, 128, FALSE},	//dver 2

	{33, 256, FALSE},	//dver 3

	{52, 128, FALSE},	//dver 4

};

Script "FloorDoor" (int DoorIndex)
{

	if (Door[DoorIndex][dr_STATUS])		Terminate;	//konkretno eta dver vse eshe otkrivaetcya-zakrivaetcya, poetomu zakrivaem script dlya etoi itteracii

//dver zakrita znachit mozhno otkrivat;


Door[DoorIndex][dr_STATUS] = True;

int RootHeight = GetSectorFloorZ(Door[DoorIndex][dr_TAG], 0, 0);




//Otkrivaem dver
Floor_LowerByValue(Door[DoorIndex][dr_TAG], 8, Door[DoorIndex][dr_HEIGHT]);
while(GetSectorFloorZ(Door[DoorIndex][dr_TAG], 0, 0) > GetSectorFloorZ(Door[DoorIndex][dr_TAG], 0, 0) - Door[DoorIndex][dr_HEIGHT]*1.0)
	delay(1);

delay(35*4);	//zhdem 4 sekundi i zakrivaem dver obratno naverh

//zakrivaem dver
Floor_RaiseByValue(Door[DoorIndex][dr_TAG], 8, Door[DoorIndex][dr_HEIGHT]);
while(GetSectorFloorZ(Door[DoorIndex][dr_TAG], 0, 0) < RootHeight)
	delay(1);


Door[DoorIndex][dr_STATUS] = FALSE;		//zakrita


}



хотя Platform более чем достаточно.. хмм вообще незнаю зачем я накодил лоол

Рейтинг сообщения: +1, отметил(и): Dron12261
1 3
qwe8013
- Lance Corporal -
Next rank: = Lance Corporal = after 12 points
148

Doom Rate: 1.9

Posts quality: +49
Ссылка на пост №9 Отправлено: 20.04.25 11:48:49
Shadowman

Тут не очень понял.

Я изначально определял в скрипте закрыта ли дверь по высоте пола. в итоге при спаме нажатиями она начинала куда-то вверх уезжать.
Страница 1 из 1Перейти наверх
   Список разделов - Местечко мапперов и моддеров - Дверь "вниз" на ACS