XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
Почему критует?
вот 2 кода, посмотрите и скажите плз где я лопухнулся?)
» нажми на меня 1
function end_t_s3InAir takes nothing returns nothing
local timer t = GetExpiredTimer()
local unit uns = LoadUnitHandleBJ ( 1, 5, udg_hash)
     call IssueImmediateOrderBJ( uns, "unravenform" )
     call UnitRemoveAbilityBJ( 'A005', uns )
     set t = null
     set uns = null
endfunction
// \\\\\\\\\\\\\\\\\\\\\\\

function start_t_s3InAir takes nothing returns nothing
local timer t = CreateTimer ()
     call TimerStart( t, 0.09, false, function end_t_s3InAir)
     call SaveRealBJ( 5.00, 1, 5, udg_hash )
     set t = null
endfunction

// \\\\\\\\\\\\\\\\\\\\\\\

function end_t_s2InAir takes nothing returns nothing
local timer t = GetExpiredTimer()
     call start_t_s3InAir()
     set t = null
endfunction
// \\\\\\\\\\\\\\\\\\\\\\\

function start_t_s2InAir takes nothing returns nothing
local timer t = CreateTimer ()
     call TimerStart( t, 0.18, false, function end_t_s2InAir)
     call SaveRealBJ( 10.00, 1, 5, udg_hash )
     set t = null
endfunction

// \\\\\\\\\\\\\\\\\\\\\\\

function end_t_s1InAir takes nothing returns nothing
local timer t = GetExpiredTimer()
     call start_t_s2InAir()
     set t = null
endfunction

// \\\\\\\\\\\\\\\\\\\\\\\
function start_t_s1InAir takes nothing returns nothing
local timer t = CreateTimer ()
     call TimerStart( t, 0.37, false, function end_t_s1InAir)
     call SaveRealBJ( 15.00, 1, 5, udg_hash )
     set t = null
endfunction

// \\\\\\\\\\\\\\\\\\\\\\\

function Trig_InAir_Func001A takes nothing returns nothing
    local unit kbunit = GetEnumUnit()
    call SaveUnitHandleBJ( kbunit, 1, 5, udg_hash )
    call start_t_s1InAir()
    call GroupRemoveUnitSimple( kbunit, udg_GroupInAir )
    call UnitAddAbilityBJ( 'A005', kbunit )
    call IssueImmediateOrderBJ( kbunit, "ravenform" )
    set kbunit = null
endfunction

function Trig_InAir_Actions takes nothing returns nothing
    call ForGroupBJ( udg_GroupInAir, function Trig_InAir_Func001A )
    call SetUnitFlyHeightBJ( LoadUnitHandleBJ(1, 5, udg_hash), ( GetUnitFlyHeight(GetEnumUnit()) + LoadRealBJ(1, 5, udg_hash)), 1.00 )
endfunction

//===========================================================================
function InitTrig_InAir takes nothing returns nothing
    set gg_trg_InAir = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_InAir, 0.05 )
    call TriggerAddAction( gg_trg_InAir, function Trig_InAir_Actions )
endfunction
» нажми на меня 2
function end_t_s3InGround takes nothing returns nothing
local timer t = GetExpiredTimer()
local unit uns = LoadUnitHandleBJ ( 1, 6, udg_hash)
     set t = null
     set uns = null
endfunction
// \\\\\\\\\\\\\\\\\\\\\\\

function start_t_s3InGround takes nothing returns nothing
local timer t = CreateTimer ()
     call TimerStart( t, 0.09, false, function end_t_s3InGround)
     call SaveRealBJ( (25.00 - LoadRealBJ(1, 6, udg_hash)), 1, 6, udg_hash )
     set t = null
endfunction

// \\\\\\\\\\\\\\\\\\\\\\\

function end_t_s2InGround takes nothing returns nothing
local timer t = GetExpiredTimer()
     call start_t_s3InAir()
     set t = null
endfunction
// \\\\\\\\\\\\\\\\\\\\\\\

function start_t_s2InGround takes nothing returns nothing
local timer t = CreateTimer ()
     call TimerStart( t, 0.18, false, function end_t_s2InGround)
     call SaveRealBJ( (15.00 - LoadRealBJ(1, 6, udg_hash)), 1, 6, udg_hash )
     set t = null
endfunction

// \\\\\\\\\\\\\\\\\\\\\\\

function end_t_s1InGround takes nothing returns nothing
local timer t = GetExpiredTimer()
     call start_t_s2InAir()
     set t = null
endfunction

