Нашёл описание как убрать утечку полярных координат. Через Custom Script определяются переменные (которые Я определил без Custom Script-а), и опытным путём (менял на стандартную функцию) удалось установить что главная строчка не работает, всё остальное работает и это не нужно здесь приводить. Копирую вам прямо из Custom Script-а, как есть:
call MoveLocation(udg_GlobalCurrentPoint1, GetLocationX(udg_GlobalCurrentPoint1) + udg_GlobalCurrentReal1 * CosBJ(udg_GlobalCurrentAngle), GetLocationY(udg_GlobalCurrentPoint1) + udg_GlobalCurrentReal1 * SinBJ(udg_GlobalCurrentAngle))

Принятый ответ

Сделал так. Использую только MoveLocation..., можно даже вообще не удалять переменную точки а лишь двигать её, как курсор мыши, и указывать молниеносно и невидимо для всех триггеров одной точкой что и куда им делать. Все стрелы полетели как надо, в россыпь. Хотя когда Я делаю удаление точки в конце, это не отражается на следующем вызове триггера, так что можно и удалять, главное не удалять когда она ещё нужна до завершения триггера. Проверил на Хендлах, один Хендл создаётся один раз, чтобы объявить эту точку, а то что двигаю в цикле никак не прибавляет Хендлы. Получилась точка-указатель, как курсор мыши, и одной хватает, ведь Warcraft однопоточный. Оставлю ещё вопрос открытым на несколько часов, может Я не прав и кто-то меня поправит.

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
7
6 лет назад
0
quq_CCCP, Maniac_91, ребята, вот вам ещё одна подсказка. В другом заклинании эта функция работает замечательно! Если Я что либо меняю, то юниты бегут не туда, но бегут, если оставить как есть, все бегут туда куда надо, и вроде бы всё правильно, но в этом заклинании не работает! Если ставлю обычную функцию Set Variable = Polar Coordinate..., а эту строчку убираю, то всё работает, но естественно с утечкой. Я уже голову сломал, всё просто как пень, а увидеть не могу!
0
32
6 лет назад
0
Dagger667, угол на bj_degtorad умножь, угол нужен в радианах, а у тебя градусы ( RandomAngle)
0
7
6 лет назад
0
quq_CCCP, вот это ты гад! ))))) У меня случается крах и всё закрывается! Причём два раза так пробовал!
Короче. Вот как у меня это было в том заклинании где работало:
set udg_GlobalCurrentAngle = AngleBetweenPoints(udg_GlobalCurrentPoint1, udg_GlobalCurrentPoint2)
Это угол между двумя точками. Потом эта переменная шла как здесь Random Angle.
Я сделал через GUI сейчас, всё заработало. Использовал стандартную функцию Преобразование - Convert Coordinates To Point, а остальное так же. Будут так утечки или нет? Только честно!
quq_CCCP, Проверил сейчас и то и то заклинание, всё работает. В одном Random Angle, в другом функция AngleBetweenPoints, но разницы никакой, работает чёрт возьми! Значит логически ты уже не прав. Причём когда работало с утечками, были заметные торможения, а теперь всё гладко, без лагов. Крутил камеру прямо на ходу, всё норм. Но по счётчику Хендлов сейчас сказать трудно, там и другие утечки идут... Думаю решено.
0
26
6 лет назад
0
Будут так утечки или нет?
будут
0
7
6 лет назад
0
Hate, так приятель, давай докапываться до истины! Загрузил чистую карту, удалил сценарии инициализации, оставил только счётчик Хендлов. Показывает 91 хендл - это абсолютно чистая карта, на сколько возможно. Далее, загрузил все необходимые переменные и функцию, запустил проверку, счётчик показал 93 уже. Отключил стандартную функцию Преобразование координат, но оставил всё остальное, что обслуживало её, это объявление трёх переменных и три строчки в конце их обнуления. Счётчик показал 93. То есть так же. Вывод практический - 0 хендлов, что включена она, что выключена, разницы никакой.
Теперь чисто теоретически. Как эта функция может создавать точку если она берёт чистые координаты по X и Y (цифры), и получившаяся точка записывается в переменную, которую потом можно благополучно удалить. Вывод теоретический, процесс контролируем, лишних точек она не создаёт. Докажи обратное если Я не прав! бубубуб не засчитывается!
Hate, Сорри, допустил маленькую ошибочку, 1 хендл прибавляется!
Финальный разбор показал. Функция Преобразование координат = 1 хендл, функция Полярный координат = 1 хендл, функция MoveLocation = 0 хендлов. Ну что ж, придётся признать что хендлы всё таки делаются, что ж тут поделать. Сегодня Я устал, завтра продолжу...
0
4
6 лет назад
0
скажи сколько по времени твоя карта будет играться, и как быстро утечки растут?
Весь этот дроч на оптимизацию, прямой код и устранение каждой утечки переоценен в вк3. В первую очередь геймплей продумай
0
32
6 лет назад
0
function PolarProjectionBJ takes location source, real dist, real angle returns location
    local real x = GetLocationX(source) + dist * Cos(angle * bj_DEGTORAD)
    local real y = GetLocationY(source) + dist * Sin(angle * bj_DEGTORAD)
    return Location(x, y)
