• 新浪微博:
  • 微信 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:03-18

按键精灵安卓版
立即下载

软件版本:3.3.6
软件大小:62.5M
更新时间:01-16

按键精灵iOS版
立即下载

软件版本:1.6.0
软件大小:29.2M
更新时间:07-29

最新企业版UiBot
立即下载

软件版本:3.3
软件大小:282M
更新时间:08-06

快捷导航

登录 后使用快捷导航
没有帐号? 注册

登录 注册
返回列表 12345678» / 10
发新话题 回复该主题

[◆编程技巧] 【技术帖】深度精通找多图、等多图(下) [复制链接]

1#

按键 为游戏而生 ▁▃▅▇

〖按键经典〗

神奇的找多图、等多图(下篇)

【深度教程、技术帖:目录】

   神奇的找多图、等多图(上篇)(这是上篇的继续)。今天是2017年的大年二十五,连我也没想到,这是本帖第五次推倒重写了,随着自己对技术的领悟,发现还可以对脚本再次精益求精,同时让版面更加美观,方便大家学习。
  每次写完都已觉完美,他日却发现精彩可以更多,学无止境大概就是这样吧。

一、解释等图


上篇是找图,这篇是等图。  
  等图:在规定的时间内,反复执行找图命令,如果找到图就中止找图(即不再等图),否则一直到规定的时间结束。
本帖主要内容:
  1、学习Datediff函数(因为这个函数太重要了)
  2、编写等图函数(比较复杂,注意学习过程中,反复揣摩代码是怎么写的)
  3、给出了等图后,如何操作和应用的不同方向,注意理解
  4、学习测试的技巧(非常实用)

〓关联帖〓

经验:新手如何开始学习按键精灵
【技术探索】深度带你精通找图、找多图
【技术探索】深度带你精通等图
【工具软件】《按键精灵离线帮助文档》2015.1版
【按键经典】选择竟然如此简单
彻底精通大漠注册
大漠3.1233版下载

二、学习DateDiff函数


  在等图中,DateDiff函数是确定在多长时间内找图的关键函数(具体的参数说明,请大家直接在按键精灵的软件里看一下帮助)
格式:DateDiff(时间单位, 开始时间, 结束时间)
作用:是返回两个日期之间的时间间隔
时间单位:“s",字母说明以秒为单位,”d“,字母d说明以天为单位
返回值:开始时间到结束时间有多少个时间单位.

  具体使用看下面的范例。
  1. wait=5 //最长等待时间
  2. 开始时间 = now()
  3. Do While DateDiff("s", 开始时间, now()) <= wait
  4. TracePrint "正在找图:" & now()
  5. Delay 1000
  6. Loop
复制代码
代码说明:首先设置等待时间为5秒。开始时间就是代码运行这个位置的真实时间。然后是第一次循环,条件是检查一开始设置的开始时间和现在的时间的秒数差是不是小于设置的5秒(当然第一次循环时,这两个时间差是0)。
  循环中首先打印一个”正在找图“和当前时间的语句,这是为了方便测试的,后面等待1000毫秒(即1秒),因为等待了1秒,所以第2次循环时,now()函数返回的当然时间就会比开始时间这个变量记录的值多出至少1秒,这样两个的差就是1,但1还是小于5,因为循环继续,直到时间差大于5,循环结束。  

三、初识等图函数

  这是在上篇找图的基础上设计的等图函数,尽管不太完善,但已经能看出基本结构了。
  注意:因为需要在等图函数中调用上篇学习的找图函数,所以等图的参数要包括找图的所有参数。
  1. 图片路径 = "c:\test_game\"
  2. 图片 = "图1.bmp|图2.bmp|图3.bmp" //多个图片名称用半角竖杠分隔,形成字符串
  3. Scrx = Plugin.Sys.GetScRX //得到当前屏幕宽度
  4. Scry = Plugin.Sys.GetScRY //得到当前屏幕高度
  5. //--------------------------------------------------------------------------//
  6. TracePrint 等图(0, 0, Scrx, Scry, 图片路径, 图片, 0.9, 5) //比找图多了一个参数
  7. //--------------------------------------------------------------------------//
  8. Function 等图(x1, y1, x2, y2, pic_path, pic_name, sim, wait)
  9. //wait:记录最长等待的时间,这里以秒为单位
  10. 开始时间 = now()
  11. Do While DateDiff("s", 开始时间, now()) <= wait
  12. TracePrint "正在找图:" & now()
  13. Delay 1000
  14. Loop
  15. End Function
  16. EndScript
