sans 发表于 2017-11-14 23:12:44

本帖最后由 sans 于 2017-11-14 03:17 PM 编辑

回复 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 发表于 2017-11-14 23:20:48

回复sans

这个的范用性有点问题,
1.因为AddTimer的名字固定成abcdeTimer(或者)了,所以如果要实现多个 ...
suineg 发表于 2017-11-14 08:22 AM http://pkuxkx.com/forum/images/common/back.gif

只要一直出现同样的触发,而且是2秒内的,就不会出现触发的动作,直到临时timer消失,再次触发才能生效。2秒是设置的默认值,也可以作为形参写进去根据需要调节。

sans 发表于 2017-11-14 23:23:20

再发一个最后一个触发生效的函数:--封装一个临时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

suineg 发表于 2017-11-15 15:13:03

回复 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

musasi 发表于 2017-11-16 10:22:38

好东西,很多场景都能用到

kkena 发表于 2017-12-8 23:47:04

难道不是触发一次就关闭触发,过几秒再打开?

suineg 发表于 2017-12-9 11:28:14

回复 16# kkena

1.相当公共组件,方便使用管理;
2.可以解决类似应用:一次只能放一个pfm的情况下,可以根据这来判断是否换个pfm放;

可能还有别的用处,要自己挖掘

sarsmark 发表于 2018-1-9 22:14:46

能否再详细地解说一下具体如何运用

比如做任务血低于临界值随机逃跑,如何只执行一次,而不会又跑回来

suineg 发表于 2018-1-9 23:32:46

回复 18# sarsmark


    自己写个逃跑方法,然后把逃跑方法的指针变量做为第一个形参传进去即可

qsik 发表于 2019-1-23 09:35:05

回复 1# suineg

这样使用对吗?但是仍然是每次发送命令都完成了
页: 1 [2]
查看完整版本: [Lua]分享一个能在短时间内多次触发只执行一次的方法库(附源码)V1.1