// \\\\\\\\\\\\\\\\\\\\\\\
function start_t_s1InGround takes nothing returns nothing
local timer t = CreateTimer ()
     call TimerStart( t, 0.37, false, function end_t_s1InGround)
     call SaveRealBJ( (10.00 - LoadRealBJ(1, 6, udg_hash)) , 1, 6, udg_hash )
     set t = null
endfunction

// \\\\\\\\\\\\\\\\\\\\\\\


function Trig_InGround_Func001A takes nothing returns nothing
    local unit kbunit = GetEnumUnit()
    call SaveUnitHandleBJ( kbunit, 1, 6, udg_hash )
    call start_t_s1InGround()
    call GroupRemoveUnitSimple( kbunit, udg_GroupInGround )
    set kbunit = null
endfunction

function Trig_InGround_Actions takes nothing returns nothing
    call ForGroupBJ( udg_GroupInGround, function Trig_InGround_Func001A )
    call SetUnitFlyHeightBJ( LoadUnitHandleBJ(1, 6, udg_hash), ( GetUnitFlyHeight(GetEnumUnit()) - LoadRealBJ(1, 6, udg_hash)), 1.00 )
if GetUnitFlyHeight(LoadUnitHandleBJ(1, 6, udg_hash)) <= 0.00 then
    call IssueImmediateOrderBJ( LoadUnitHandleBJ(1, 6, udg_hash), "unravenform" )
    call UnitRemoveAbilityBJ( 'A005', LoadUnitHandleBJ(1, 6, udg_hash) )
endif
endfunction

//===========================================================================
function InitTrig_InGround takes nothing returns nothing
    set gg_trg_InGround = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_InGround, 0.05 )
    call TriggerAddAction( gg_trg_InGround, function Trig_InGround_Actions )
endfunction
как только юнит заносится в udg_GroupInAir то вар вылетает
Старый 19.11.2011, 03:24
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
нет, оно фаталит не сразу =) увеличь всем таймерам период и засунь в каждую функцию по отладочному сообщению, сразу после локальных переменных, так ты узнаешь, в какой функции лажа.
Старый 19.11.2011, 03:38
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
FellGuard:
нет, оно фаталит не сразу =) увеличь всем таймерам период и засунь в каждую функцию по отладочному сообщению, сразу после локальных переменных, так ты узнаешь, в какой функции лажа.
сделал вывод сообщения, как только дело доходит то пика юнитов в группе, фатал, даже локалки не успевает создавать (наверное))
Hatsume_Hate добавил:
function Trig_InAir_Func001A takes nothing returns nothing
    local unit kbunit = GetEnumUnit()
    local unit unt
    call CreateNUnitsAtLoc( 1, 'u001', Player(PLAYER_NEUTRAL_PASSIVE), GetUnitLoc(udg_Dante), bj_UNIT_FACING )
    set unt = GetLastCreatedUnit()
call DisplayTextToForce( GetPlayersAll(), "1" )
    call SaveUnitHandleBJ( kbunit, 1, 5, udg_hash )
call DisplayTextToForce( GetPlayersAll(), "2" )
    call start_t_s1InAir()
call DisplayTextToForce( GetPlayersAll(), "3" )
    call UnitAddAbilityBJ( 'A005', kbunit )
call DisplayTextToForce( GetPlayersAll(), "4" )
    call IssueImmediateOrderBJ( kbunit, "ravenform" )
call DisplayTextToForce( GetPlayersAll(), "5" )
    call GroupRemoveUnitSimple( kbunit, udg_GroupInAir )
call DisplayTextToForce( GetPlayersAll(), "6" )
    call IssueTargetOrderBJ( unt, "firebolt", kbunit )
    set kbunit = null
endfunction

function Trig_InAir_Actions takes nothing returns nothing
    call ForGroupBJ( udg_GroupInAir, function Trig_InAir_Func001A )
    call SetUnitFlyHeightBJ( LoadUnitHandleBJ(1, 5, udg_hash), ( GetUnitFlyHeight(LoadUnitHandleBJ(1, 5, udg_hash)) + LoadRealBJ(1, 5, udg_hash)), 1.00 )
