| 
 | 
 
 本帖最后由 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
查看全部评分 
 
- 
 
 
 
 
 |