У меня не так много фильтров. 1 или 2. На каждую способность свой фильтр создавать или хватит и одного на всю карту. Где-то в старых вопросах/ответах говорилось что можно использовать 1 фильтр на всю карту?

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

а как можно сделать без boolexpr-а?
Просто использовать функции.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
1
27
2 недели назад
1
Если условия фильтров одни и те же, то одного достаточно
1
32
2 недели назад
1
Ну как правило делают заготовку фильтров на все случаи жизни и используют их для for group.
1
18
2 недели назад
1
Можно 1 фильтр, можно и много. Можно в него как в матрешку засунуть несколько "базовых" функций boolean, и на каждый фильтр делать разное сочетание этих функций.
Использовать - для поиска юнитов вокруг точки или юнита через group enum units; в триггер запихивать, в событие, если надо не на всех юнитов его юзать; для for group; для множества абилок можно сделать массив и пихать фильтры по индексу
Ответы (24)
0
2
2 недели назад
Отредактирован Joma
0
EugeAl, Ну, мне главное не удобство, а высокая скорость работы нужна)
1
29
2 недели назад
Отредактирован nazarpunk
1
а высокая скорость работы нужна)
Высокая скорость работы и булэкспры. Или вообще не дай боже гуй-муй.
1
18
2 недели назад
1
Joma, Скорость отличная, проблем не возникало с тормозами.
Ещё пример, добавлю
Допустим надо сделать 60 абилок
они кастуются по группе юнитов каждая через даммикаст
у них всех разные ид, приказы, итд
если у героя есть навык, цена маны меньше
имеются другие ауры, защищающие войска от разных абилок каждая
как это сделать?
Проще всего сделать параметры таблицей, записать всё в массивы, и юзать 1-2 простыми скриптами все абилки по поиску индекса. За неимением в джассе function array, boolexpr это выход )
2
23
2 недели назад
2
неимением в джассе function array
Это боль :(
Как те-же многомерные массивы и другие фичи программирования, которым уже больше 20-30 лет.
2
18
2 недели назад
2
konvan5, многомерный массив можно сделать, к счастью. Через "константы столбцов" в духе set a = array [i], set b = array[10+i], и тд ) а функции- боль, да )
0
29
2 недели назад
0
и юзать 1-2 простыми скриптами все абилки по поиску индекса.
А поиск индекса обязательно написать O(n). Иначе никакого быстродействия не будет.
0
29
2 недели назад
0
Как те-же многомерные массивы и другие фичи программирования
Ну вот к примеру есть AngelScript с этими вашими фичами. Что-то я не вижу чтоб фанаты производительности на него переходили.
0
23
2 недели назад
0
nazarpunk, и это шикарно, что хоть фанаты делают все, что должны были cделать маленькие инди-корпорации изначально :D
0
29
2 недели назад
0
konvan5, фанаты делают. А те кто ноет про производительность что-то не спешат пользоваться и горазды только обмазываться гуй-муй и ныть.
1
23
2 недели назад
1
EugeAl, костыли наше все)
0
2
2 недели назад
0
nazarpunk, оно ведь только вчера вышло. Возможно требуется время.
0
29
2 недели назад
0
Возможно требуется время.
Возможно требуется нечто другое.
0
18
2 недели назад
0
nazarpunk, что такое O(n)? Функция по поиску?
konvan5, что ж поделать) главное - работает)
0
23
2 недели назад
Отредактирован konvan5
0
EugeAl, O(n) в программировании обозначает сложность (или время) алгоритма, что в данном случае говорит о выполнении n операций для нахождения. К примеру плохим временм будет O(n*n) для таких поисков (это как цикл в цикле, только зачем так делать для поиска, это вопрос, но кто-то может сделать), или O(2*n). Идеал - это O(1), 1 операция для проверки без циклов.
0
29
2 недели назад
0
это как цикл в цикле, только зачем так делать для поиска, это вопрос, но кто-то может сделать
Квадратичную сложность гуишники через одного юзают, когда собственные ауры делают.
0
18
2 недели назад
0
konvan5, Ясно, спасибо. А О(100) это плохо или нормально? С циклом
0
29
2 недели назад
0
Ясно, спасибо. А О(100) это плохо или нормально?
Если ты напишешь сортировку массива произвольной длинны за O(100), то тебе дадут Нобелевку.
0
23
2 недели назад
0
EugeAl, если 100 элементов в массиве, то тогда нормально :)
0
29
2 недели назад
Отредактирован nazarpunk
0
konvan5:
При ста элементах это же O(n).
0
23
2 недели назад
0
nazarpunk, ну так он же не спрашивал, сколько элементов у него :D
0
29
2 недели назад
0
konvan5, один.
0
18
2 недели назад
0
nazarpunk, только произвольно до 100 ячеек смогу)
konvan5, спасибо, ок)
0
29
2 недели назад
0
только произвольно до 100 ячеек смогу)
Сортировка 100 элементов за 100 действий это O(n). Уж очень хочу на это посмотреть. Есть пример?
0
18
2 недели назад
0
nazarpunk, не совсем сортировка, а определение индекса массива по значению. Подходит?
0
2
2 недели назад
0
Или вообще не дай боже гуй-муй.
Разве на ГУИ можно использовать boolexpr? Нет же, ведь.
1
29
2 недели назад
1
Разве на ГУИ можно использовать boolexpr?
Можно.
3
37
2 недели назад
3
Как те-же многомерные массивы и другие фичи программирования, которым уже больше 20-30 лет.
Временные глобальные переменные для широкого спектра функций сразу, благо один поток и можно спокойно выгружать и загружать
Ответы (6)
0
2
2 недели назад
0
ScorpioT1000, Получается, я могу использовать одну глобальную переменную, условно "Кастер". И допустим, примерно в одно и тоже время разные игроки применят свои способности, в которых запустятся периодические таймеры. И в каждой способности каждого игрока будут прогонять поочередно эту переменную "Кастер"? И никаких нестыковок же не будет?
1
37
2 недели назад
Отредактирован ScorpioT1000
1
Joma, нет, надо выгружать и загружать при моментальном вызове. Это для замены массивов как аргумента. Если есть таймеры - это уже нужно адресное выделение xgm.guru/p/wc3/w3specialprogramming#h4
0
2
2 недели назад
0
ScorpioT1000, Не дописал свой вопрос более точно)
Если примерно такой:
globals
	unit Caster = null	//Эту переменную используют все
