北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
12
返回列表 发新帖
楼主: suineg

[Lua]分享一个能在短时间内多次触发只执行一次的方法库(附源码)V1.1

[复制链接]
发表于 2017-11-14 23:12:44 | 显示全部楼层
本帖最后由 sans 于 2017-11-14 03:17 PM 编辑

回复 10# suineg
这个只是示例,当然可以把timer写成形参,就可以避免可能的冲突了
可以把Execute改成DoAfterSpecial,就支持脚本了
思路还是没变的
稍作修改:
  1. --封装一个临时timer,使连续相同触发时只有第一个触发有效
  2. --sScript:string,待执行的脚本, tName:临时timer名称
  3. function ExecFirstTri(sScript,tName)       
  4.         tName = tName or "abcdeTimer"
  5.         local s = GetTimer(tName)
  6.         if s ~= 0 then
  7.                 if sScript then
  8.                         DoAfterSpecial(0.1, sScript,12)
  9.                 else
  10.                         print("Error: sScript不能为空!")
  11.                 end
  12.         else
  13.                 ResetTimer(tName)
  14.         end
  15.         AddTimer(tName, 0, 0, 2, "", timer_flag.Enabled + timer_flag.OneShot, "")
  16. end
复制代码

保留了临时timer的可匿名,如果确保不会冲突可以采用这种匿名形参,多一种选择。
解决timer名称的问题:可以用一个比较长的随机数生成临时timer的名称,再高级点可以获取当前所有timer的list,排除掉也行。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2017-11-14 23:20:48 | 显示全部楼层
回复  sans

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


只要一直出现同样的触发,而且是2秒内的,就不会出现触发的动作,直到临时timer消失,再次触发才能生效。2秒是设置的默认值,也可以作为形参写进去根据需要调节。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2017-11-14 23:23:20 | 显示全部楼层
再发一个最后一个触发生效的函数:
  1. --封装一个临时timer,处理连续相同的触发,只有最后一个触发有效
  2. function ExecLastTri(sScript,tName,sTime)        --tName:string, sTime:integer or double, sScript:string,待执行的脚本
  3.         if not sTime then sTime = 2        end
  4.         if not tName then tName = "abcdfTimer" end
  5.         if sScript then
  6.                 AddTimer(tName, 0, 0, sTime, sScript, timer_flag.Enabled + timer_flag.OneShot, "")
  7.                 SetTimerOption(tName, "send_to", 12)
  8.                 ResetTimer(tName)
  9.         else
  10.                 print("Error: sScript不能为空!")
  11.         end
  12. end
复制代码
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2017-11-15 15:13:03 | 显示全部楼层
回复 13# sans

这个可以
不过这个的用法有两点和我不同;
1.匿名方法只支持一个;
2.还是延后执行而不是立刻执行的

补充个我的延后执行吧,
  1. Common.InstanceRunLater = function(strVoid, nTime, strParam)
  2.         if strVoid == nil or strVoid == "" then return false; end
  3.         if Common.tInstanceVoid[strVoid] ~= nil then return false; end
  4.         if nTime == nil then nTime = 2; end
  5.         if strParam == nil then strParam = ""; end
  6.         Common.tInstanceVoid[strVoid] = 1;
  7.         DoAfterSpecial(nTime, strVoid .. "(" .. strParam .. ")", 12);
  8.         DoAfterSpecial(nTime, "Common.InstanceReset("" .. strVoid .. "")", 12);
  9.         return true;
  10. end
复制代码
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2017-11-16 10:22:38 | 显示全部楼层
好东西,很多场景都能用到
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2017-12-8 23:47:04 | 显示全部楼层
难道不是触发一次就关闭触发,过几秒再打开?
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2017-12-9 11:28:14 | 显示全部楼层
回复 16# kkena

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

可能还有别的用处,要自己挖掘
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2018-1-9 22:14:46 | 显示全部楼层
能否再详细地解说一下具体如何运用

比如做任务血低于临界值随机逃跑,如何只执行一次,而不会又跑回来
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2018-1-9 23:32:46 | 显示全部楼层
回复 18# sarsmark


    自己写个逃跑方法,然后把逃跑方法的指针变量做为第一个形参传进去即可
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2019-1-23 09:35:05 | 显示全部楼层
回复 1# suineg

这样使用对吗?但是仍然是每次发送命令都完成了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-24 11:30 AM , Processed in 0.010194 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表