Добавлен , опубликован
Способ реализации:
Версия Warcraft:
Алгоритм позволяющий отловить вход или выход из воды
Идея использовать цикл внутри каждого потока - nvc123
Обновление
Теперь построение региона происходит во время инициализации карты, а не после начала игры
+ алгоритм быстрее строит регион
Карта-пример прилагается
Время построения региона, при условии что вся карта будет заполнена водой:
64x64 - меньше секунды
128x128 - меньше секунды
256x256 - ~4 секунды
480x480 - ~15 секунд
Алгоритм в виде подключаемой библиотеки:
Событие на вход в воду:
function TriggerRegisterEnterWater takes trigger whichTrigger, boolexpr filter returns event
Событие на выход из воды:
function TriggerRegisterLeaveWater takes trigger whichTrigger, boolexpr filter returns event
cJass
library CustomRegion initializer Init
{
    define regionType = false //false - вода, true - земля
    
    private region CustomRegion;
    private float maxX;
    private float minX;
    private float maxY;
    private float minY;
    private float pointX;
    private float pointY;
    private bool b = true;
    
    public void Run()
    {
        int i = 0;
        loop
        {
            if( IsTerrainPathable(pointX, pointY, PATHING_TYPE_FLOATABILITY) == regionType )
            {
                RegionAddCell( CustomRegion, pointX, pointY );
            }
            
            pointY = pointY-32.;
            if( pointY < minY )
            {
                pointX = pointX-32.;
                pointY = maxY;
            }
            
            i++;
            
            if( pointX < minX )
            {
                b = false;
                break;
            }
            exitwhen( i == 5600 )
        }
        if( b )
        {
            ExecuteFunc("CustomRegion_Run");
        }
    }
    
    private void Init()
    {
        maxX = GetRectMaxX(bj_mapInitialPlayableArea);
        minX = GetRectMinX(bj_mapInitialPlayableArea);
        maxY = GetRectMaxY(bj_mapInitialPlayableArea);
        minY = GetRectMinY(bj_mapInitialPlayableArea);
        pointX = maxX;
        pointY = maxY;
        CustomRegion = CreateRegion();
        
        ExecuteFunc("CustomRegion_Run");
    }
    
    event TriggerRegisterEnterWater(trigger whichTrigger, boolexpr filter)
    {
        return TriggerRegisterEnterRegion( whichTrigger, CustomRegion, filter );
    }
    
    event TriggerRegisterLeaveWater(trigger whichTrigger, boolexpr filter)
    {
        return TriggerRegisterLeaveRegion( whichTrigger, CustomRegion, filter );
    }
}
vJass
library CustomRegion initializer Init
    globals
        private region CustomRegion
        private real maxX
        private real minX
        private real maxY
        private real minY
        private real pointX
        private real pointY
        private boolean b = true
    endglobals
    
    public function Run takes nothing returns nothing
        local integer i = 0
        loop
            if IsTerrainPathable(pointX, pointY, PATHING_TYPE_FLOATABILITY) == false then
                call RegionAddCell( CustomRegion, pointX, pointY )
            endif
            
            set pointY = pointY-32.
            if pointY < minY then
                set pointX = pointX-32.
                set pointY = maxY
            endif
            
            set i = i + 1
            
            if pointX < minX then
                set b = false
                exitwhen true
            endif
            exitwhen( i == 5600 )
        endloop
        if b then
            call ExecuteFunc("CustomRegion_Run")
        endif
    endfunction
    
    private function Init takes nothing returns nothing
        set maxX = GetRectMaxX(bj_mapInitialPlayableArea)
        set minX = GetRectMinX(bj_mapInitialPlayableArea)
        set maxY = GetRectMaxY(bj_mapInitialPlayableArea)
        set minY = GetRectMinY(bj_mapInitialPlayableArea)
        set pointX = maxX
        set pointY = maxY
        set CustomRegion = CreateRegion()
        
        call ExecuteFunc("CustomRegion_Run")
    endfunction
    
    function TriggerRegisterEnterWater takes trigger whichTrigger, boolexpr filter returns event
        return TriggerRegisterEnterRegion( whichTrigger, CustomRegion, filter )
    endfunction
    
    function TriggerRegisterLeaveWater takes trigger whichTrigger, boolexpr filter returns event
        return TriggerRegisterLeaveRegion( whichTrigger, CustomRegion, filter )
    endfunction
endlibrary
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
28
оформи ещё в виде подключаемой библиотеки
чтобы не приходилось копировать код с карты на карту а просто прописать
include "enter_water.j"
и заяви на публикацию
28
UrsaBoss, нафига триггеры используешь?
есть же таймеры
и можно просто в 1 потоке циклом всё сделать
без периодического триггера
из за периодического триггера так долго и работает
18
nvc123 насчет таймеров подумаю, там просто нужно сделать 5-10 таймеров. Т.к период в 0.00 медленный.
А насчет loop и потока - я с этого и начинал, далее благополучно варкрафт завершал поток из за перегрузки, примерно на 750 цикле
nvc123 +когда я уничтожал таймер, то появлялся баг и он тупо прогонял if( IsTerrainPathable(pointX, pointY, regionType) == false ) по 10-20 раз, я уже с того времени переделал код, через 20-30 минут попробую переделать на таймерах
nvc123 а ещё после loop'ов, я сделал рекурсию через ExecuteFunc как аналог loop, но в этом случае варкрафт просто вылетел без ошибок во время инициализации
nvc123 потестил с таймерами, прокатило когда я начал паузить их вместо того чтобы уничтожать, сравнил с триггером - тоже самое, нагрузка и время почти одинаковы, в случае с таймерами в качестве единицы скорости послужило их количество
Мне кажется лучше давать триггеру ивенты чем вручную в глобалках создавать массив из таймеров по отдельности (т.к если создать таймеры при инициализации, то будет фриз на несколько секунд)
18
nvc123:
UrsaBoss, а нафига много таймеров?
1 достаточно
ага, думаешь он вывезет на 0.00 периоде?)
будет пол часа лепить регион
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.