Добавлен Hodor,
опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Прочее
Тип:
Алгоритм
Версия Warcraft:
1.26
Алгоритм позволяющий отловить вход или выход из воды
Идея использовать цикл внутри каждого потока - nvc123
Обновление
Теперь построение региона происходит во время инициализации карты, а не после начала игры
+ алгоритм быстрее строит регион
+ алгоритм быстрее строит регион
Карта-пример прилагается
Время построения региона, при условии что вся карта будет заполнена водой:
64x64 - меньше секунды
128x128 - меньше секунды
256x256 - ~4 секунды
480x480 - ~15 секунд
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
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Hodor
и под "костыльным" я имел ввиду что всё что делается на нём - является костылями
Отредактирован PT153
Кроме того, некоторые говорят только их и использовать, так как triggeraction создаёт объект, который никак нельзя удалить. Но и в это мне слабо верится.