Можно ли как-нибудь периодически находить ближайший разрушаемый объект к точке X без постоянного перебора (лагает, объектов много) и без участия заранее созданных точек: точку Y мне необходимо создавать только тогда, когда ближайший объект уже найден.

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

Не давно показывал эту функцию
поиск декораций
function CheckDes takes nothing returns nothing
local destructable d=GetEnumDestructable()
if GetDestructableLife(d)>0 and cdb==false  and d!=null then
set cdb=TRUE
endif
set d=null
endfunction

function PCD takes real x,real y, unit u returns boolean//PointConteintDes
local rect r
local real d=50
set r=Rect( x - d*2, y - d*2, x + d*2, y +d*2 )
set cdb=false
call EnumDestructablesInRect(r,null,function CheckDes)
call RemoveRect(r)
set r=null
return cdb
endfunction
Я точно это проверял на карте в 1000 объектов у 4 источников одновременно, больше не было думаю условия одинаковые.. Но нужно будет переделать под ваши нужды в CheckDes мы по очереди перебираем все разрушаемые в нужно регионе, изначально функция создана для нахождения какой либо разрушаемого, но тут достаточно добавить пару глобалок на, темболее возле героя же будет не 500-1000 разрушаемых а например до 10, если это деревья
Obelick, если ещё какие либо ньюансы для нахождения этого близжайшего декора, мне легче показать как я себе представляю реализацию такой задачи, чем объяснить, но нужно больше исходных данных, особоенно волнуют вопросы
сколько может быть разрушаемых в радиусе 512 и какой интервал
quq_CCCP, а если не мемхаком, просто послать рубить деревья, а потом как то извлечь дерево записанное в приказе, хз на сколько это возможно GetDestructableOrder(), если ли такое вообще? но адрес в памяти точно такой имеется...
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
32
5 лет назад
0
Сколько объектов и сколько истоников возле которых нужно делать проверку?
0
23
5 лет назад
0
Bergi_Bear, объектов очень много, больше тысячи. Источников 8. Пробовал перебором, даже в небольшом радуисе (512), но все равно спайкает каждый раз.
Как я пытался сделать сам:
Точка X неподвижна. Вокруг каждой X я создавал заранее область (находить объект по всей карте - не нужно, только в заданной области/радиусе). Заносил все дудады в переменную, для каждой из областей, и создавал под каждым из них точку. Проходя циклом, находя дистанцию между X и точками из массива, узнавал минимальную. Но я не знаю, как взять ссылку на саму точку с этой минимальной дистанцией. Этот вариант громоздкий, но если вы сможете подсказать, как найти ссылку на точку, то это тоже поможет решить проблему, но очень костыльно.
0
32
5 лет назад
0
Ну только если это деревья... Создать работника и отправить рубить лес, он безошибочно найдет ближейшее дерево.
Хз мб с помощью мемхака удастся выудить эту функцию пойска, т.к действия описанные в движке работают быстрее чем на jass.
0
4
5 лет назад
0
а если перебирать несколько раз, но начиная с совсем мелких радиусов, там по 50, 100.
0
32
5 лет назад
0
Не давно показывал эту функцию
поиск декораций
function CheckDes takes nothing returns nothing
local destructable d=GetEnumDestructable()
if GetDestructableLife(d)>0 and cdb==false  and d!=null then
set cdb=TRUE
endif
set d=null
endfunction

function PCD takes real x,real y, unit u returns boolean//PointConteintDes
local rect r
local real d=50
set r=Rect( x - d*2, y - d*2, x + d*2, y +d*2 )
set cdb=false
call EnumDestructablesInRect(r,null,function CheckDes)
call RemoveRect(r)
set r=null
return cdb
endfunction
Я точно это проверял на карте в 1000 объектов у 4 источников одновременно, больше не было думаю условия одинаковые.. Но нужно будет переделать под ваши нужды в CheckDes мы по очереди перебираем все разрушаемые в нужно регионе, изначально функция создана для нахождения какой либо разрушаемого, но тут достаточно добавить пару глобалок на, темболее возле героя же будет не 500-1000 разрушаемых а например до 10, если это деревья
Obelick, если ещё какие либо ньюансы для нахождения этого близжайшего декора, мне легче показать как я себе представляю реализацию такой задачи, чем объяснить, но нужно больше исходных данных, особоенно волнуют вопросы
сколько может быть разрушаемых в радиусе 512 и какой интервал
quq_CCCP, а если не мемхаком, просто послать рубить деревья, а потом как то извлечь дерево записанное в приказе, хз на сколько это возможно GetDestructableOrder(), если ли такое вообще? но адрес в памяти точно такой имеется...
Принятый ответ
0
23
5 лет назад
0
В 512 думаю около 10, интервал 2 секунды. Но фишка в том, что в этом радиусе может и не быть подходящих объектов. Так как ты уже играл в Железную эпоху, то я пытаюсь сделать ИИ для этой карты, возможно тебе легче будет это представить в таком случае. Компьютер должен последовательно захватывать ближайшие клетки вокруг своего главного здания и не выходить за пределы своей территории.
0
25
5 лет назад
Отредактирован Jack-of-shadow
0
Obelick:
Лагать не должно, если правильно отсеивать.
У меня в карте более 30 к разрушаемых пропсов, заспавненных во время игры (около 30 декораций на радиус 500 ед.) Через енум и стрелы летят и проверка на зрение работает и все норм.
То что предложил Bergi_Bear самое оно, только ректы можно глобальные подготовить разных размеров заранее.

Obelick:
В 512 думаю около 10, интервал 2 секунды. Но фишка в том, что в этом радиусе может и не быть подходящих объектов.
Что то мне подсказывает что именно при "ненахождении" объектов возникают проблемы. Возможно вы что то упустили в этом месте.
0
32
5 лет назад
0
Obelick, ну такое точно не должно лагать, если даже у Джека всё норм, покажи нам свой код наверное какой-то лишний перегруз
0
32
5 лет назад
0
Bergi_Bear, да, об этом в статьях есть, отправь работника рубить лес и посмотри цель текущего приказа...
0
23
5 лет назад
0
Jack-of-shadow, как отсеивать в пике дудады, если условных пиков нет? Можно только выбрать все на карте/в радиусе и уже далее ставить условия
0
19
5 лет назад
Отредактирован KaneThaumaturge
0
Я когда-то давно так делал:
x = 50
Цикл
	Ищем декорации в радиусе x от изначальной точки
	Если нашли, то выбрать любой декор, который нашли выше и сохранить его.
	Иначе х = х + 50 и повторить цикл.
Ну, тут нужно добавить, что могут быть погрешности в пределах 50 точек, но мне это было не принципиально.
Также будет зацикливание, если дудов на карте вообще нет или они все мертвы, но это исправляется условием.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.