Автор | Сообщение |
qwe8013 - Lance Corporal -
 | 148 |
Doom Rate: 1.9 Posts quality: +49 |
Отправлено: 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 =
 | 1561 |
 Doom Rate: 1.33 Posts quality: +348 |
Отправлено: 19.04.25 17:36:54 | | | А на что вам луноходцам функция "Lift" спрашивается? |
|
|
6 |
1 |
 |
|
| |
Zeberpal_98 Chief Petty Officer
 | 947 |
 Doom Rate: 2.14 Posts quality: +266 |
Отправлено: 19.04.25 18:38:10 | | | Deleted | |
|
1 |
3 |
 |
|
| |
Shadowman UAC General
 | 8690 |
Doom Rate: 2.06 Posts quality: +2219 |
Отправлено: 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 -
 | 148 |
Doom Rate: 1.9 Posts quality: +49 |
Отправлено: 19.04.25 19:42:17 | | | Shadowman
Благодарю, смотрел видимо не внимательно. | |
|
| |
SAM - Master Corporal -
 | 201 |
 Doom Rate: 1.86 Posts quality: +17 |
Отправлено: 19.04.25 22:12:15 | | | Если эта дверь прописана в ACS, то можно добавить строчки для воспроизведения звуков открытия и закрытия от обычных дверей... | |
|
| |
Shadowman UAC General
 | 8690 |
Doom Rate: 2.06 Posts quality: +2219 |
Отправлено: 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
 | 947 |
 Doom Rate: 2.14 Posts quality: +266 |
Отправлено: 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 |
3 |
 |
|
| |
qwe8013 - Lance Corporal -
 | 148 |
Doom Rate: 1.9 Posts quality: +49 |
Отправлено: 20.04.25 11:48:49 | | | Shadowman
Я изначально определял в скрипте закрыта ли дверь по высоте пола. в итоге при спаме нажатиями она начинала куда-то вверх уезжать. | |
|
| |