Лучший ответ:
» объяснение
если ты читал статью, то знаешь имеешь представление о том, что такое локальная переменная и в чем разница между глобальной переменной. И область их применения.
Kolya12, вот допустим есть два одинаковых юнитов с одинаковыми абилками. Один юнит принадлежит тебе, второй другому игроку. Ты применяешь скилл, который вешает эффект на 15 секунд. После чего должен удалиться эффект. Эффект нужно где-то сохранить, верно? И юнита, на которого повесили эффект, также нужно сохранить. Проще говоря нужны ссылки. нужно на что-то ссылать. Все переменные - это ссылки на объекты. Так вот, если вдруг другой игрок в это время возьмет и применит скилл, и перезапишет глобалки на юнита, и на эффект. Чтобы этого не было существуют локалки.
На самом деле локалки действуют внутри функции, это их недостаток (в гуи вообще не применимо, там часто будет вызов других функции). Внутри функции можно только с вэйтами поиграть. работает норм. Но, если вызвать отдельную функцию локалки не помогут, нужно с помощью глобалок переносить на другие функции или использовать аргументы функции. Ты берешь ссылку юнита и переносишь на другой триггер, где периодично что-то делает с ней (возможно там где-то по случайности переписали ее).
Есть проблема во времени, если будет задержка, то глобалки можно перезапить за это время. И в игре нарушится все. Нормально локалки работают с вэйтами внутри функции. Но, если хочется сделать что-то большое, например, каждую секунду наносить урон от лица юнита. То тут нужен таймер или триггер с периодичным таймером. Тут локалки не помогут. И кстати вэйт работает дольше указанного.
Если взять и создать несколько юнитов, и попробовать взять всех их заставить запустить одновременно одну способность. То тут выяснится, что триггер не выполняет параллельно, а последовательно. Можно проверить дебагом. Короче триггер выполняет поочередно, и мгновенное, если нет никаких временных задержек между ними. Может быть и есть исключение, но не проверял (например на ExecuteFunc). Проще говоря, локи не обязательны, не понятно зачем они нужны (но мне они нужны для удобства, еще плюсы в них есть), можно всю игру юзать глобалки (темповые глобалки, короче временные ссылки). На самом деле нужно посмотреть как используют МУИ (там используют массивы, для каждого потока можно создавать свой массив, например есть счетчик потока GetTriggerExecCount xgm.guru/p/wc3/184282 или использовать переменную в качестве счетчика).
Допустим, если два юнита запускают одновременно один скилл. Он обработает сначало первый запуск триггера, потом второй запуск. Короче два потока запускает последовательно. Но, если в триггере написано что между частями триггера есть вэйт, то пропустит и запустит следующий поток. То есть, первый поток остановится на паузу из-за вэйта, игра решит не ждать, и запустит следующий поток.
Кстати говоря, аргументы (параметры) функции - это тоже локальные переменные. Где-то прочел.
Представь, идет действие - потом какая задержка во времени (вэйтом или таймером) - затем продолжение триггера. Если во время задержки перезаписали ссылки. то все. Нужно делать так, чтобы не пересекались ссылки между собой. Для этого существует МУИ, хэш-таблица + хэндлы + локалки.
тут просто сложная система у тебя, так нагорожена и запутано. Я убрал лишнее и написал на jass. косяк в том, что между триггерами Jump и JumpFlyLoop есть ссылка (переменная), которую, видимо, перезаписывают. Также повторное использование другим юнитом перезапишет в Jump еще раз. Твои триггеры сложно было читать, все эти манипуляции локалками-глобалки, и наоборот, только путают. Где то в этих манипуляциях ты ошибся, раз не хотят опускать на землю. По логике их должно опустить после опр. времени (это после вэйта в Jump). Посмотрел бы как делаются прыжки на сайте. на хайве. Хотел недавно найти прыжок самурая-орка, когда в прыжке анимацию проигрывает, и показывает. что рубит сверху. Красиво сделано. Но не нашел (придеться самому делать), все время попадаются уродливые прыжки, особенно как у тебя (извини не хотел обидеть, просто прыжок не выглядит настоящим, реальным). гуи и муи много попадались.



Просмотров: 375

