回复 10# suineg
这个只是示例,当然可以把timer写成形参,就可以避免可能的冲突了
可以把Execute改成DoAfterSpecial,就支持脚本了
思路还是没变的
稍作修改:
--封装一个临时timer,使连续相同触发时只有第一个触发有效
--sScript:string,待执行的脚本, tName:临时timer名称
function ExecFirstTri(sScript,tName)
tName = tName or "abcdeTimer"
local s = GetTimer(tName)
if s ~= 0 then
if sScript then
DoAfterSpecial(0.1, sScript,12)
else
print("Error: sScript不能为空!")
end
else
ResetTimer(tName)
end
AddTimer(tName, 0, 0, 2, "", timer_flag.Enabled + timer_flag.OneShot, "")
end
保留了临时timer的可匿名,如果确保不会冲突可以采用这种匿名形参,多一种选择。
解决timer名称的问题:可以用一个比较长的随机数生成临时timer的名称,再高级点可以获取当前所有timer的list,排除掉也行。 回复sans
这个的范用性有点问题,
1.因为AddTimer的名字固定成abcdeTimer(或者)了,所以如果要实现多个 ...
suineg 发表于 2017-11-14 08:22 AM http://pkuxkx.com/forum/images/common/back.gif
只要一直出现同样的触发,而且是2秒内的,就不会出现触发的动作,直到临时timer消失,再次触发才能生效。2秒是设置的默认值,也可以作为形参写进去根据需要调节。 再发一个最后一个触发生效的函数:--封装一个临时timer,处理连续相同的触发,只有最后一个触发有效
function ExecLastTri(sScript,tName,sTime) --tName:string, sTime:integer or double, sScript:string,待执行的脚本
if not sTime then sTime = 2 end
if not tName then tName = "abcdfTimer" end
if sScript then
AddTimer(tName, 0, 0, sTime, sScript, timer_flag.Enabled + timer_flag.OneShot, "")
SetTimerOption(tName, "send_to", 12)
ResetTimer(tName)
else
print("Error: sScript不能为空!")
end
end 回复 13# sans
这个可以
不过这个的用法有两点和我不同;
1.匿名方法只支持一个;
2.还是延后执行而不是立刻执行的
补充个我的延后执行吧,Common.InstanceRunLater = function(strVoid, nTime, strParam)
if strVoid == nil or strVoid == "" then return false; end
if Common.tInstanceVoid ~= nil then return false; end
if nTime == nil then nTime = 2; end
if strParam == nil then strParam = ""; end
Common.tInstanceVoid = 1;
DoAfterSpecial(nTime, strVoid .. "(" .. strParam .. ")", 12);
DoAfterSpecial(nTime, "Common.InstanceReset(\"" .. strVoid .. "\")", 12);
return true;
end 好东西,很多场景都能用到 难道不是触发一次就关闭触发,过几秒再打开? 回复 16# kkena
1.相当公共组件,方便使用管理;
2.可以解决类似应用:一次只能放一个pfm的情况下,可以根据这来判断是否换个pfm放;
可能还有别的用处,要自己挖掘 能否再详细地解说一下具体如何运用
比如做任务血低于临界值随机逃跑,如何只执行一次,而不会又跑回来 回复 18# sarsmark
自己写个逃跑方法,然后把逃跑方法的指针变量做为第一个形参传进去即可 回复 1# suineg
这样使用对吗?但是仍然是每次发送命令都完成了
页:
1
[2]