|
楼主 |
发表于 2009-6-19 20:12:19
|
显示全部楼层
引用第5楼血戮魔动冰于2009-06-19 07:38发表的 :
一个问题………………也是最主要的………………
LZ你所说的普通状态下最快的方法是什么啊!!!
…………………………………………看来和我一样有点讲不清的味道呢…………
支持研究~~~
就在写这一部分的时候,我发现了一个bug:如果对同一个force进行enum嵌套,则内层的boolexpr会覆盖外层(下次执行有效),而且如果是counted类,所有的counted计数会叠加而导致更不正确的结果,简单来说就是enum相关数据(boolexpr/integer count)和force是唯一绑定从而对多重enum出现bug。
测试代码:
[codes=jass]
function Watch takes string s returns nothing
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,0.01,s)
endfunction
function see takes nothing returns nothing
call Watch(I2S(GetPlayerId(GetEnumPlayer())))
endfunction
function filter2 takes nothing returns boolean
call Watch("filter2")
call ForForce(udg_FuncForce,function see)
return true
endfunction
function filter1 takes nothing returns boolean
call Watch("filter1")
if udg_i==0 then
call ForceEnumPlayersCounted(udg_FuncForce,Condition(function filter2),7)
set udg_i=1
endif
call ForForce(udg_FuncForce,function see)
call Watch("filter1end")
return true
endfunction
function TestCall takes nothing returns nothing
call ForceEnumPlayers(udg_FuncForce,Condition(function test))
call Watch("enumAllEnd")
call ForForce(udg_FuncForce,function see)
endfunction
[/codes]
查阅资料后才发现,原来ForForce就存在这种bug……而GroupEnumUnits...Counted压根几乎无法正常工作……
所以……使用boolexpr暂存的话,老老实实用CreateTrigger-TriggerEvaluate吧……
一、可以获得code值的情况(考虑到1.23b无法动态暂存code)
使用ForGroup(only1unitGroup,code),单位组初始化时预置好即可(虽然对于只执行一次的ForForce应该不存在code覆盖bug的影响,但还是算了吧……)
二、无法获得code值的情况
将code转化为boolexpr暂存,并使用CreateTrigger() - TriggerAddCondition() - TriggerEvaluate() - DestroyTrigger()
由研究之一,应该这样排泄就够了
三、传递参数与返回值
昨晚突然想到,虽然由于预备之二,我们不好在函数执行期间使用全局变量,但窃以为在不涉及call的函数初始进入和最终返回阶段,使用全局变量传值(set)是可以的,就是说可以这么写:
[codes=jass]
function 被执行函数 takes nothing returns xxxx
local xxxx para1=udg_p1
local xxxx para2=udg_p2
//...
//call ...执行部分,不再涉及udg_xx
set udg_returnValue=localReturnValue
//set =null
return udg_returnValue
endfunction
function 调用者函数 takes ... ... returns ...
local xxxx value
set udg_p1=参数一
set udg_p2=参数二
//...
set value=ExecuteCode(被执行函数)
//...
endfunction
[/codes]
这样的好处就是不用gamecache/hashtable绑定数据了,也就不用考虑唯一标识的问题,唯一的麻烦应该就是要准备各种类型的全局变量(不过常用的也就是integer real unit等大概十种吧,谁让jass不支持重载和模板呢)
累死了,暂时就这些…… |
|