|
本帖最后由 zruo@tj 于 2020-2-17 10:58 编辑
由于书剑机器人大量使用callback,很多时候新手一上来就懵了。
例如,一个简单的走路循环为啥写成递归。
searchStart, searchFunc 还有walkwait的关系估计很多人还不一定完全理解。
那怎么让代码写的更容易读呢?
我的答案是 coroutine.
search代码有点长,我就不贴了,我举例pathStart
pathStart也是经典递归,理由很简单,在room里面有大量特殊处理,都需要call特殊方程。
结束以后再call walk wait, 一来容易加些delay来避免flood,二来可以回掉search/path下一步
那对于coroutine就很简单了。我把整个stack yield起来,等其他特殊处理做完,直接resume我的path stack下一步就好了啊!
那我们来试试看。
- function path_start()
- EnableTrigger("hp12",false)
- EnableTimer("roadWait",false)
- DeleteTimer("roadWait",false)
- if flag.find==1 then return end
- wait.make(function()
- local steps_done = 0
- for i,step in ipairs(road.detail) do
- road.i= i
- print("开始第".. i .. "步")
- print("步骤:" .. step )
- local step_set=utils.split(step,';')
- steps_done = steps_done + table.getn(step_set)
- EnableTrigger("hp12",false)
- if locl.room=="鳄鱼潭" then
- exe('ta corpse')
- end
- walk_hook_thread = coroutine.running()
- if string.find(step,'#') then
- local _,_,func,params = string.find(step,"^#(%a%w*)%s*(.-)$")
- if func then
- _G[func](params)
- else
- messageShow('Function 不存在,可能是地图问题:'.. func)
- end
- else
- exe(step)
- walk_wait()
- end
- print("suspend till walk wait finish")
- coroutine.yield()
- print("walk continue")
- end
- locate_finish='go_confirm'
- return locate()
- end)
- end
复制代码- function walk_wait()
- wait.make(function()
- EnableTrigger("hp12",true)
- if tmp.find then
- wait.time(0.2)
- if cntr1() > 0 then
- walk_goon()
- else
- cntr1 = countR(15)
- walk_goon()
- end
- else
- walk_goon()
- end
- end)
- end
- walk_hook_thread = nil
- function walk_goon(func)
- EnableTrigger("hp12",false)
- flag.walkwait = true
- EnableTrigger("hp12",true)
- wait_busy()
-
- if walk_hook_thread then
- print("resume suspended walk")
- local tmp_thread = walk_hook_thread
- walk_hook_thread =nil
- coroutine.resume(tmp_thread)
- else
- exe('alias action 正在赶路中')
- end
- end
复制代码
好,我把path成功的写成了一个简单循环,看上去可能有点臃肿,但是新人也不会那么难理解了吧!!
希望对大家有帮助
|
评分
-
1
查看全部评分
-
|