复制代码

四、完善等图函数

  这段函数的作用:找到图后,对图做单击、双击、或者什么都不做(只是做为一个标志)。
  现在终于可以把等图与找图合并了,下面就是真正能等图的函数了。
  下面的代码中,把上篇中的找图函数也复制过来了,方便大家的测试。神奇的找多图、等多图(上篇)
  注意:
  1. 这段代码与上面的初识等图函数相比,函数又增加了一个参数,就是找到图后,鼠标的动作,这是一个非常实用的操作,应该说脚本是,最常用的就是找到图后单击图。比如游戏中,找图地上的金子,就单击操起;找到一个怪就单击打它。
  2. 也常有这种情况,找一个图后并不对图进行任何操作,只是做为一个标志。比如:当发现玩家有VIP符号就执行某个任务,这里找图VIP的标志图,并不是对这个标志做动作,而是干其他事情,这里就可以将最后一个参数设为0。
  3. 当然等图函数也设置了返回值,如果返回值是-1,说明在规定时间内等图失败。
  1. 图片路径 = "c:\test_game\"
  2. 图片 = "图1.bmp|图2.bmp|图3.bmp" //多个图片名称用半角竖杠分隔,形成字符串
  3. Scrx = Plugin.Sys.GetScRX //得到当前屏幕宽度
  4. Scry = Plugin.Sys.GetScRY //得到当前屏幕高度
  5. //--------------------------------------------------------------------------//
  6. TracePrint 等图(0, 0, Scrx, Scry, 图片路径, 图片, 0.9, 5, 1) //比找图多了一个参数
  7. //--------------------------------------------------------------------------//
  8. Function 等图(x1, y1, x2, y2, pic_path, pic_name, sim, wait, mouse)
  9. //最后一个参数,值=1,表示找到图后单击;值=2,表示找到图就双击;值=0,只将指针移到图上
  10. //wait:记录最长等待的时间,这里以秒为单位
  11. 开始时间 = now()
  12. Do While DateDiff("s", 开始时间, now()) <= wait
  13. 图号 = 找图(x1, y1, x2, y2, pic_path, pic_name, sim)
  14. //这里调用找图函数
  15. If 图号 > 0 Then
  16. TracePrint 图号 & "号图找到了,退出等图函数!"
  17. 等图 = 图号
  18. Select Case mouse
  19. Case 0
  20. MoveTo intx, inty
  21. //这里用的intx,inty是找图函数的值,尽管这样做不在符合现代编程思想,但挺实用的
  22. Case 1
  23. MoveTo intx, inty
  24. LeftClick 1
  25. Case 2
  26. MoveTo intx, inty
  27. LeftDoubleClick 1
  28. End Select
  29. Exit Function
  30. End If
  31. Loop
  32. TracePrint "竟然没找到,还能不能愉快地玩耍了。"
  33. 等图 = -1
  34. End Function
  35. //--------------------------------------------------------------------------//
  36. //--------------------------------------------------------------------------//
  37. Function 找图(x1, y1, x2, y2, pic_path, pic_name, sim)
  38. pic_list = split(pic_name, "|")
  39. //这里将字符串转换成数组,每一个数组元素就是一个图片名称
  40. For i = 0 To UBound(pic_list)
  41. //注意根据数组元素的大小决定循环的次数,这样每循环一次,就找一个图
  42. FindPic x1, y1, x2, y2, pic_path & pic_list(i), sim, intX, intY
  43. If intX > 0 And intY > 0 Then
  44. 找图 = i + 1
  45. //因为数组从0开始计数,而生活中通常从1开始计数,所以+1
  46. //这样返回几,就是找到 图片 变量中第几个图片。
  47. //有了找图函数的返回值,下面的打印语句就可以去掉了。
  48. // TracePrint pic_list(i) & "真的找到,找图就特么任性"
  49. //MoveTo intX, intY
  50. Exit Function //这句非常重要,只要找到一个图,就退出函数,不继续找了
  51. End If
  52. Next
  53. 找图 = - 1
  54. //找不到图返回-1
  55. //TracePrint "竟然没找到,还能不能愉快地玩耍了。"
  56. End Functio
