reforged. Может ли кто-то поделиться подобной функцией для поиска ближайшего destructable?

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

ну типа как-то так, не уверен в работоспособности потому что не проверял
раскрыть
globals
    destructable bj_lastFilterDestructable = null
    destructable nearDestructable = null
    real g_distance
    real g_x
    real g_y
endglobals

function NearDestructable takes nothing returns nothing
    local real x
    local real y
    local real d
    
    set bj_lastFilterDestructable = GetEnumDestructable( )
    
    set x = GetDestructableX( bj_lastFilterDestructable )
    set y = GetDestructableY( bj_lastFilterDestructable )
    set d = SquareRoot( ( g_x - x ) * ( g_x - x ) + ( g_y - y ) * ( g_y - y ) )
    
    if d < g_distance then
        set g_distance = d
        set nearDestructable = bj_lastFilterDestructable
    endif
endfunction

function GetNearDestructable takes real x, real y, real radius, boolexpr b returns destructable
    local rect r = Rect( x - radius, y - radius, x + radius, y + radius )
    
    set nearDestructable = null
    set g_distance = radius
    set g_x = x
    set g_y = y
    
    call EnumDestructablesInRect( r, b, function NearDestructable )
    
    call RemoveRect( r )
    set r = null
    
    return nearDestructable
endfunction

в булекспр можешь кинуть любое условие для фильтрации деструктов, т.е. например
function MyCond takes nothing returns boolean
  return GetDestructableTypeId( GetFilterDestructable( ) ) == '4sdfsd' or GetDestructableTypeId( GetFilterDestructable( ) ) == 's'fsf'
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
32
2 года назад
0
Не припомомню такую, но раньше создавали работника и приказывали добывать дерево, смотрели куда он пойдет - вот это и будет ближайшее дерево.
0
22
2 года назад
0
Вариант в лоб с перебором всех деструктоблов не подходит?
1
27
2 года назад
Отредактирован rsfghd
1
ну типа как-то так, не уверен в работоспособности потому что не проверял
раскрыть
globals
    destructable bj_lastFilterDestructable = null
    destructable nearDestructable = null
    real g_distance
    real g_x
    real g_y
endglobals

function NearDestructable takes nothing returns nothing
    local real x
    local real y
    local real d
    
    set bj_lastFilterDestructable = GetEnumDestructable( )
    
    set x = GetDestructableX( bj_lastFilterDestructable )
    set y = GetDestructableY( bj_lastFilterDestructable )
    set d = SquareRoot( ( g_x - x ) * ( g_x - x ) + ( g_y - y ) * ( g_y - y ) )
    
    if d < g_distance then
        set g_distance = d
        set nearDestructable = bj_lastFilterDestructable
    endif
endfunction

function GetNearDestructable takes real x, real y, real radius, boolexpr b returns destructable
    local rect r = Rect( x - radius, y - radius, x + radius, y + radius )
    
    set nearDestructable = null
    set g_distance = radius
    set g_x = x
    set g_y = y
    
    call EnumDestructablesInRect( r, b, function NearDestructable )
    
    call RemoveRect( r )
    set r = null
    
    return nearDestructable
endfunction

в булекспр можешь кинуть любое условие для фильтрации деструктов, т.е. например
function MyCond takes nothing returns boolean
  return GetDestructableTypeId( GetFilterDestructable( ) ) == '4sdfsd' or GetDestructableTypeId( GetFilterDestructable( ) ) == 's'fsf'
endfunction
Принятый ответ
4
30
2 года назад
Отредактирован Clamp
4
Для реализации адекватного по производительности алгоритма тебе нужно или иметь предельную дистанцию, дальше которой поиск не будет осуществляться, или итеративное увеличение этой дистанции при отсутствии результата в пределах текущего радиуса поиска.
А так всё просто: пикаешь все разрушаемые в радиусе от точки поиска, проверяешь у каждого расстояние до этой точки и выбираешь наименьшее.

Вон выше набросок реализации как раз.

Вариант в лоб с перебором всех деструктоблов не подходит?
На карте 20к объектов, пауза игры на пару секунд при каждом вызове <3
2
15
2 года назад
2
quq_CCCP, напомнило способ как в Desert Fury проверяли, равен ли текущий приказ юнита приказу "move": создавали где-то на карте краба и заставляли его ходить, и сравнивали его приказ с приказом других юнитов)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.