Автор | Сообщение |
alekv - Colonel -
| | 4168 |
Doom Rate: 1.87 Posts quality: +949 |
Отправлено: 04.03.19 11:27:26 | | | В аноним функциях прыжки прописываются иначе:
TNT1 A 0
{
if (CallACS("GetActorAngle") == TRUE)//Если вернет 1, прыгнет с вероятностью 128 в стейт MyState_1
{
return A_Jump(128, "MyState_1");
}
else//иначе, 100% прыгаем в стейт MyState_2
{
return state("MyState_2");
}
}
Про другое не уверен, давно не юзал это дело, но можешь и сам проверить что будет с актером если ему прописать null (по идее актер будет уничтожен) |
|
|
1 |
3 |
1 |
|
|
| |
Void Weaver = Captain =
| 2496 |
Doom Rate: 1.82 Posts quality: +808 |
Отправлено: 04.03.19 22:01:25 | | | Ну вот опять:Actor DImpA : DoomImp
{
+AVOIDMELEE
States
{
See:
TROO AABBCCDD 2
{
If (GetDistance(1)<Radius+256)
{
Return A_Jump(256,"Avoid");
}
Else
{
Return State("See");
}
A_Chase;
}
Loop
Melee:
Missile:
TROO EF 8 A_FaceTarget
TROO G 6 A_TroopAttack
goto See
Avoid:
TROO AABBCCDD 2
{
If (GetDistance(1)>Radius+272)
{
Return A_Jump(256,"Missile");
}
Else
{
Return State("Avoid");
}
A_FaceTarget;
A_Chase(0,"Missile",CHF_NODIRECTIONTURN);
}
Loop
}
}
В чём косяк?
EDIT:
Пробовал ставить continue в элс теперь до кучи возвращает "'continue' outside of a loop". ((
ЭДИТ2:
Пробовал ставить return и return state(0) и всё время возвращает ошибку "Return type mismatch". ВТФ?! | |
|
1 |
9 |
1 |
|
|
| |
alekv - Colonel -
| | 4168 |
Doom Rate: 1.87 Posts quality: +949 |
Отправлено: 04.03.19 23:02:25 | | | Поставив такого актера на карте, ты можешь подойти к нему или отойти и он будет оповещать дальше или ближе..
Короче тест актер показывает что прыжки работают корректно.
В твоем случае, надо написать функции A_Chase; A_Facetarget ДО КОДА с прыжком, получается код прыжка должен быть последним
Либо после этих всех функций написать return state("");
Т.е. логика такая что если в аноним функции есть прыжок, то она как бы эквивалентна function int myFunc () т.е. должна что-то вернуть обязательно либо 0 либо что-то еще. прописав return state(""); ты в конце возвращаешь 0, как бы все выполняется и если не прыгнуло никуда, то вернет 0.
Вот рабочий вариант:
Actor DImpA : DoomImp
{
+AVOIDMELEE
States
{
See:
TROO AABBCCDD 2
{
if (GetDistance(TRUE) < Radius + 256)
{
return A_Jump(256, "Avoid");
}
else
{
return state("See");
}
A_Chase;
return state("");
}
Loop
Melee:
Missile:
TROO EF 8 A_FaceTarget
TROO G 6 A_TroopAttack
goto See
Avoid:
TROO AABBCCDD 2
{
A_FaceTarget;
A_Chase(false, "Missile", CHF_NODIRECTIONTURN);
if (GetDistance(TRUE) > Radius + 272)
{
return A_Jump(256, "Missile");
}
else
{
return state("Avoid");
}
A_FaceTarget;
A_Chase(false, "Missile", CHF_NODIRECTIONTURN);
return state("");
}
Loop
}
}
|
|
|
1 |
3 |
1 |
|
|
| |
Void Weaver = Captain =
| 2496 |
Doom Rate: 1.82 Posts quality: +808 |
Отправлено: 04.03.19 23:25:04 | | | Так вот где собака порылась... Фига се, не думал что очерёдность ф-ций определяет внутреннюю конструкцию иф\элс. О_О
Т. е. либо так:See:
TROO AABBCCDD 2
{
A_Chase;
if (GetDistance(TRUE) < Radius + 256)
{
return A_Jump(256, "Avoid");
}
else
{
return state("");
}
}
Loop
либо так:See:
TROO AABBCCDD 2
{
if (GetDistance(TRUE) < Radius + 256)
{
return A_Jump(256, "Avoid");
}
else
{
//
}
A_Chase;
return state("");
}
Loop
alekv, Гранд Мерси! |
|
|
1 |
9 |
1 |
|
|
| |
alekv - Colonel -
| | 4168 |
Doom Rate: 1.87 Posts quality: +949 |
Отправлено: 04.03.19 23:37:59 | | | Да не за что.
Только уточню
Void Weaver пишет: | Фига се, не думал что очерёдность ф-ций определяет внутреннюю конструкцию иф\элс. О_О |
alekv пишет: | Т.е. логика такая что если в аноним функции есть прыжок, то она как бы эквивалентна function int myFunc () т.е. должна что-то вернуть обязательно либо 0 либо что-то еще. |
и ты пишешь не внутри if\else.
А вот если посмотреть на acs, там тот же принцип, просто мне кажется decorate совсем уг синтаксис.
function int myFunc ()
{
return 0;
}
поскольку функция myFunc имеет тип int, то функция там где ее вызывают должна что-то вернуть.
пример
script "test" (void)
{
if (myFunc() == 0)
PrintBold(s:"test");
}
если функция myFunc() будет иметь возвращаемый тип(bool, int, str(хз может ли строку возвращать не помню)), а не void, то обязательно надо что-то возвращать. |
|
|
1 |
3 |
1 |
|
|
| |
Void Weaver = Captain =
| 2496 |
Doom Rate: 1.82 Posts quality: +808 |
Отправлено: 05.03.19 17:32:06 | | | Запись "####" и "#" (или #### и # для зскрипта) позволяет "копировать" кадр спрайта и его направление соответственно.
Вопрос: есть ли какой-либо способ "копировать" также длительность (тики) кадра? | |
|
1 |
9 |
1 |
|
|
| |
JSO x - 2nd Lieutenant -
| 1336 |
Doom Rate: 2.26 Posts quality: +726 |
Отправлено: 05.03.19 22:10:18 | | | Зачем тебе такое?..
В Decorate -- невозможно, только через очередной колоссальный костыль выдачи после каждого подпункта стейта предмета количеством предыдущей строки и соответственной проверки. В смысле,
See:
TROO A 4 A_Chase
TROO A 0 A_GiveInventory( "TickItem", 4 )
TROO B 4 A_Chase
TROO B 0 A_GiveInventory( "TickItem", 4 )
TROO C 4 A_Chase
TROO C 0 A_GiveInventory( "TickItem", 4 )
TROO D 4 A_Chase
TROO D 0 A_GiveInventory( "TickItem", 4 )
Loop
<...>
TickTest:
TROO E 1 A_TakeInventory( "TickItem", 1 )
TROO E 0 A_JumpIfInventory( "TickItem", 1, "TickTest" )
TROO FGHI 5 // Если нужно несколько строк стейта, копируешь текущее количество TickItem в какой-нибудь TempTickItem и декрементируешь уже его; и так -- каждый подпункт.
Goto See
...Но это атас. В ZScript особо другого способа нет, вариант -- проверять через InStateSequence название текущего пункта выполнения и в Tick() обрабатывать изменения.
Никогда с такой проблемой ни там, ни там не встречался, потому больше сказать не могу. | |
|
2 |
7 |
1 |
|
|
| |
Void Weaver = Captain =
| 2496 |
Doom Rate: 1.82 Posts quality: +808 |
Отправлено: 05.03.19 22:24:32 | | | JSO x пишет: | Зачем тебе такое?.. | Смотри, допустим есть имп с идл стэйтом:Actor Imp1 : DoomImp
{
States
{
Idle:
TROO AABBCCDD 5 //A_Look
Loop
}
} и есть барон с идл стэйтом:Actor Ba1 : BaronOfHell
{
States
{
Idle:
BOSS AABBCCDD 3 //A_Look
Loop
}
}
Если им выдавать в течении некоторого времени такую штуку, то оба войдут в _Вандер с кадрами Idle, вот только у обоих скорость перемещения будет одинаково запредельная:Мне же нужно чтобы при получении подобного итма каждый моб двигался со скоростью аналогичной таковой своего стэйта. | |
|
1 |
9 |
1 |
|
|
| |
alekv - Colonel -
| | 4168 |
Doom Rate: 1.87 Posts quality: +949 |
Отправлено: 05.03.19 22:39:46 | | | Я не понимаю чего делает #### и не хочу понимать, но тики теоретически можно передавать, таким путем:
В ACS прописываем переменную и 2 мини скрипта..
Если надо копипастить тики в пределах 1 актера, то еще проще, надеюсь понятно как? |
|
|
1 |
3 |
1 |
|
|
| |
Void Weaver = Captain =
| 2496 |
Doom Rate: 1.82 Posts quality: +808 |
Отправлено: 05.03.19 22:54:42 | | | alekv пишет: | Я не понимаю чего делает #### и не хочу понимать | вот поэтому ты предложил мне АЦС-вариант "шило на мыло". Спасибо конечно за алгоритм (он действительно понятный и возможно кому-нибудь пригодится), но с таким же успехом проще задать фиксированные индивидуальные значения тиков для каждого актора непосредственно в пикап стэйте, типа:Но я рассчитывал на более гибкую и универсальную конструкцию. |
Рейтинг сообщения: +1, отметил(и): alekv |
|
1 |
9 |
1 |
|
|
| |
JSO x - 2nd Lieutenant -
| 1336 |
Doom Rate: 2.26 Posts quality: +726 |
Отправлено: 05.03.19 23:15:50 | | | Придумал, как сделать. ZScript.
class DoomImp2: DoomImp replaces DoomImp {
State oldState;
override void Tick() {
if ( self.CurState != oldState ) {
if ( self.InStateSequence( CurState, ResolveState( "Pain" ) ) )
A_SetTics( oldState.Tics );
oldState = self.CurState;
}
Super.Tick();
}
} |
Рейтинг сообщения: +1, отметил(и): alekv |
|
2 |
7 |
1 |
|
|
| |
alekv - Colonel -
| | 4168 |
Doom Rate: 1.87 Posts quality: +949 |
Отправлено: 05.03.19 23:50:58 | | | Void Weaver пишет: | вот поэтому ты предложил мне АЦС-вариант "шило на мыло". Спасибо конечно за алгоритм (он действительно понятный и возможно кому-нибудь пригодится), но с таким же успехом проще задать фиксированные индивидуальные значения тиков для каждого актора непосредственно в пикап стэйте, типа:
Скрытый текст:
Но я рассчитывал на более гибкую и универсальную конструкцию. |
Ну значит зскрипт хороший выход.
Хотя в том коде что ты написал теоретически можно писать так
Я просто видимо не вижу проблемы т.к. не понимаю как работает стейт ####.. ну понимаю что он копирует предыдущий стейт но что дальше хз и зачем это надо тоже хз |
|
|
1 |
3 |
1 |
|
|
| |
Void Weaver = Captain =
| 2496 |
Doom Rate: 1.82 Posts quality: +808 |
Отправлено: 06.03.19 00:14:08 | | | JSO x пишет: | Придумал, как сделать. ZScript. | Сорри, ваще нифига не понял.
Я случаем не упоминал раз стопицот в этом треде что все мои вопросы базируются на условии "декор онли" если не указано иное?
alekv снова выручаэ! ^_^ Далеко не то что надо, но отличная оптимизация вместо "спагетти". )
Добавлено спустя 14 минут 47 секунд:
alekv пишет: | не понимаю как работает стейт ####.. ну понимаю что он копирует предыдущий стейт но что дальше хз и зачем это надо тоже хз | Ну например дляActors spawned with A_SpawnItemEx can utilize SXF_TRANSFERSPRITEFRAME, allowing use of the two preserving names above for the first frame of the initializing actor. This only works with A_SpawnItemEx, and should not be attempted with anything else. Т. е. такими кадрами можно эмулировать блур эффект из _СпаунИтемЭкс.
ЛИБО же для визуализации кадрами текущего стэйта актора принудительного вызова какой-либо А_Ф-ции извне (как в моём случае) или внутри самого актора.
Например у актора (импа, барона) нет своего стэйта в котором бы вызывалась A_Wander, но оную можно принудительно вызвать из кастоминвентори, вот только без указания "####" "#" придётся либо довольствоваться невидимыми TNT1 либо визуализировать КАЖДЫЙ кадр для КАЖДОГО получателя:
TROO AABBCCDD 5 A_Wander
BOSS AABBCCDD 3 A_Wander
<...>
Кароч эти "####" "#" кадры весьма удобная штука. | |
|
1 |
9 |
1 |
|
|
| |
theleo_ua = Colonel =
| 4802 |
Doom Rate: 1.8 Posts quality: +1032 |
Отправлено: 06.03.19 00:36:20 | | | alekv пишет: | Я просто видимо не вижу проблемы т.к. не понимаю как работает стейт ####.. ну понимаю что он копирует предыдущий стейт но что дальше хз и зачем это надо тоже хз |
Это не стейт, а спрайт фрейм. Когда ты пишешь DEMN A 1, то в ваднике ищется файл DEMNA0.PNG. А теперь представь ситуацию, когда мне надо переопределить заморозку монстра таким образом, что я хочу убрать монстра которого заморозили, и на его месте заспавнить другого актора, которого я заморожу, и чтобы этот другой актор был с точно таким же спрайт фреймом, в котором был сам монстр в момент его заморозки
Тогда спавн актора будет с такой командой:
A_SpawnItemEx("замороженный" бла бла бла, SXF_TRANSFERSPRITEFRAME)
а в коде актора "замороженный" первый спрайт фрейм будет #### #, и движок гздума заменит его на тот, который был у спавнера в момент выполнения A_SpawnItemEx
Каким образом оно работает у Void Weaver, я не вникал в код, но думаю там какой-то похожий механизм, когда в момент самой игры, откуда-то возьмется спрайт фрейм и подставится вместо #### # |
|
|
3 |
1 |
|
|
| |
JSO x - 2nd Lieutenant -
| 1336 |
Doom Rate: 2.26 Posts quality: +726 |
Отправлено: 06.03.19 11:09:28 | | | Void Weaver пишет: | Я случаем не упоминал раз стопицот в этом треде что все мои вопросы базируются на условии "декор онли" если не указано иное? |
JSO x пишет: | В Decorate -- невозможно, только через очередной колоссальный костыль выдачи после каждого подпункта стейта предмета количеством предыдущей строки и соответственной проверки. |
Дополнение -- да, что в Decorate ныне можно свои переменные добавлять, забыл.
В общем, всё упирается в извечный вопрос: "Тебе шашечки или ехать?". Нужен исключительно Decorate (совместимость со старыми версиями всё равно нарушена, так как в моём любимом ZDoom 2.8.1 anonymous-функции не поддерживаются. А тогда зачем Decorate использовать, кроме как для совместимости?) -- тогда используй вариант, предложенный alekv и первоначально мной, нужна универсальность -- обучайся ZScript, даром что рабочий код для тебя УЖЕ написан. | |
|
2 |
7 |
1 |
|
|
| |
alekv - Colonel -
| | 4168 |
Doom Rate: 1.87 Posts quality: +949 |
Отправлено: 06.03.19 11:27:03 | | | theleo_ua
Void Weaver
Спасибо, за разъяснения.
Void Weaver пишет: | Далеко не то что надо, но отличная оптимизация вместо "спагетти". ) |
Жаль что с появлением зскрипта, забили на декорейт синтаксис, так бы оптимизация была гораздо круче.
К примеру в декорейт поддерживает ENUM перечисления, но только цифры.. Строки не может, так же не понимает именованных enum да кучу всего, все это теперь в зскрипте, а он не понятный для простого юзера.
JSO x пишет: | обучайся ZScript, даром что рабочий код для тебя УЖЕ написан. |
Вот я бы лучше посоветовал забить болт на этот гздум и учить нормальные ЯП. А гздум пусть покоится с миром.
Zscript уже не для мододелов, это язык программирования довольно сложный и плохо задокументированный, да еще и с хз каким синтаксисом. Если нужен зскрипт для создания модов, пора задуматься может пора менять движок, на ue или unity или cryengine и др., а не яп?
Тот же сишарп юнити во многие разы проще и круче и возможности огромные, обучение на столько простое что словами не передать, инфы и уроков тьма.
Полемика про достоверность Дума перенесена в http://i.iddqd.ru/viewtopic.php?p=107763#107763 BeeWen |
Рейтинг сообщения: -1, отметил(и): MyNameIs |
|
1 |
3 |
1 |
|
|
| |
Doomgay1999 - Corporal -
| 96 |
Doom Rate: 2
|
Отправлено: 10.03.19 07:54:12 | | | Можно как нибудь заменить текстуры в DOOM не трогая программы предназначение для этого? | |
|
| |
ZZYZX - UAC Commissar -
| | 6284 |
Doom Rate: 1.65 Posts quality: +1630 |
Отправлено: 10.03.19 08:43:04 | | | alekv пишет: | Вот я бы лучше посоветовал забить болт на этот гздум и учить нормальные ЯП. А гздум пусть покоится с миром.
Zscript уже не для мододелов, это язык программирования довольно сложный и плохо задокументированный, да еще и с хз каким синтаксисом. Если нужен зскрипт для создания модов, пора задуматься может пора менять движок, на ue или unity или cryengine и др., а не яп?
Тот же сишарп юнити во многие разы проще и круче и возможности огромные, обучение на столько простое что словами не передать, инфы и уроков тьма. |
Тут ведь какая интересненькая особенность выходит — ты потратишь кучу времени на создание игры с нуля, а в неё в итоге будет играть столько же людей, сколько и в мод, то есть 5-20 за всё время
Так что тут скорее надо учитывать, насколько то что ты делаешь близко к думу, и сколько оригинального контента планируется слепить (причём код тоже в это входит).
Вот тебе пример: чтобы перейти на Unity, необходимо начать с менюшек настройки игры и открытия уровня, самому реализовать перемещение по уровню и AI монстров, нарисовать оружие, руки игрока (причём вероятно в 3D, чтобы не выглядело как уг, раз уж на юньке), и только после этого можно будет приступить к непосредственно созданию игры. И начать придётся с того что ты нарисуешь модель игрока. Потому что в думе она уже есть, а тут вот какая незадача — нема. И мало нарисовать, важно ещё и АНИМИРОВАТЬ, и состыковать с видом из глаз. Или смириться с тем что зеркал в твоём уровне не будет %)
Если бы в юньке существовало что-то в стиле "стартер пак для переходящих с маппинга к думоподобным играм", можно было бы ещё посмотреть.
А так вполне уместно учить зскрипт. Только с оглядкой на то что это практически буквальный интерфейс к внутренностям движка, защитой от дурака часто не обременённый. |
|
|
2 |
2 |
1 |
|
|
| |
Герр Смертоносец - Warrant Officer -
| 1043 |
Doom Rate: 1.38 Posts quality: +855 |
Отправлено: 10.03.19 14:39:30 | | | ZZYZX пишет: | Если бы в юньке существовало что-то в стиле "стартер пак для переходящих с маппинга к думоподобным играм", можно было бы ещё посмотреть. |
Это, не? | |
|
5 |
|
|
| |
ZZYZX - UAC Commissar -
| | 6284 |
Doom Rate: 1.65 Posts quality: +1630 |
Отправлено: 10.03.19 15:59:44 | | | Это не совсем сравнимо с готовым игровым миром дума, мне кажется. В думе легко делать игру кусками, сначала маппишь с обычными текстурами или вообще дефолтными, потом подумал - дорисовал свои, а потом и монстру позаменял. Процесс вообще другой. |
|
|
2 |
2 |
1 |
|
|
| |