|
马上加入TC
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 badcwytga 于 2014-1-29 14:40 编辑
近日 写了一个 某游戏的 挂机脚本 功能 分别为 打怪 捡物 回位
脚本调试通过 可以正常的 打怪 捡物 回位 脚本运行一段时间后 脚本居然闪退了。
本人就是一新手 让我找这么一些 暗病 我无能为力 经过我自己一番努力无果,唯有请教 论坛里的 RainShine 大神。
RainShine 说:无限的递归会导致脚本占资源暴涨,且运行时间长了会闪退。
吖呀 我滴妈呀,什么递归 看不懂!有木有?。 后来 RainShine 远程帮我讲解 我就开窍了
想起当时 真都是想到 头在爆开了! 现在问题解决了 我也发个贴 让和我一样的新手们 避免这种问题的发生。下面 我发出 源码 让大家看一下。
下面源码 红色字体 是 RainShine 讲解所在 说白了 就是 线程里 自己调用自己!
功能 初始化()
是否成功=辅助.注册插件("rc:dm.dll",真)
如果(!是否成功)
辅助.消息框("插件注册失败")
如果结束
// 大漠注册
dm.SetPath(help.getrcpath("rc:"))
字库=dm.SetDict(0,"游戏.txt")
// 设置字库
功能结束
功能 开始挂机()
dm.MoveTo(501,317)
辅助.等待(100)
dm.RightDown()
辅助.等待(1000)
dm.RightUp()
挂机脚本.自动捡取()
//还是这个线程,去执行捡东西.
//然后挂机又执行捡取....无限调用无限执行 无限深入 这才导致脚本占用内存飙升 然后导致……闪退.就这么简单.自己改改就ok
功能结束
功能 自动捡取()
个数=列表框.得到个数("列表框0")
Q=0
遍历(i=0;i<个数;i++)
Q++
AA=列表框.获得文本("列表框0",i)
名字=字符串.截取(AA,0,3)
如果(名字=="宝石类")
KK=列表框.获得文本("列表框0",i)
BB=字符串.修剪(KK,"宝石类=")
物品名字=字符串.修剪(BB,"|")
x,y,识别x,识别y
捡物=dm.FindStrFast(0,0,1030,800,物品名字,"ffcc19-101010",0.9,x,y)
如果(x>-1)
//////////////
dm.MoveTo(x+20,y+20)
辅助.等待(100)
dm.LeftClick()
辅助.等待(600)
///////////////
辅助.等待(100)
识别=dm.FindStrFast(x,y,x+150,y+20,物品名字,"ffcc19-101010",0.9,识别x,识别y)
如果(识别x>-1)
挂机脚本.自动捡取()
//仍然是这个线程,自己调用自己 也就是递归调用 又执行 如果一直是这种情况 就会出不来 一层一层地深入 导致闪退.
否则
辅助.等待(100)
挂机脚本.移动坐标()
//如果是这种情况 或者下面的那种情况 就执行移动.
如果结束
否则
辅助.等待(100)
dm.KeyPress(18)
辅助.等待(100)
如果(Q>6)
挂机脚本.移动坐标()
如果结束
如果结束
如果结果
遍历结束
功能结束
功能 移动坐标()
// 这块源码 内容过大 暂不写出来了
//写重点
//最后回位后 调用自动打怪
挂机脚本.开始挂机()
//还是这个线程 又执行挂机
功能结束
下面来个总结
看到我的源码 :自动打怪 - 调用 自动捡取-检测是否捡物成功-如果成功-调用回位-否则-调用自动捡取-
错误就在红色字体这里 :检测捡物不成功 就调用自动捡物 这句就是在 自己调用自己 然后回位 又调用挂机 挂机线程里 再一次的调用了自动捡物 重复了N次
结果就是: RainShine 说的 无限的递归会导致脚本占资源暴涨,且运行时间长了会闪退。
特别感谢!RainShine 的帮忙
在此 祝大家新年快乐 马到功成 TC论坛越办越好!
|
评分
-
查看全部评分
|