Это сообщение удалено
Uber #2 - 6 месяцев назад 0
И почему при объявление спецэффектов локальными карта не запускается
local effect JumpTrailEffects[0]
local effect JumpTrailEffects[1]
Так это же локальный массив, насколько я помню, они объявляются по-другому:
local array effect JumpTrailEffects
А потом уже используются JumpTrailEffects[0], JumpTrailEffects[1], ...
Steal nerves #3 - 6 месяцев назад (отредактировано ) 0
  1. первый скрин - это что-то с библиотекой. Скидывай карту.
  2. со вторым ты не правильно делаешь, видимо ты новичок. надо статьи прочитать. Ты просто с локалками что-то не то делаешь, надо через CS прописывать, просто гуи не видит локи. xgm.guru/p/wc3/jass_local_vars Но я не сторонник слать, ибо нет норм статьи у нас "как превратить из новичка в jassера".
» то что ты делаешь с локалками
я конвентировал в код
есть локалка JumpCaster и есть глобалка udg_JumpCaster - это две разные вещи
function Trig_Jump______________________2_Actions takes nothing returns nothing
    //локалки
	local unit JumpCaster 
    local location JumpCasterPoint
    local location JumpTargetPoint
    local location JumpSecSecPoint
    call CreateNUnitsAtLoc( 1, 'hfoo', Player(PLAYER_NEUTRAL_PASSIVE), GetSpellTargetLoc(), bj_UNIT_FACING ) //GetSpellTargetLoc() - это точка, утечка и BJ можно раскрыть
    set udg_JumpCaster = GetSpellAbilityUnit() //тут в глобалку засовываешь
    set udg_JumpCasterPoint = GetUnitLoc(GetSpellAbilityUnit()) //тут тоже в глобалку засовываешь
    set udg_JumpTargetPoint = GetUnitLoc(GetLastCreatedUnit()) //тоже в глобалку засовываешь
    call RemoveUnit( GetLastCreatedUnit() ) //я так понял ты создал даймика для проверки проходимости раз сразу удаляешь. мб проверять точку на проходимость заранее, в варе есть нативка
    call PauseUnitBJ( true, udg_JumpCaster ) //паузим кастера
    call SetUnitPathing( udg_JumpCaster, false ) //снимаем проходимость
    set udg_JumpTrailEffects[0] = GetLastCreatedEffectBJ() //это глобалка
    set udg_JumpTrailEffects[1] = GetLastCreatedEffectBJ() //зачем повторно? GetLastCreatedEffectBJ() - эта одна и та же, но в разных массивах храниться будет
    call UnitAddAbilityBJ( 'Amrf', udg_JumpCaster ) //глобалка, добавляем ворону
    call EnableTrigger( gg_trg_JumpFlyLoop_____________________u ) //включаем триггер, перемещает каждую 0,01 сек. ближе к точке, ссылка на кастера это udg_JumpCaster и точку udg_JumpTargetPoint, в качестве ссылки нужен тут хэш или МУИ + таймер 
    call SetUnitFlyHeightBJ( udg_JumpCaster, 350.00, 350.00 ) //поднимаем
    call TriggerSleepAction( 0.46 )  //вэйт, ждем
//после вэйта глобалки могут быть перезаписаны (например, тебе захочется нажать еще раз), лучше ссылать на локалки

    call SetUnitFlyHeightBJ( udg_JumpCaster, 0.00, 350.00 ) //опускаем
    call TriggerSleepAction( 0.30 ) //вэйт. ждем
    call ResetUnitAnimation( udg_JumpCaster )
    call DisableTrigger( gg_trg_JumpFlyLoop_____________________u ) //выкл. триггер
    call TriggerSleepAction( 0.03 ) //ждем
    call UnitRemoveAbilityBJ( 'Amrf', udg_JumpCaster ) //удаляем ворону
    call PauseUnitBJ( false, udg_JumpCaster ) //паузу снимаем
    call SetUnitPathing( udg_JumpCaster, true ) //проходимость включ.
    call RemoveLocation(udg_JumpTargetPoint) //все точки удалил?
    call RemoveLocation(udg_JumpCasterPoint)
    set udg_JumpCaster = null
    call DestroyEffectBJ( udg_JumpTrailEffects[0] )
    call DestroyEffectBJ( udg_JumpTrailEffects[1] )