endfunction
где то сдесь проблема... только хз где
Hatsume_Hate добавил:
проблема в
call IssueImmediateOrderBJ( kbunit, "ravenform" )
........
омг WTF?!
Старый 19.11.2011, 03:46
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Распиши лучше, что вообще должно происходить? Почитал код, впал в лёгкий ступор из-за организации: зачем для каждого пикнутого юнита создавать таймер, зачем потом для сработавшего таймера пускать ещё таймер, зачем разбивать код на такую плохочитаемую цепь функций мне непонятно
FellGuard добавил:
Как бы, пик юнитов происходит сразу, для группы, достаточно одного таймера на группу юнитов.
Старый 19.11.2011, 03:59
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
FellGuard:
Распиши лучше, что вообще должно происходить? Почитал код, впал в лёгкий ступор из-за организации: зачем для каждого пикнутого юнита создавать таймер, зачем потом для сработавшего таймера пускать ещё таймер, зачем разбивать код на такую плохочитаемую цепь функций мне непонятно
это постепенное "подбрасывание" юнита вверх, удар заносит юнита в группу, первый тригг пикает всех в этой группе, делает с ними действия и выбрасывает с группы занося в хэш таблицу, таймеры запускают по завершении следующий таймер, при этом они меняю значения в хэш таблице, меняют по сути скорость подбрасывания, тоесть первые 0.37 секунд он подбрасывается каждые 0.5 сек на 25 единиц, затем следующие 0.18 на 10 и тд... по окончании он заносит этого юнита в группу udg_GroupInGround а тот делает все до наоборот и при значени высоты 0 или меньше превратит в такую же единицу но уже с типом ходьбы "пеший"
>FellGuard добавил:
Как бы, пик юнитов происходит сразу, для группы, достаточно одного таймера на группу юнитов.
двигать юнитов на одно и тоже значение для меня как то некрасиво, подобным способом я отталкиваю юнитов, и выглядит это довольно красиво, и постепенно
Старый 19.11.2011, 04:01
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Ага, значит, по пунктам.
  1. Ты в курсе, что однажды добавив (и даже после того, как отберёшь) абилу 'Amrf' и производные (или же вообще любой другой морф в летающего) ты уже можешь менять ему высоту?
  2. Тип передвижения при этом не меняется, приказ отдавать не нужно, можно и так менять.
  3. Что для того, чтобы плавно поднять/опустить юнита не нужен таймер с малым тиком, достаточно указать rate, с которым будет поднимать юнита в воздух функция SetUnitFlyHeight?
  4. Что если ты делаешь что-то периодически с группой, то таймера достаточно одного на всю группу? Если тебе необходимо менять их высоту различным образом, то одного таймера по-прежнему достаточно, а вот ключевые высоты можно задавать в рандомных пределах.
FellGuard добавил:
Ну т.е. я что хочу сказать - проектировка алгоритма хромает) Его стоило бы переделать.
Старый 19.11.2011, 04:11
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
FellGuard:
Ага, значит, по пунктам.
  1. Ты в курсе, что однажды добавив (и даже после того, как отберёшь) абилу 'Amrf' и производные (или же вообще любой другой морф в летающего) ты уже можешь менять ему высоту?
  2. Тип передвижения при этом не меняется, приказ отдавать не нужно, можно и так менять.
  3. Что для того, чтобы плавно поднять/опустить юнита не нужен таймер с малым тиком, достаточно указать rate, с которым будет поднимать юнита в воздух функция SetUnitFlyHeight?
  4. Что если ты делаешь что-то периодически с группой, то таймера достаточно одного на всю группу? Если тебе необходимо менять их высоту различным образом, то одного таймера по-прежнему достаточно, а вот ключевые высоты можно задавать в рандомных пределах.
тоесть, если у юнита будет абилка "превратиться в ворона" но она будет в спеллбуке закрытом, то я уже могу менять ему высоту? О_О
рейт ну не то как то.. ненаю, по мне так кажется таймерами будет красивее.
четвертый пункт поподробнее можно?
Ну т.е. я что хочу сказать - проектировка алгоритма хромает) Его стоило бы переделать.
зато работает!)) Q.Q
Старый 19.11.2011, 04:11
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Ключевое понятие в программировании чего-либо (особенно графики) это достаточность) Т.е. чего достаточно для того, чтобы добиться нужного эффекта, никто не станет жертвовать производительностью в ущерб здравому смыслу. =) Именно поэтому придумали всякие трилинейные фильтрации, мипмапы, порталы и всё такое прочее; только поэтому и можно рубиться в 3d шутер без тормозов/наличия мэйнфрейма в кач-ве системного блока. Это что касается фразы "зато работает"
Да, можно добавить и тут же убрать абилу, не обязательно даже городить спеллбук, всё уже работает.
Рейт хорош для линейного плавного поднимания, если тебе нужно более-менее реалистичное подкидывание, то меняй периодически высоту в определённое время. Как раз таки одним таймером на группу.
А вот уже настройки персональных высот можно как раз высчитывать в группе для каждого юнита - исходя из рандома или каких-то других соображений (например, предполагаемого веса юнита).

