myu
发表于 2011-1-18 17:08:59
在这个walk对象里,关键的
wait(f,walk.delay)
其意思是等待walk.delay秒以后,执行函数f。但我并没有看到其实现。
ptouch
发表于 2011-1-18 17:15:18
基本对的
self 代表对象实例 lua in programming 里面metatable 里面有具体说明
ptouch
发表于 2011-1-18 17:17:17
应楼上要求贴出来 wait 代码
-- 线程表,储存正在暂停的线程
local wait_table = {}
--setmetatable(wait_table, {__mode = "v"}) --weak table
-- 被定时器调用以恢复一个暂停的线程
function wait_timer_resume(name)
--print(table.getn(wait_table))
print("wait_id: ",name)
thread = wait_table
if thread~=nil then
assert(coroutine.resume (thread))
else
print(name," 不存在")
end -- if
wait_table={}--垃圾回收
end -- function wait_timer_resume
-- 在脚本中调用这个函数来暂停当前的线程
function wait(address, seconds)
id = "wait_timer_" .. GetUniqueNumber ()
hours = math.floor(seconds / 3600)
seconds = seconds - (hours * 3600)
minutes = math.floor(seconds / 60)
seconds = seconds - (minutes * 60)
print("等待",seconds,"s"," ",id)
wait_table =coroutine.create(function()
print("执行")
address()
end)
status = AddTimer (id, hours, minutes, seconds, "",
timer_flag.Enabled + timer_flag.OneShot +
timer_flag.Temporary + timer_flag.Replace,
"wait_timer_resume")
assert(status == error_code.eOK, error_desc)
end -- function wait
--[[function test()
print("hello world")
end
wait(test,3)]]
--[[local function wait(s)
print("等待",s)
world.AddTimer ("delay", 0, 0, s, "process.resume()", timer_flag.OneShot+timer_flag.Replace , "")
world.SetTimerOption ("delay", "send_to", "12")
world.SetTimerOption ("delay", "group", "process")
world.EnableTimer("delay",true)
world.ResetTimer("delay")
end]]
myu
发表于 2011-1-18 17:21:03
如果使用gammon的wait,walk:go就可写成这样
function walk:go(targetRoomNo)
--前面是取得path,略
--将path字串以分号为分隔符分解,放到一个名为p的table里面
local p=Split(path,";")
local count=0
for k,v in pairs(p) do
--单步执行
Execute(v)
--下面这段代码实现停顿
count=count+1
if count>self.Max_Step then
Execute("set walk off")
--下面这句,等待出现set walk off提示,确保前面指令已执行完
wait.regexp("设定环境变量:walk = off",60)
--下面这句,等待规定的秒数
wait.time(self.delay)
count=0
end
end
end
一段代码处理完,简单得多了
[ 本帖最后由 myu 于 2011-1-18 05:35 PM 编辑 ]
ptouch
发表于 2011-1-18 19:16:11
你这个写法也可以。
区别不大。
不过你这样和服务器之间通讯频繁高,连续通讯。
我是喜欢减少数据提交次数。尽量一次性提交。
[ 本帖最后由 ptouch 于 2011-1-18 07:43 PM 编辑 ]
myu
发表于 2011-1-18 19:45:26
回复25楼:
看来你并没有研究过mushclient里自带的wait.lua,很强大啊。
wait.regexp("正则表达式1",最大时限)
这函数的意思是等待出现指定的提示,如果超过最大时限,反回nil;否则返回匹配的句子、匹配的通配符、颜色样式。
wait.time(number)
这函数的意思是等待指定的时间。
示范如下:
Execute("get blade")
local l,w=wait.regexp("你捡起一柄(.*)。|你附近没有这样东西|你上一个动作还没有完成!",2)
if l==nil then
return "网络太慢或是发生了一个非预期的错误"
end
if string.find(l,"附近没有") then
return "你附近没有刀可捡"
end
if string.find(l,"没有完成") then
return "你忙着呢"
end
if string.find(l,"捡起") then
print("你捡起了一柄"..w)
end
--等待2秒
wait.time(2)
print("继续")
[ 本帖最后由 myu 于 2011-1-18 07:47 PM 编辑 ]
ptouch
发表于 2011-1-18 20:08:34
我看明白了
类似try结构。
是蛮方便的。
xspe
发表于 2012-3-24 21:54:44
学习一下,谢谢
feixiong
发表于 2012-3-26 19:18:00
回复 1# ptouch
这么好的帖子才发现,嗯嗯,收藏