复制代码

五、等图的变化


  还有很多时候,我们找图的目的是将他做为一个标志,并不对图做任何操作,这样我们可以对等图函数做一些变化。
  在上面等图的基础上去掉等图函数中对鼠标的操作,在等图函数后面增加针对不同的图做不同操作的选择。
  这里就看出来为什么将找图、等图做成函数而不是子程序的优势了,就是为对返回找图的结果,以方便脚本的判断。
  这里的case部分,你根据图片的多少,可以灵活的增减case分支的个数。
  1. 图片路径 = "c:\test_game\"
  2. 图片 = "图1.bmp|图2.bmp|图3.bmp" //多个图片名称用半角竖杠分隔,形成字符串
  3. Scrx = Plugin.Sys.GetScRX //得到当前屏幕宽度
  4. Scry = Plugin.Sys.GetScRY //得到当前屏幕高度
  5. //--------------------------------------------------------------------------//
  6. 图片号码 = 等图(0, 0, Scrx, Scry, 图片路径, 图片, 0.9, 5, 1)//比找图多了一个参数
  7. Select Case 图片号码
  8. Case 1
  9. TracePrint "找到图1后做的操作"
  10. Case 2
  11. TracePrint "找到图2后做的操作"
  12. MoveTo intx, inty
  13. LeftClick 1
  14. Case 3
  15. TracePrint "找到图3后做的操作"
  16. MoveTo intx, inty
  17. LeftDoubleClick 1
  18. Case Else
  19. TracePrint "没有找到图的操作"
  20. End Select
  21. sel
  22. //--------------------------------------------------------------------------//
  23. Function 等图(x1, y1, x2, y2, pic_path, pic_name, sim, wait, mouse)
  24. //最后一个参数,值=1,表示找到图后单击;值=2,表示找到图就双击;值=0,只将指针移到图上
  25. //wait:记录最长等待的时间,这里以秒为单位
  26. 开始时间 = now()
  27. Do While DateDiff("s", 开始时间, now()) <= wait
  28. 图号 = 找图(x1, y1, x2, y2, pic_path, pic_name, sim)
  29. //这里调用找图函数
  30. If 图号 > 0 Then
  31. TracePrint 图号 & "号图找到了,退出等图函数!"
  32. 等图 = 图号
  33. Exit Function
  34. End If
  35. Loop
  36. TracePrint "竟然没找到,还能不能愉快地玩耍了。"
  37. 等图 = -1
  38. End Function
  39. //--------------------------------------------------------------------------//
  40. //--------------------------------------------------------------------------//
  41. Function 找图(x1, y1, x2, y2, pic_path, pic_name, sim)
  42. pic_list = split(pic_name, "|")
  43. //这里将字符串转换成数组,每一个数组元素就是一个图片名称
  44. For i = 0 To UBound(pic_list)
  45. //注意根据数组元素的大小决定循环的次数,这样每循环一次,就找一个图
  46. FindPic x1, y1, x2, y2, pic_path & pic_list(i), sim, intX, intY
  47. If intX > 0 And intY > 0 Then
  48. 找图 = i + 1
  49. //因为数组从0开始计数,而生活中通常从1开始计数,所以+1
  50. //这样返回几,就是找到 图片 变量中第几个图片。
  51. //有了找图函数的返回值,下面的打印语句就可以去掉了。
  52. // TracePrint pic_list(i) & "真的找到,找图就特么任性"
  53. //MoveTo intX, intY
  54. Exit Function //这句非常重要,只要找到一个图,就退出函数,不继续找了
  55. End If
  56. Next
  57. 找图 = - 1
  58. //找不到图返回-1
  59. //TracePrint "竟然没找到,还能不能愉快地玩耍了。"
  60. End Function