endfunction
Вот это стандартное перемещение точки на гуях, но оно плодит еще одну точку, а стоит только заменить return Loacation(x,y) на MoveLocation( source, x, y) ну разумеется назвать функцию ка кто по другому и изменить аргументы и пользоваться, еще раз прошу обратить внимание что угол в радианах - angle * bj_DEGTORAD)
Кстати вот - ссылка
Почитай на досуге, там объясняется что к чему.
0
7
6 лет назад
0
Daniil18, считаю что стандарт - это игра 1 час. 2 часа - это если игрокам интересно доигрывать. И карту свою затачиваю для игры как минимум в 1 час - партия. Самое короткое - 40 минут. Как сделаю, выложу для вас для всех, делаю для людей безвозмездно. Карта типа Footman Frenzy, и хочу заменить свою картой стандартный Footman Frenzy, чтобы в мою карту играли, когда произносят это название, поэтому надо сделать более качественно, и никаких утечек!
Сейчас утечки попали в таймер и растут как на дрожжах. 4000~ утечек при старте, и далее растёт по ~1000 за 30 секунд, но волнами, то больше то меньше, потому что игра так устроена. Делал уже почти 4 месяца и теперь назад дороги нет, иначе вся работа зря делалась, и зря потратил время!
quq_CCCP, написал снова, снова произошёл вылет, причём когда Я ещё в редакторе писал. Понял что строка слишком длинная, слишком длинные названия переменных, но это мой стиль. Написал в две строки. Написал - "set udg_GlobalCurrentAngle = (udg_GlobalCurrentAngle * bj_DEGTORAD)". Не работает!
Стал экспериментировать, отключать и включать строки. Оказалось что проблема в другом, а эта формула работает нормально! Оказалось что "Pick every ... "останавливается когда идёт последняя строчка, в которой Я и не думал что может скрываться ошибка, и даже не рассматривал из-за простоты. Это - "call RemoveLocation(udg_GlobalCurrentPoint1)", которая и срабатывает в конце цикла чтобы удалить остаточную позицию, и по тихому ломает весь триггер, и никаких ошибок компиляции, ничего вообще! Я даже Wait добавлял чтобы дать побольше времени для срабатывания, не помогло. Вы не могли этого знать, это нужно было чисто мне определить, картостроителю. Добавил ещё в конец "set udg_GlobalCurrentPoint1 = null", так же ничего. Добавил объявление как локальной "local location udg_GlobalCurrentPoint1 = udg_IssueOrderRainArrows[udg_CurrentNumber1]" прямо в начале цикла, на каждого юнита, так же ничего. Но отключаю её и всё прёт и множится, но без неё смысл теряется. Значит удаляю Я неправильно! В другом заклинании просто срабатывает один раз, поэтому и не заметил. Какие будут ещё предложения?
0
32
6 лет назад
0
Dagger667, код в студию, где то значит допустил ошибку. У всех все работает, я уже привел пример как это работает в гуи, те же самые вычисления.
0
7
6 лет назад
0
quq_CCCP, Делаю полный скрин как есть, того участка кода на котором остановился, со всеми отключениями, как есть. Суть заклинания в том, что по краям карты появляются невидимые лучники, которые по этому триггеру выпускают стрелы, и они сыпятся как Дождь Стрел, и всё выглядит круто, их выбрать нельзя и не видно. Здесь три группы по 12 лучников, и 19 залпов, выпускают 684 стрелы, и им нужно указывать каждый раз случайную точку, куда летит каждая стрела вроссыпь, тут-то мне и нужны полярные координаты которые указывают случайные точки от места указанного заклинанием. И когда нужно использовать RemoveLocation ... происходит тихая остановка триггера, когда же Я использую просто set ... = null, всё идёт, но Я не знаю решает ли это проблему утечки. Я сделал появление Еретика, просто выбрал случайно юнита, чтобы понять сколько раз исполняется команда, один появился. Отключая эту функцию, появляется множество, что как бы намекает что проблема в ней.
На всякий случай делаю ещё два скрина того что до- этого блока кода, и того что после-,но не думаю что проблема там...
0
26
6 лет назад
0
мощно, удалять точку, а потом удивляться почему ничего не работает
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.