endglobals

function My_Filter takes nothing return boolean
	return IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(Caster))	//Вот она!
endfunction

function Two takes nothing return nothing
	local timer t = GetExpiredTimer()
	local integer id = GetHandleId(t)
	local unit caster = LoadUnitHandle(Hash, id, 1)
	
	set Caster = caster	//Вот она!
	//Тут какие-то действия с группой
	
	set t = null
	set caster = null
endfunction

function One takes nothing return nothing
	local unit caster = GetTriggerUnit()
	local timer t = CreateTimer()
	local integer id = GetHandleId(t)
	
	call SaveUnitHandle(Hash, id, 1, caster)
	call TimerStart(t, 0.035, true, function Two)
	
	set caster = null
	set t = null
endfunction
То, не проканает?
1
37
2 недели назад
1
Joma, советую почитать статьи
0
29
2 недели назад
0
То, не проканает?
Ну вот что мешает писать код руками?
globals
    unit Caster
    integer CasterId
    unit Target
    timer Timer
    integer TimerId
    group Group = CreateGroup()
endglobals

function isTargetEnemy takes nothing returns boolean
    return IsUnitEnemy(Caster, Target)
endfunction

function GroupIterator takes nothing returns nothing
    set Target = GetEnumUnit()

    if not isTargetEnemy() then
        return
    endif

    // Продолжаем
endfunction

function Two takes nothing returns nothing
    set Timer = GetExpiredTimer()
    set TimerId = GetHandleId(Timer)
    set Caster = LoadUnitHandle(Hash, TimerId, 'cstr')

    call ClearGroup(Group)
    call GroupEnumUnitsInRange(Group, GetUnitX(Caster), GetUnitY(Caster), 500, null)
    call ForGroup(Group, function GroupIterator)
endfunction

function One takes nothing returns nothing
    set Caster = GetTriggerUnit()
    set Timer = CreateTimer()
    set TimerId = GetHandleId(Timer)

    call SaveUnitHandle(Hash, TimerId, 'cstr', Caster)
    call TimerStart(t, 0.035, true, function Two)
endfunction
0
2
2 недели назад
Отредактирован Joma
0
nazarpunk, Вообще-то я ни это имел в виду.
ScorpioT1000, Получается, я могу использовать одну глобальную переменную, условно "Кастер". И допустим, примерно в одно и тоже время разные игроки применят свои способности, в которых запустятся периодические таймеры. И в каждой способности каждого игрока будут прогонять поочередно эту переменную "Кастер"? И никаких нестыковок же не будет?
вообще-то я спрашивал про то, что если например у меня будет 1 фильтр (пусть будет 1 булэкспр) и 1 глобальная переменная условно "Кастер". И если её будут использовать все игроки для фильтра юнитов (не враг ли этот фильтруемый юнит к нам) в многократном таймере - то не будет ли каких либо проблем, вроде в одно и тоже время 2 и более игроков будут использовать эту самую переменную "кастер". Грубо говоря из MUI, не превратиться ли это в "Не MUI"?
0
29
2 недели назад
0
а определение индекса массива по значению
Если тебе такое понадобилось, то что-то явно пошло не так.
Ответы (2)
0
18
2 недели назад
0
nazarpunk, что то - это нежелание делать хэш таблицу. Ибо геморрой с функциями, а не просто обращения к значениям.
0
29
2 недели назад
0
EugeAl, это не нежелание а банальная рукожопость.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.