|
在制作技能时,经常需要一些异步操作,可是直接函数调用是同步执行的。
解决办法是很简单的,但是很多人不知道。
所以我冒昧的转贴了过来,并转成了简体汉字(当初就是因为给出了Danny网站的链接,被无数看不懂繁体字的人骂死)。
以下资料来自Danny的WE自学手册。
http://www.infor.org/~n1048/WESelfStudy/GoodArticles/JASSManual/attach11.htm
<附件11>:分割执行程序代码分割执行程序代码(可在函数中放Wait而不会有执行上的延迟)
[jass]function RunCode takes code whichcode returns nothing
local trigger trg = CreateTrigger()
local triggeraction act = TriggerAddAction(trg, whichcode)
call TriggerExecute(trg)
call TriggerRemoveAction(trg,act)
call DestroyTrigger(trg)
endfunction [/jass]
上面那个等级还不够高,高手都是用这个函数写的:
[jass] call ExecuteFunc("函数名") [/jass]
这个函数会自动搜寻指定的函数名称并执行它,一样是用分割的方式进行的。
而且它可向前参照原则,执行写在后面的函数,例如:
[jass]function Test takes nothing returns nothing
call MyFunc()
endfunction
function MyFunc takes nothing returns nothing
call BJDebugMsg("MyFunc is called")
endfunction [/jass]
由于你不能呼叫此函数以后的函数,这样写会造成出错。
然而,这样写就没有问题了:
[jass]function Test takes nothing returns nothing
call ExecuteFunc("MyFunc")
endfunction
function MyFunc takes nothing returns nothing
call BJDebugMsg("MyFunc is executed")
endfunction[/jass]
这个函数的最大缺点是,被执行的函数必须是takes nothing returns nothing,因此不能传递自变量。不过JASS高手自有妙计,看下去就知道了:)
http://www.infor.org/~n1048/WESelfStudy/GoodArticles/JASSManual/attach12.htm
<附件12>:十秒特效
[quote]
做法一:
[jass]function AddTimeredEffectTargetUnit_Child takes nothing returns nothing
local effect timeredeffect = bj_lastCreatedEffect
local real duration = bj_enumDestructableRadius
call PolledWait( duration )
call DestroyEffect( timeredeffect )
endfunction
function AddTimeredEffectTargetUnit takes string modelName, unit whichUnit, string whichAttach, real duration returns nothing
local real Bj_enumDestructableRadius = bj_enumDestructableRadius
set bj_lastCreatedEffect = AddSpecialEffectTarget(modelName, whichUnit, whichAttach )
set bj_enumDestructableRadius = duration
call RunCode(function AddTimeredEffectTargetUnit_Child)
set bj_enumDestructableRadius = Bj_enumDestructableRadius
endfunction[/jass]
做法二:
[jass]function AddTimeredEffectTargetUnit takes string modelName, unit whichUnit, string whichAttach, real duration returns nothing
local effect timeredeffect = AddSpecialEffectTargetUnitBJ(whichAttach, whichUnit, modelName )
call PolledWait(duration)
call DestroyEffect( timeredeffect )
endfunction[/jass]
以上两种写法,有什么不同?哪一个好?
乍看之下,第二种写法似乎比较简单,但是真的是这样吗?
读者可以试试看,连续对2个不同单位执行这个函数。你会发现,使用第一种做法,2个单位身上同时冒出特效,10秒后同时消失;使用第二种做法时,只有一个单位身上冒出特效,等它消失后,第二个单位身上才冒出特效。
这就是所谓的分割程序代码,当你在一个函数里直接放wait时,必须等函数执行完,才能执行下一个函数。为了免去时间延迟,我们必须先建立一个触发器,让它独立执行,但是code不能传送参数,因此,我们就借用blizzard.j里的变量充当参数传送,当然借完了要把值还回去,不然到时候莫名奇妙出了bug别找我:-(。
看过<附件11>了吗?如果有看过,你就应该知道这样的写法还不够完美,大部分的JASSer会这样写:
[jass]function AddTimeredEffectTargetUnit_Child takes nothing returns nothing
local effect timeredeffect = bj_lastCreatedEffect
local real duration = bj_enumDestructableRadius
call PolledWait( duration )
call DestroyEffect( timeredeffect )
endfunction
function AddTimeredEffectTargetUnit takes string modelName, unit whichUnit, string whichAttach, real duration returns nothing
local real Bj_enumDestructableRadius = bj_enumDestructableRadius
set bj_lastCreatedEffect = AddSpecialEffectTarget(modelName, whichUnit, whichAttach )
set bj_enumDestructableRadius = duration
call ExecuteFunc("AddTimeredEffectTargetUnit_Child")
set bj_enumDestructableRadius = Bj_enumDestructableRadius
endfunction[/code]
[/jass] |
|