|
先传送门(一个关于FirstOfGroup()的测试 -- 狡猾的兔子):
http://bbs.islga.org/read-htm-tid-5365-keyword-firstofgroup.html
再看一下以下一段代码:
[jass]
set g = CreateGroup()
if i == 0 then // 测试用
set i = 1 // 测试用
loop
set u2 = u
set u = FirstOfGroup(C_Group[id])
exitwhen u == null
call sMsg(I2S(H2I(u)))
call GroupRemoveUnit(C_Group[id], u)
call GroupAddUnit(g, u)
endloop
call sReleaseTempGroup(g, C_Group[id])
call sMsg("---------------------------------------------------")
else // 测试用
loop
set u2 = u
set u = FirstOfGroup(C_Group[id])
exitwhen u == null
call GroupRemoveUnit(C_Group[id], u)
call GroupAddUnit(g, u)
endloop
call sReleaseTempGroup(g, C_Group[id])
endif // 测试用
set u = u2
set x = GetUnitX(u)
set y = GetUnitY(u)
if DistanceBetweenPointsXY(GetUnitX(C_Caster[id]), GetUnitY(C_Caster[id]), x, y) < 64. then
call RemoveUnit(C_Head[id])
set C_Head[id] = null
loop
set u = FirstOfGroup(C_Group[id])
exitwhen u == null
call GroupRemoveUnit(C_Group[id], u)
call RemoveUnit(u)
set u = null
endloop
set u = null
set C_Head[id] = null
set C_Caster[id] = null
set C_Target[id] = null
call RemoveLocation(C_Loc[id])
set C_Loc[id] = null
call TDS_Release(id)
else
call SetUnitX(C_Head[id], x)
call SetUnitY(C_Head[id], y)
endif
call GroupRemoveUnit(C_Group[id], u)
call RemoveUnit(u)
endif
[/jass]
就是一个钩子的函数,我原本想用FirstofGroup+loop进行钩子的释放、回收,通过以下的一段:
[jass]
loop
set u2 = u
set u = FirstOfGroup(C_Group[id])
exitwhen u == null
call GroupRemoveUnit(C_Group[id], u)
call GroupAddUnit(g, u)
endloop
set u = u2
[/jass]
就是选取单位组中最后的一个单位。
注意第26,27行,乍看之下就是两行获取单位的X,Y,但是在这里问题产生了,加上那两行后你会发现钩链单位的顺序变得极其混乱(使用该技能3次以上),而且这个混乱程度是随使用次数的增大而增大的。
如果把这两行改成其他什么的,比如说GetUnitFlyingHeight,也会如此。
去掉那两行后虽然偶尔也会有1-2次的不正常,但是明显要好许多。
难道说获取单位数值会导致单位组内排列顺序变化??魔兽内部的group运作机制到底是怎么回事....... |
|