Юниты прекращают движение достигнув определенной области

Добавлен
Моя цель — заставить группы юнитов последовательно двигаться по цепочке областей. Делаю я это через массивы и циклы. Группе юнитов отдается приказ идти в область, индекс которой на один больше индекса группы. Юнит добавляется в группу при вхождении в область и индекс группы совпадает с индексом области.
Отдача приказа через многократный таймер
function CopyGroup takes group g returns group
    set bj_groupAddGroupDest = CreateGroup()
    call ForGroup(g, function GroupAddGroupEnum)
    return bj_groupAddGroupDest
endfunction

function Trig_Give_Order_to_Gnolls_Actions takes nothing returns nothing
    local integer i = 0
    local integer t = 0
    local group g
    local unit f
    local real x
    local real y
    
    call ClearTextMessages()
    call Say("Ding-dong!")   
    loop
        exitwhen i > 5
        if i >= 5 then
            set t = 0
        else
            set t = i + 1
        endif
        set x = GetRectCenterX(udg_GnollRect[t])
        set y = GetRectCenterY(udg_GnollRect[t])
        set g = CopyGroup(udg_GnollPatrul[i])
        if CountUnitsInGroup(g) > 12 then
            loop
                set f = FirstOfGroup(g)
                exitwhen f == null
                if GetUnitCurrentOrder(f) == OrderId("stop") or GetUnitCurrentOrder(f) == 0 then
                    call IssuePointOrder( f, "attack", x, y )
                    call Say(GetUnitName(f)+"_"+I2S(R2I(GetHandleId(f)))+" moves to area number "+I2S(t))
                endif
                call GroupRemoveUnit( g, f )
            endloop
        else
            loop
                set f = FirstOfGroup(g)
                exitwhen f == null
                if GetUnitCurrentOrder(f) == OrderId("stop") or GetUnitCurrentOrder(f) == 0 then
                    call GroupPointOrder( g, "attack", x, y )
                    call GroupClear(g)
                endif
                call GroupRemoveUnit( g, f )
            endloop
        endif
        call DestroyGroup(g)
        set i = i + 1
    endloop
    
    set g = null
    set f = null
endfunction
Принцип, да и сам код, действенны — проверено неоднократно, причем, на разных картах.
Проблема в следующем: когда юниты доходят до области с индексом 2 (или больше), они перестают получать приказы. Опыты показывают, что они просто не добавляются в группу. Я переписал код несколько раз различными способами, но всё едино.

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

Нашел проблему!
Зайди в переменную udg_Group и поставь разрядность массива больше одного (Вернее столько, сколько нужно). Юниты дальше и не идут, т.к. групп с индексом больше единицы просто не существует.
0
15
12 лет назад
0
Может, стоит применить другой алгоритм? Например, так как это сделал я.
У меня почти так же, только одна группа а каждому юниту соответствует переменная индекса координат области. Думаю, что тут будет лучше Хеш-таблица, чем массивы.
Можно вставить таймер, который будет периодически проверять юнитов на остановку. Если надо, то могу полностью оптимизировать все это в хорошем виде.
Загруженные файлы
0
22
12 лет назад
0
Скажу честно, я не совсем разобрался в вашем примере. Я не понял принцип. + У вас юниты движутся по одному, а мне нужны группы.
Более того, мне принципиально хочется узнать где я допустил ошибку, т. к. я уже не раз использую такой алгоритм и все отлично работало.
Думаю, что тут будет лучше Хеш-таблица, чем массивы.
Массивы быстрее, чем хэш. Да и мне не выгодно создавать громоздкую хэш-таблицу ради этого, т. к. это только малая часть карты.
Можно вставить таймер, который будет периодически проверять юнитов на остановку.
У меня же есть проверка на текущий приказ.
0
15
12 лет назад
0
Юниты движутся по одному, а мне нужны группы.
Это легко исправляется на группы.
Массивы быстрее, чем хэш.
Это зависит от того, как они используются
Таймер был про мой пример.
Можешь скинуть хотя бы карту-пример, т.к. просто глядя на код, трудно сказать, что там не срабатывает.
0
22
12 лет назад
Отредактирован Zahanc
0
Вот карта, которая отлично иллюстрирует масштаб трагедии.
0
15
12 лет назад
0
Нашел проблему!
Зайди в переменную udg_Group и поставь разрядность массива больше одного (Вернее столько, сколько нужно). Юниты дальше и не идут, т.к. групп с индексом больше единицы просто не существует.
Принятый ответ
0
22
12 лет назад
0
dot dot dot dot dot dot dot dot
Мне уже нужно записывать свои затупы и публиковать в одном месте, чтобы люди угорать могли. Сейчас попробую.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.