|
关于中心计时器 -- 个人理解中心计时器就是用一个计时器来完成一些延迟性任务,比如我以前喜欢设置当一个单位死亡后等待5秒删除这个单位。
但是调用PolledWait这个方法会创建Timer然后销毁一个(听说如果反复这样做的话会导致大量系统开销而且不精准),所以就要自己创建一个Timer
然后等待Timer到期后执行这个删除单位的方法,可是这样就很有局限性,而且如果拿他来删除别的比如效果什么的重复代码要写很多的。中心计时器
的概念就诞生了,当然这个不是我的创意,我只是偶尔看到别人提出了这个概念之后自己用自己的方法实现了一个而已,下面来看看代码吧
这个由于不太会T所以就只能用JASS了,如果大家觉得还不错,就请那位大侠把它用T实现一下吧。。。
[jass]
//====================================================================================================
//
// 一些存取运行触发器属性的方法
//
//====================================================================================================
//设置触发器是否周期性执行
function SetTCTriggerIsPeriodic takes trigger trig,boolean b returns nothing
call SaveBooleanLJ(trig,"TC_TrigPeriodic",b)
endfunction
//设置触发器执行延迟时间
function SetTCTriggerTimeout takes trigger trig,integer b returns nothing
call SaveIntegerLJ(trig,"TC_TrigTimeout",b)
endfunction
//设置触发器是否启用
function SetTCTriggerEnable takes trigger trig,boolean b returns nothing
call SaveBooleanLJ(trig,"TC_TrigEnable",b)
endfunction
//设置触发器周期次数
function SetTCTriggerRuncount takes trigger trig,integer b returns nothing
call SaveIntegerLJ(trig,"TC_TrigRuncount",b)
endfunction
//取得触发器是否周期性执行
function TCTriggerIsPeriodic takes trigger trig returns boolean
return LoadBooleanLJ(trig,"TC_TrigPeriodic")
endfunction
//取得触发器执行延迟时间
function GetTCTriggerTimeout takes trigger trig returns integer
return LoadIntegerLJ(trig,"TC_TrigTimeout")
endfunction
//取得触发器是否启用
function TCTriggerIsEnable takes trigger trig returns boolean
return LoadBooleanLJ(trig,"TC_TrigEnable")
endfunction
//取得触发器周期次数
function GetTCTriggerRuncount takes trigger trig returns integer
return LoadIntegerLJ(trig,"TC_TrigRuncount")
endfunction
//====================================================================================================
//
// 注册使用中心计时器
//
//====================================================================================================
//对内注册方法
function P_TimerCenterStart takes integer timeout,boolean periodic,integer runcount,trigger trig returns nothing
local integer i = 1
local integer runtime
//设置触发器非关闭状态
call SetTCTriggerEnable(trig,false)
//设置触发器是否周期性执行
call SetTCTriggerIsPeriodic(trig,periodic)
//设置触发器周期运行间隔
call SetTCTriggerTimeout(trig,timeout)
//设置触发器周期次数
call SetTCTriggerRuncount(trig,runcount)
//设置下次触发器何时运行
set runtime = udg_LJ_TimerCenterCount + timeout
loop
if not(HaveSavedHandle(udg_LJ_TimerCenterCache,runtime,i)) then
call SaveTriggerHandle(udg_LJ_TimerCenterCache,runtime,i,trig)
call SaveInteger(udg_LJ_TimerCenterCache,runtime,0,LoadInteger(udg_LJ_TimerCenterCache,runtime,0)+1)
exitwhen true
endif
set i = i + 1
endloop
endfunction
//对外注册方法 timeout 周期间隔时间 periodic 是否周期循环 runcount 执行次数如果 periodic为true则忽略次数 trig 执行的触发器
function TimerCenterStart takes real timeout,boolean periodic,integer runcount,trigger trig returns nothing
call P_TimerCenterStart(R2I(timeout*100),periodic,runcount,trig)
endfunction
//====================================================================================================
//
// 中心计时器动作
//
//====================================================================================================
function ActionTimerCenterLJ takes nothing returns nothing
local trigger trig //触发器索引
local integer i = 1
local integer trigListSize //当前时间点上的触发器集合大小
local integer runcount //累计运行次数
//中心计时器计数器
set udg_LJ_TimerCenterCount = udg_LJ_TimerCenterCount + 1
//当前时间点上触发器集合大小用0下标来存储,所以触发器是从1开始存储的
set trigListSize = LoadInteger(udg_LJ_TimerCenterCache,udg_LJ_TimerCenterCount,0)
//如果当前时间点的触发器集合大小不等于0,则开始处理
if trigListSize != 0 then
loop
//获得当前时间点的第i个触发器
set trig = LoadTriggerHandle(udg_LJ_TimerCenterCache,udg_LJ_TimerCenterCount,i)
//判断当前的触发器是否可以运行
if trig != null then
//循环运行统计数
set runcount = GetTCTriggerRuncount(trig)
if runcount > 0 and not(TCTriggerIsEnable(trig)) then
call TriggerExecute(trig)
set runcount = runcount - 1
if TCTriggerIsPeriodic(trig) or runcount > 0 then
call P_TimerCenterStart(GetTCTriggerTimeout(trig),true,runcount,trig)
endif
endif
endif
//循环退出条件,所有的触发器都被执行过
exitwhen trigListSize == i
set i = i + 1
endloop
endif
//清理当前时间点上所有的触发器
call FlushChildHashtable(udg_LJ_TimerCenterCache,udg_LJ_TimerCenterCount)
//Clear
set trig = null
endfunction
//====================================================================================================
//
// 初始化中心计时器
//
//====================================================================================================
function InitTimerCenterLJ takes nothing returns nothing
//初始化中心计时器哈希表
if udg_LJ_TimerCenterCache == null then
set udg_LJ_TimerCenterCache = InitHashtable()
endif
//初始化中心计时器
if udg_LJ_TimerCenter == null then
set udg_LJ_TimerCenter = CreateTimer()
endif
set udg_LJ_TimerCenterCount = 0 //初始化中心计时器计数器
call TimerStart(udg_LJ_TimerCenter,.01,true,function ActionTimerCenterLJ)
endfunction
[/jass]
用例代码
[jass]
//执行触发器100次
local trigger t = CreateTrigger()
call TriggerAddAction(t,function test1)
call SavePlayerLJ(t,"Player",p)
call TimerCenterStart(.01,false,100,t)
[/jass] |
评分
-
查看全部评分
|