//забываешь обнулить локалки типа юнит. точки
endfunction
» надо было так с локалками делать (не через менюшки ГУИ, а через код)
получился не полным
    local unit JumpCaster = GetSpellAbilityUnit()
    local location JumpCasterPoint = GetUnitLoc(GetSpellAbilityUnit())
    local location JumpTargetPoint = GetSpellTargetLoc()
    local location JumpSecSecPoint
    call CreateNUnitsAtLoc( 1, 'hfoo', Player(PLAYER_NEUTRAL_PASSIVE), JumpTargetPoint, bj_UNIT_FACING )
	call RemoveLocation(JumpTargetPoint)
	set JumpTargetPoint = GetUnitLoc(GetLastCreatedUnit()) //не знаю зачем такая сложность. мб ты даймиком проверяешь можно ли туда телепортнуть
» мои глаза
И почему при объявление спецэффектов локальными карта не запускается
local effect JumpTrailEffects[0]
local effect JumpTrailEffects[1]
потому что это неправильно тоже, нужно объявить что эта переменная с массивами, например
local effect array JumpTrailEffects
а потом уже
set JumpTrailEffects[0] = ...
set JumpTrailEffects[1] = ...
Kolya12 #4 - 6 месяцев назад (отредактировано ) 0
Сменил фоточки, почему карта не проверяется,выбрасывает в главное меню игры.
Карта тоже обновлена.
Как только объявляю локалки, выбрасывает в главное меню.
Steal nerves #5 - 6 месяцев назад (отредактировано ) 0
Kolya12, смотри на скрин
Пометил ошибки номерами на скрине:
  1. ошибка локальные переменные объявляются всегда первыми. Если там будет какое-то другое действие, а объявление локалок ниже, то это ошибка. Ты вперед поставил действие "включить триггер ...", а потом начал объявлять локи
  2. во-втором скрине там ты не объявил. Там на каждую функцию надо объявлять новые локальные переменные. то есть локалка работает внутри функции (конвентируй и посмотри как там устроено), в других функциях эта переменная не работает, ее не существует (короче область действия своя у локалки, вначале она объявляется, в конце блока функции перестает работать). вот пишешь: "set u = GetTriggerUnit()", но эта переменную игра может не распознать, так как не существует, даже, если она объявлена в другой функции (в другом триггере или где-то там еще) там другая локалка, хотя имена одинаковы. Во-втором скрине ты заново объяви
почему локалки не обнуляем?
прикреплены файлы
Kolya12 #6 - 6 месяцев назад (отредактировано ) 0
Серавно карта не проверяется.Обновил скрин и карту. Сделал как сказал, объявил локалки первыми и в обоих триггерах.
-почему локалки не обнуляем? Не знаю как. set Caster=null , так обнулять?
Hate #7 - 6 месяцев назад 0
если используете жнгп, кириллица до карты и/или редактора?
Steal nerves #8 - 6 месяцев назад (отредактировано ) 0
жалуется редактор на JumpSecPoint, неправильно написали где-то название переменной вот и ошибка. То есть такая переменная не существует и игра не распознает ее. Подсказка: ошибка в триггере JumpFlyLoop
убрал эту переменную, теперь указывается ошибку на другую строчку. Убрал, на еще одну. где-то с третьей попытки запустилось
р
прикреплены файлы
Kolya12 #9 - 6 месяцев назад 0
Когда используют способность одновременно более одного юнита,то все кроме одного повисают в воздухе.Обновил скрин и карту.
Hate #10 - 6 месяцев назад 0
Kolya12:
Когда используют способность одновременно более одного юнита,то все кроме одного повисают в воздухе.Обновил скрин и карту.
встречный вопрос - а почему собственно не должны? у вас нету мульти применения, только для одного юнита
Kolya12 #11 - 6 месяцев назад (отредактировано ) 0
Я засунул юнита который применил способность в локалку, следовательно остальные действия совершаю именно с ней. Не понимаю в чем косяк.
Steal nerves #12 - 6 месяцев назад (отредактировано ) 0

