Можно ли как-нибудь периодически находить ближайший разрушаемый объект к точке 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
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 точек, но мне это было не принципиально.
Также будет зацикливание, если дудов на карте вообще нет или они все мертвы, но это исправляется условием.
0
23
5 лет назад
0
KaneThaumaturge, у меня лагает, когда пикаешь дудады. Ботов может быть много и каждый пикает от 500+ каждые 2 секунды. Спайк небольшой, но заметен.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.