FellGuard добавил:
Щас графический примерчик кину)
Старый 19.11.2011, 04:19
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
FellGuard:
Ключевое понятие в программировании чего-либо (особенно графики) это достаточность) Т.е. чего достаточно для того, чтобы добиться нужного эффекта, никто не станет жертвовать производительностью в ущерб здравому смыслу. =) Именно поэтому придумали всякие трилинейные фильтрации, мипмапы, порталы и всё такое прочее; только поэтому и можно рубиться в 3d шутер без тормозов/наличия мэйнфрейма в кач-ве системного блока. Это что касается фразы "зато работает"
Да, можно добавить и тут же убрать абилу, не обязательно даже городить спеллбук, всё уже работает.
Рейт хорош для линейного плавного поднимания, если тебе нужно более-менее реалистичное подкидывание, то меняй периодически высоту в определённое время. Как раз таки одним таймером на группу.
А вот уже настройки персональных высот можно как раз высчитывать в группе для каждого юнита - исходя из рандома или каких-то других соображений (например, предполагаемого веса юнита).
FellGuard добавил:
Щас графический примерчик кину)
можно не только графический но и текстовый) ибо до меня не доходит как еще можно)
Старый 19.11.2011, 04:22
FellGuard
Losyash
offline
Опыт: 39,547
Активность:

Тут основная идея - менять высоту всё той же SetUnitFlyHeight с фиксированным рейтом. Параболу можно построить из простых прямых.

FellGuard добавил:
Причём временную ось если разбить на равные "ключевые" отрезки, в которых будет меняться траектория на следующую прямую, то всё это делается одним единственным таймером. Значения высот же задаются ручками.
Старый 19.11.2011, 04:39
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
FellGuard:
Тут основная идея - менять высоту всё той же SetUnitFlyHeight с фиксированным рейтом. Параболу можно построить из простых прямых.
о загнул))
мне нужно простое поднимание вверх и опускание вниз, ну ты меня подтолкнул на пару мыслей)
Старый 19.11.2011, 04:39
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Т.е. главные принципы: достаточно одной группы, достаточно одного таймера, достаточно одного триггера и нескольких функций. Не обязательно городить кучу таймеров только потому, что траектории нужны разные. Сохраняй ключевые параметры для юнита в группе в хэштаблицу, и при каждом тике уже исходя из них высчитывай траекторию. Математика рулит)
Старый 19.11.2011, 04:45
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
FellGuard:
Т.е. главные принципы: достаточно одной группы, достаточно одного таймера, достаточно одного триггера и нескольких функций. Не обязательно городить кучу таймеров только потому, что траектории нужны разные. Сохраняй ключевые параметры для юнита в группе в хэштаблицу, и при каждом тике уже исходя из них высчитывай траекторию. Математика рулит)
а я ее с 4 класса не учу) все отбили желание ею овладевать))
спасибо за все)
Hatsume_Hate добавил:
сделал так, но ничего не происходит о_о..
Миниатюры
Кликните на картинку для увеличения
Название:  12365321.JPG
Просмотров: 9
Размер:  118.9 Кбайт  
Старый 19.11.2011, 04:59
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Держи, в общем. Наглядностью и оптимизацией там и не пахнет, но, думаю, разберёшься.
Прикрепленные файлы
Тип файла: w3x Jmp.w3x (16.5 Кбайт, 3 просмотров )
Старый 19.11.2011, 06:26
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
FellGuard:
Держи, в общем. Наглядностью и оптимизацией там и не пахнет, но, думаю, разберёшься.
щас гляну.. а у мя условия не работают магическим образом...
Миниатюры
Кликните на картинку для увеличения
Название:  aaaaaaaa.JPG
Просмотров: 13
Размер:  78.2 Кбайт  
Старый 19.11.2011, 06:34
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
100 это маленький рэйт). Он очень долгий, 500-700 уже лучше, 1000 - быстрый. Смотри карту, не нужно столько условий, можно значения по формуле высчитывать... Таймер там стоит 0.01, можно уменьшить частоту срабатываний до 0.10 и реже, но тогда нужно будет рейт тоже задавать формулой, или движение будет отрывистым.
Старый 19.11.2011, 06:41
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
FellGuard:
100 это маленький рэйт). Он очень долгий, 500-700 уже лучше, 1000 - быстрый. Смотри карту, не нужно столько условий, можно значения по формуле высчитывать... Таймер там стоит 0.01, можно уменьшить частоту срабатываний до 0.10 и реже, но тогда нужно будет рейт тоже задавать формулой, или движение будет отрывистым.
попробовал перенести то что в твоей карте на свою.. и чтож ты думаешь... ничего не работает....
обожемой.. все надо идти спать, уже ничего не соображаю, не заметил кое каких срок, изменили заработало, думаю смогу подогнать это чудо под себя, все, буду приносить каждую субботу в честь тебя жертвоприношения...
Старый 19.11.2011, 07:02
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 18:20.