复制代码

六、等图的测试技巧


  为什么增加这一部分,是因为在以前在学习过程中,大家不知道怎么测试脚本的各种情况,这里给大家讲一些测试方面的技巧。
1. 为了学习的方便,做图时,截取桌面的图标(截取的方法,见上篇神奇的找多图、等多图(上篇)
2. 在桌面上右键,去掉查看中的自动排列方式,因为我们要随意改变图标的位置。
3. 因为FindPic命令是按从左上到右下的顺序来找图的,所以为了更好的测试效果,你可以在测试过程中,将其中某个图标拖动位置,以测试各种情况。(比如:图1是左上角第一个图标,那么每次找图脚本都是找到图1,这时,我们可以将图这个图标拖到桌面右侧,这样,脚本就会找其他图了。这个情况下测试时,按键精灵不能最大化,至少把左侧 的桌面图标显示出来。
4. 要想测试找不到所有的图,只需要将按键精灵最大化,脚本运行过程中看不到桌面就可以了。

七、总结


  实际上,很多人在等图时,代码和我的并不一样,这主要取决于你找到图后,到底想干什么。我上面主给出两种应用的方法,你还可以想出很多种形式,比如鼠标的操作这部分可以直接话在找图函数中,这样可以避免跨函数调用 inxt、inty这两个变量的值。
  本帖是教程,不是直接给你源代码,你只要明白了找图、等图的原理,就可以在实际应用中,举一反三、灵活应用了。

也欢迎有兴趣学习按键的朋友参加按键学院。接受官方工程师的指导,这是学习最快方法啦。


按粉、童鞋,顺手点个吧,还可以评分送朵小鲜花

按键学院基础班火热招中

回实战班:回合制通用教学火热加盟

招生对象:零基础用户
招生人数:99人
学习日期:两个月(2015.3.16-2015.5.16)
上课时间:周1、周3、周5 19:30--21:30
导师:工程师06
实战游戏:飞扬神途 http://www.feiyangst.com/
本期重点:回合制游戏--神武
学习时效:终生有效
上课时间:周2、周4、周6的 20:00--22:00
导师:工程师07
技术支持:果儿(院刊编辑
点我进入按键学院报名啦 招生细节进群咨询招生办主任:2群-372671254(优先加入) 1群-376122403

《本文按键学院提供技术支持》


    已有8评分我要评分查看所有评分

    最后编辑深度映像 最后编辑于 2017-01-24 00:40:53
    本主题由 版主 深度映像 于 2017/2/19 21:26:58 执行 审核帖子 操作
    总有技术让你痴迷,总有帖子为你而写,总有朋友陪伴你学习按键的时光


    深 度 技 术 ★ 只 为 游 戏 的 美 好


    【按键学院免费交流QQ群号】:3群—170084238(请加)、安卓群: 115768679(请加)、 1群—376122403、 2群—372671254。

    按键学院报名网址

    2#

    要要要切克

    3#

    哈哈哈哈哈

    4#

    dddddddddddd

    5#

    555555555555

    6#

    学习

    7#

    查看查看

    8#

    1111111

    9#

    33QQQQQQQQQQQQQQQ.....................

    10#

    xuexina

    11#

    非常实用

    12#

    DateDiff

    1+1未必≠1
    2+2也未必≠2
    13#

    技术帖】深度精通找多图、等多图(下)修改

    14#

    谢谢分享啊

    15#

    来看下集

    16#

    不会找多图学习

    17#

    又要回复一次

    18#

    小白学习中

    19#

    深度精通找多图、等多图(下)修改

    20#

    回复 1楼深度映像的帖子

    谢谢楼主,急需

    发新话题 回复该主题