找回密码
 点一下
查看: 2701|回复: 5

完美的冲锋地形判断功能(遇到障碍停止)

[复制链接]
发表于 2013-3-29 13:44:06 | 显示全部楼层 |阅读模式
本帖最后由 runespirit1987 于 2013-3-29 14:11 编辑

1.jpg


#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]


这个方法是直接判断地形,比其他判定方法的效率都会高。(比如在目标点设定单位或物品,比对设定位置和实际位置的差之类的方法)
而且可以根据场景自己做阻碍,避免其他判断方法中选取区域不当时的误差。




感谢疯人哥提供的帮助。




 楼主| 发表于 2013-3-29 16:43:38 | 显示全部楼层
不过需要地形布置,所以不适用所有地图。我目前的地图这类RPG才适用。。
回复

使用道具 举报

发表于 2013-3-29 16:57:43 | 显示全部楼层
不错了。支持了。
回复

使用道具 举报

发表于 2013-4-3 00:15:57 | 显示全部楼层
无法判断可破坏物和建筑物的路径阻隔

点评

的确不可以,不过对于某类地图很合适.  发表于 2013-4-16 15:45
可以.  详情 回复 发表于 2013-4-16 15:44
回复

使用道具 举报

 楼主| 发表于 2013-4-16 15:44:09 | 显示全部楼层
ckpig 发表于 2013-4-3 00:15
无法判断可破坏物和建筑物的路径阻隔


可以判断装饰物就够了.我的建筑物都是用装饰物围的.我想大部分场景好的RPG都是这样.
回复

使用道具 举报

发表于 2014-2-27 19:00:59 | 显示全部楼层
你这个要怎么使用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-4-20 04:08 , Processed in 0.400070 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表