//比较生命值
if life > mostLifeSoFar then
//把较大的生命值储存
set mostLifeSoFar = life
//把有较大生命的单位储存
set unitWithMostLifeSoFar = nextUnit
endif
endfunction
...
//初始化全局变量的值为空值
set mostLifeSoFar = 0
set unitWithMostLifeSoFar = null
//调用ForGroup
//对单位组myGroup中的每个单位都运行函数MostLifeCallback比较生命
call ForGroup(myGroup, function MostLifeCallback)
//上句运行后, 全局单位类型变量unitWithMostLifeSoFar便指向单位组myGroup中最高生命的单位, 或:
//如果单位组myGroup是空组, 那么unitWithMostLifeSoFar便是空值null
...
当然, 实现队列操作, 也可以用数组的方法来处理. 但, 数组不能使用紧接着要说的队列过滤器, 也不能定义数组中包含数组. 这些都是队列所拥有的优势, 如可以有数组型的单位组(相当于数组中包含数组), 也可以用队列过滤器.
5)队列过滤器(Filters)
队列过滤器用于在队列中增加符合条件的元素. 比如, 在创建一个法力小于20的单位组时, 便可以用队列过滤器(Filters)来创建.
//在单位组中增加指定单位名为unitname, 并符合队列过滤器filter的单位
native GroupEnumUnitsOfType takes group whichGroup, string unitname,
boolexpr filter returns nothing
//在单位组中增加指定玩家为whichPlayer, 并符合队列过滤器filter的单位
native GroupEnumUnitsOfPlayer takes group whichGroup, player whichPlayer,
boolexpr filter returns nothing
//在单位组中增加指定玩家为whichPlayer, 并符合队列过滤器filter的单位
native GroupEnumUnitsOfTypeCounted takes group whichGroup, string unitname,
boolexpr filter, integer countLimit returns nothing
//在单位组中增加指定区域为r, 并符合队列过滤器filter的单位
native GroupEnumUnitsInRect takes group whichGroup, rect r, boolexpr filter
returns nothing
//在单位组中增加countLimit个指定区域为r, 并符合队列过滤器filter的单位
native GroupEnumUnitsInRectCounted takes group whichGroup, rect r,
boolexpr filter, integer countLimit returns nothing
//在单位组中增加在指定点坐标范围之内, 并符合队列过滤器filter的单位
native GroupEnumUnitsInRange takes group whichGroup, real x, real y,
real radius, boolexpr filter returns nothing
//在单位组中增加在指定点范围之内, 并符合队列过滤器filter的单位
native GroupEnumUnitsInRangeOfLoc takes group whichGroup,
location whichLocation, real radius, boolexpr filter returns nothing
//在单位组中增加指定个数, 在指定点坐标范围之内, 并符合队列过滤器filter的单位
native GroupEnumUnitsInRangeCounted takes group whichGroup, real x, real y,
real radius, boolexpr filter, integer countLimit returns nothing
//在单位组中增加指定个数, 在指定点范围之内, 并符合队列过滤器filter的单位
native GroupEnumUnitsInRangeOfLocCounted takes group whichGroup,
location whichLocation, real radius, boolexpr filter,
integer countLimit returns nothing
//在单位组中增加被指定玩家选中, 并符合队列过滤器filter的单位
native GroupEnumUnitsSelected takes group whichGroup, player whichPlayer,
boolexpr filter returns nothing
类似地, 对于势力也有相应的操作函数
//在势力中增加符合队列过滤器filter的玩家
native ForceEnumPlayers takes force whichForce, boolexpr filter returns nothing
//在势力中增加指定个数, 并符合队列过滤器filter的玩家
native ForceEnumPlayersCounted takes force whichForce, boolexpr filter,
integer countLimit returns nothing
// Add all units that are allies of 'whichPlayer' that satisfy 'filter'
//在势力中增加和指定玩家同盟, 并符合队列过滤器filter的玩家
native ForceEnumAllies takes force whichForce, player whichPlayer,
boolexpr filter returns nothing
//在势力中增加和指定玩家敌对, 并符合队列过滤器filter的玩家
native ForceEnumEnemies takes force whichForce, player whichPlayer,
boolexpr filter returns nothing
以上函数中boolexpr filter在本章第1)节触发器中有提到, 通常可以使用过滤器(filterfunc).过滤器跟触发器的条件函数(conditionfunc)类似. 创建过滤器可以用以下语句:
native Filter takes code func returns filterfunc
其中参数函数code func必须是无参数返回值为布尔值的函数(takes nothing returns boolean), 过滤器用于在创建队列时增加额外的条件. 在过滤器中, 可以使用下面的函数获得下一个待查的单位/玩家/不可破坏物:
//获得下个待查单位
constant native GetFilterUnit takes nothing returns unit
//获得下个待查玩家
constant native GetFilterPlayer takes nothing returns player
//获得下个待查可破坏物
constant native GetFilterDestructable takes nothing returns destructable
我们来看个创建一个法力小于20的单位组例子:
//过滤函数, 是无参数返回值为布尔值的函数
function LessThan20ManaCallback takes nothing returns boolean
//获得下个检查的单位
local unit nextUnit = GetFilterUnit()
//检查待查单位的法力是否小于20
//小于20则返回true, 否则返回false
return GetUnitState(nextUnit, UNIT_STATE_MANA) < 20
endfunction
...
//创建过滤器, 过滤函数是LessThan20ManaCallback
local filterfunc myFilter = Filter(function LessThan20ManaCallback)
//在单位组中增加指定区域, 符合过滤条件的单位
call GroupEnumUnitsInRect(myGroup, someRect, myFilter)
// Destroy the filter if we are not going to use it again
//不再使用过滤器, 销毁过滤器, 避免内存泄漏
call DestroyFilter(myFilter)
|