|
本帖最后由 runespirit1987 于 2013-3-29 14:11 编辑
#define LE_Shadow 31
#define LE_Cliff 30
#define LE_Land 20
#define LE_DeepWater 18
#define LE_ShallowWater 16
#define IE_Fly 1
#define IE_Walk 2
#define IE_Float 3
[jass]
//===========================================================================
//===========================================================================
//===========================================================================
//路径阻断物必须使用非可破坏物,装饰物即可
//判断地形
function LocEnvironment takes real x,real y returns integer
local integer I = 0
if IsTerrainPathable(x,y,PATHING_TYPE_FLYABILITY) == true then
set I = I + 1
endif
if IsTerrainPathable(x,y,PATHING_TYPE_WALKABILITY) == true then
set I = I + 2
endif
if IsTerrainPathable(x,y,PATHING_TYPE_FLOATABILITY) == true then
set I = I + 4
endif
if IsTerrainPathable(x,y,PATHING_TYPE_AMPHIBIOUSPATHING) == true then
set I = I + 8
endif
if IsTerrainPathable(x,y,PATHING_TYPE_ANY) == true then
set I = I + 16
endif
if I== LE_ShallowWater then
return LE_ShallowWater
elseif I== LE_DeepWater then
return LE_DeepWater
elseif I== LE_Land then
return LE_Land
elseif I== LE_Cliff then
return LE_Cliff
elseif I== LE_Shadow then
return LE_Shadow
endif
return 0
endfunction
[/jass]
上面的函数是因为用多个判断能够更加准确。单独使用一个判断似乎总是有错误。
因为装饰物所用的地面纹理,在此处会判断为悬崖。而可破坏物的地面纹理会判定为地面。所以只要使用装饰物做的路径阻断器就可以完美判断地形阻断。
[jass]
//=============================================================================================//
//=============================================================================================//
//=============================================================================================//
function IsLocPathable takes integer Str,real x,real y returns boolean
local integer PathV = LocEnvironment(x,y)
if Str == IE_Fly then
if PathV !=LE_Shadow then
return true
endif
elseif Str == IE_Walk then
if PathV ==LE_ShallowWater or PathV ==LE_Land then
return true
endif
elseif Str == IE_Float then
if PathV ==LE_ShallowWater or PathV ==LE_DeepWater then
return true
endif
endif
return false
endfunction
function MoveUnit takes unit ua,integer Str,real distance,real angle returns boolean
local real Gx = GetUnitX(ua)
local real Gy = GetUnitY(ua)
local real Tx = Gx+distance*Cos(angle*bj_DEGTORAD)
local real Ty = Gy+distance*Sin(angle*bj_DEGTORAD)
if IsLocPathable(Str,Tx,Ty)==true then
call SetUnitX(ua,Tx)
call SetUnitY(ua,Ty)
return true
endif
return false
endfunction
[/jass]
这个方法是直接判断地形,比其他判定方法的效率都会高。(比如在目标点设定单位或物品,比对设定位置和实际位置的差之类的方法)
而且可以根据场景自己做阻碍,避免其他判断方法中选取区域不当时的误差。
感谢疯人哥提供的帮助。
|
|