» объяснение
если ты читал статью, то знаешь имеешь представление о том, что такое локальная переменная и в чем разница между глобальной переменной. И область их применения.
Kolya12, вот допустим есть два одинаковых юнитов с одинаковыми абилками. Один юнит принадлежит тебе, второй другому игроку. Ты применяешь скилл, который вешает эффект на 15 секунд. После чего должен удалиться эффект. Эффект нужно где-то сохранить, верно? И юнита, на которого повесили эффект, также нужно сохранить. Проще говоря нужны ссылки. нужно на что-то ссылать. Все переменные - это ссылки на объекты. Так вот, если вдруг другой игрок в это время возьмет и применит скилл, и перезапишет глобалки на юнита, и на эффект. Чтобы этого не было существуют локалки.
На самом деле локалки действуют внутри функции, это их недостаток (в гуи вообще не применимо, там часто будет вызов других функции). Внутри функции можно только с вэйтами поиграть. работает норм. Но, если вызвать отдельную функцию локалки не помогут, нужно с помощью глобалок переносить на другие функции или использовать аргументы функции. Ты берешь ссылку юнита и переносишь на другой триггер, где периодично что-то делает с ней (возможно там где-то по случайности переписали ее).
Есть проблема во времени, если будет задержка, то глобалки можно перезапить за это время. И в игре нарушится все. Нормально локалки работают с вэйтами внутри функции. Но, если хочется сделать что-то большое, например, каждую секунду наносить урон от лица юнита. То тут нужен таймер или триггер с периодичным таймером. Тут локалки не помогут. И кстати вэйт работает дольше указанного.
Если взять и создать несколько юнитов, и попробовать взять всех их заставить запустить одновременно одну способность. То тут выяснится, что триггер не выполняет параллельно, а последовательно. Можно проверить дебагом. Короче триггер выполняет поочередно, и мгновенное, если нет никаких временных задержек между ними. Может быть и есть исключение, но не проверял (например на ExecuteFunc). Проще говоря, локи не обязательны, не понятно зачем они нужны (но мне они нужны для удобства, еще плюсы в них есть), можно всю игру юзать глобалки (темповые глобалки, короче временные ссылки). На самом деле нужно посмотреть как используют МУИ (там используют массивы, для каждого потока можно создавать свой массив, например есть счетчик потока GetTriggerExecCount xgm.guru/p/wc3/184282 или использовать переменную в качестве счетчика).
Допустим, если два юнита запускают одновременно один скилл. Он обработает сначало первый запуск триггера, потом второй запуск. Короче два потока запускает последовательно. Но, если в триггере написано что между частями триггера есть вэйт, то пропустит и запустит следующий поток. То есть, первый поток остановится на паузу из-за вэйта, игра решит не ждать, и запустит следующий поток.
Кстати говоря, аргументы (параметры) функции - это тоже локальные переменные. Где-то прочел.
Представь, идет действие - потом какая задержка во времени (вэйтом или таймером) - затем продолжение триггера. Если во время задержки перезаписали ссылки. то все. Нужно делать так, чтобы не пересекались ссылки между собой. Для этого существует МУИ, хэш-таблица + хэндлы + локалки.
тут просто сложная система у тебя, так нагорожена и запутано. Я убрал лишнее и написал на jass. косяк в том, что между триггерами Jump и JumpFlyLoop есть ссылка (переменная), которую, видимо, перезаписывают. Также повторное использование другим юнитом перезапишет в Jump еще раз. Твои триггеры сложно было читать, все эти манипуляции локалками-глобалки, и наоборот, только путают. Где то в этих манипуляциях ты ошибся, раз не хотят опускать на землю. По логике их должно опустить после опр. времени (это после вэйта в Jump). Посмотрел бы как делаются прыжки на сайте. на хайве. Хотел недавно найти прыжок самурая-орка, когда в прыжке анимацию проигрывает, и показывает. что рубит сверху. Красиво сделано. Но не нашел (придеться самому делать), все время попадаются уродливые прыжки, особенно как у тебя (извини не хотел обидеть, просто прыжок не выглядит настоящим, реальным). гуи и муи много попадались.
прикреплены файлы