|
[jass]
globals
player udg_TempPlayer
group udg_Group=CreateGroup()
endglobals
代码1:
function GroupFunc takes nothing returns nothing
call KillUnit(GetEnumUnit())
endfunction
function FilterFunc takes nothing returns nothing
return IsUnitEnemy(GetFilterUnit(),udg_TempPlayer)
endfunction
function TestFunc takes unit u nothing returns nothing
local group g = CreateGroup()
set udg_TempPlayer = GetOwningPlayer(u)
call GroupEnumUnitsInRange(g,GetUnitX(u),GetUnitX(u),1000,function FilterFunc)
//事实上这里一般可以直接用全局变量udg_Group,可以省去Create/DestroyGroup以及set null的步骤
call ForGroup(g,GroupFunc)
DestroyGroup(g)
set g = null
endfunction
代码2:
//条件式可以直接用returns nothing
//函数总是返回false
function GroupFunc takes nothing returns nothing
if IsUnitEnemy(GetFilterUnit(),udg_TempPlayer) then
call KillUnit(GetFilterUnit())
endif
endfunction
function TestFunc2 takes unit u nothing returns nothing
set udg_TempPlayer = GetOwningPlayer(u)
call GroupEnumUnitsInRange(udg_Group,GetUnitX(u),GetUnitX(Y),1000,Condition(function GroupFunc))
endfunction
[/jass]
即是说完全省去ForGroup这一步,直接在选取判断的时候做动作
GroupEnum类函数使用时会把Group中原先的单位都清空,所以不需要进行GroupClear操作
事实上这种写法udg_Group在整个游戏过程中都是空的,只是作为临时的一个容器而已,所以是可以直接无视的
题外:单位组动作中使用全局变量
我一般习惯在单位组动作之前使用这样的方式将参数保存在全局变量中
如:set udg_TempPlayer = GetOwningPlayer(GetTriggerUnit())
这样在GroupFunc用到该参数的时候就不需要反复调用一些函数了
(比如以上代码中,1000范围内有多少单位就需要调用多少次GroupFunc)
全局变量在这里的使用是瞬时性的,所以一般不需要担心数据覆盖的问题
之所以叫一般不需要担心是因为:
如果你在单位组动作中使用伤害函数并触发了takeDamage事件(设该触发函数为B)
那么在该伤害函数运行之后运行的是被触发的触发函数B,直到B函数结束或是遇到等待命令(TriggerSleepAction),之后再从原函数中断点处继续运行
所以在函数B中是有可能改变这些全局变量的~
该代码运行顺序同样适用于其他类型的触发,但是在代码运行过程中只有单位受到伤害事件可能被触发
所以在伤害事件的触发中需要注意"公用全局变量"的使用 (适用于所有使用全局变量的情况) |
|