globals 
conditionfunc condFAST = null
endglobals

function DamageFunc takes nothing returns boolean
	set uENUM = GetFilterUnit() 
                
	if not IsUnitType(uENUM, UNIT_TYPE_STRUCTURE) and IsUnitEnemy(uENUM, GetOwningPlayer(uCAST)) and IsAlive(uENUM) then 
		call DamageUnit(uCAST, uENUM, LReal("Damage"), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL)
	endif
                
	return false
endfunction
                 
set condFAST = Condition(function DamageFunc)
call GroupEnumUnitsInRange(gFAST, x,y, 100, condFAST)
call DestroyCondition(condFAST)
или
call GroupEnumUnitsInRange(gFAST, x,y, 100, null)
loop
	set uENUM = FirstOfGroup(gFAST)
	exitwhen SysUnit == null
	
	if not IsUnitType(uENUM, UNIT_TYPE_STRUCTURE) and IsUnitEnemy(uENUM, GetOwningPlayer(uCAST)) and IsAlive(uENUM) then 
    	call DamageUnit(uCAST, uENUM, 10, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL)
    endif

	call GroupRemoveUnit(uENUM,gFAST)
endloop

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

Ну болекспры побыстрее, но разницы на глаз вы не увидите. Я вот хз че вы там велосипеды изоьритаете, нет классической способ - groupenumunitsinrange, с фильтром,куда глобалками передаём аргументыесли нужно, ну и for group для группы,ждля мгновенных действий где не надо хранить группу и где не вызывают я события триггеров ющающие эту группу,то можно юзать одну глобальную группу, быстрее ваших локальных чудес. . .
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
21
3 года назад
Отредактирован scopterectus
0
Для JASS плюс первого метода в том, что создаётся новый поток, и, если действий очень много, то такой метод более предпочтителен. Но все данные из локалок придётся переносить через глобальные переменные.
Второй метод хорош тем, что не нужно переносить локалки в глобалки, но опять же, если действий очень много, то поток может оборваться.
Опять же верхнего способа у них нет
Там вся суть в конце:
Заключение прекрасно написал Bergi_Bear к предыдущей версии статьи:
Нет никакой разницы каким вы способом будете перебираться своих 20 юнитов
0
14
3 года назад
Отредактирован LainMikoroso
0
Хмммм, то что создает новый поток это конечно не очень для моего кода
А по поводу:"нет разницы", есть большая ошибочка, т.к. на луа, быстрейшим способом является впихивание в условие, т.к. не приходится вытаскивать юнита из группы, а в сравнении с BlzUnitAtGroup не приходится чистить группу после использования
0
21
3 года назад
0
LainMikoroso, нет ничего ужасного в том, что создаётся новый поток. Если хотите всё делать так, как изначально всё задумывалось близзардами, то делаете через boolexpr и ForGroup. Не хотите заморачиваться - перебираете всех через цикл.
0
14
3 года назад
0
ScopteRectuS:
У меня жесткий абьюз глобалок во всех таймерах, выгружаемых с хеша, спонтанный новый поток буквально уничтожит весь код, хэх
1
32
3 года назад
1
Всё байтодрочерство было актуально в 2003 году или для компов тех же годов. Допустим у вас 100 юнитов и реально комп с 512 метров первого ddr. И то производительность упадёт не от метода перебора, а уже от самого факта 100 юнитов.
Просто все эти "быстрее" реально не быстрее, каждый раз когда вам кто-то говорит, что вот это работает быстрее чем вон то - шлите его на фиг.
0
14
3 года назад
0
Bergi_Bear:
У меня система сталкивания и замедления для каждого объекта в карте, если бы я думал с "о байтодрочерстве не стоит думать в 2021", то я так и дальше бы имел 20 фпс при 90 единовременных снарядах в мапе.
0
32
3 года назад
0
700 снарядов каждый на отдельном таймере
0
21
3 года назад
0
LainMikoroso, потоки выполняются последовательно. Ничего у вас там не сломается, если всё делать правильно. Да и использовать одни и те же глобалки везде и всюду - не лучшая затея.
0
14
3 года назад
Отредактирован LainMikoroso
0
Bergi_Bear:
700 снарядов каждый на отдельном таймере
У меня 1800 сейчас без сталкивания(как у тебя), 380 со сталкиванием, при том что ты двигаешь каждые 0.1, а у меня 0.02, ы

ScopteRectuS:
Ну не знаю, мне доставляет абузить глобалки, делает код супер компактным. Главное чтобы новый поток начинался только тогда, когда я вызываю таймер, либо когда тик таймера заканчивался
0
21
3 года назад
0
LainMikoroso, от новых глобалок не убудет. Да и читабельность кода значительно выше, если везде используются свои переменные. А когда одна и та же глобалка tempUnit используется везде где можно, то в таком коде чёрт ногу сломает. И какой тогда смысл от компактности?
0
14
3 года назад
0
ScopteRectuS:
все прекрасно читается, не знаю о чем ты.
Загруженные файлы
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.