1. 延时2000毫秒
  2. //做脚本首要的工作就是根据需要的功能建立一个框架。按实际的需要的判断和动作做一个清单,这个时候不需要很详细,只需要考虑要点。
  3. //例如本例中的框架结构和考虑的要点应该如下:
  4. //判断1、找怪(解:通过小地图上的红点和蓝点的距离确定怪的方位,并按照地图比例换算到大地图的坐标)找怪过程中
  5. //还同时检测游戏结束与否的标志
  6. //动作1、如果找到怪根据上面得到的坐标点击打怪,进入判断2
  7. // 如果没有找到怪,人物移动再判断1(因此可以在此处插入人物移动子程序)
  8. // 如果检测到游戏结束则停止脚本
  9. //判断2、是否打到了怪。(解:通过检测怪物血条)
  10. //动作2、检测到了怪物血条则继续,检测不到回到判断2
  11. //判断3、在打怪过程中是否需要补血(通过检测人物血条)
  12. //动作3、如果缺血则按1键补血,否则没有动作程序往下走
  13. //判断4、打怪是否结束(仍然通过怪物血条)
  14. //动作4、没有怪物血条表示打怪结束,程序回到判断1,重新找怪
  15. // 还有怪物血条,打怪持续中,回到判断3持续检测血量以免人物被打死
  16. //整个任务的主框架就是这么简单。有了主框架以后就可以考虑每一步骤的实现方法,也就是考虑用哪些点和颜色来进行判断。
  17. //通过前面的练习应该大家也会有一些心得,我这里就不一一累述,只讲一些特殊的地方和一些技巧。
  18. //这里比较特殊的是人物血条的判断。因为是半圆型的血条,如果要考虑自己设定补血百分比的话,就需要用到一些三角函数的知识。
  19. //具体可参考程序里面的说明。
  20. //同时我的程序里面还增加了一些保证稳定的程序段,比如点怪的时候一下没有点到怎么办,可以增加一个判断,
  21. //多少秒没有检测到怪物血条则跳出等待怪物血条的循环,重新寻找怪物。这样的判断不需要在大框架考虑,
  22. //而是主要程序成型以后在需要的地方增加。以保证程序主框架的简洁和完整。
  23. //虽然高级版本的按键精灵提供了多线程的功能,但是不建议随意的使用。在程序主结构清晰,单线循环完全可以满足要求的情况下
  24. //尽量不要使用多线。这保证了程序主线的连贯性,逻辑上也更清晰,容易对程序进行跟踪和解读,实际上也避免发生各种意外的冲突。
  25. //--------------------------------------------------------------
  26. //获得游戏窗口句柄和位置尺寸等信息以便使用后台操作
  27. 调用插件命令 hw=Window.mousepoint()
  28. 调用插件命令 clintrect=Window.GetClientRect(hw)
  29. rect=split(clintrect,"|",-1,1)
  30. xoffset=cint(rect(0))
  31. yoffset=cint(rect(1))
  32. xwinsize=cint(rect(2))
  33. ywinsize=cint(rect(3))
  34. //系统和窗口初始化完毕------------------------------------------
  35. //
  36. //以下语句判断是否获得的是游戏窗口(游戏窗口尺寸是550x400)
  37. 如果表达式 (xwinsize<>550 or ywinsize<>400) 为真,则
  38.     调用外部VBScript子程序 messagebox("请将鼠标放在游戏窗口内启动脚本。")
  39.     跳转到标记 end
  40. 条件结束
  41. //
  42. //以下程序段用于参数设置
  43. //补血百分比,这个比例在应用的时候用户根据具体情况调整,可保证安全的前提下达到最少加血次数
  44. 用户定义变量 fillredscale=14 补血百分比
  45. //参数设置完毕--------------------------------------------------
  46. //
  47. //以下程序段用于定义关键点(所有点位均以游戏窗口左上角为基准零点)
  48. //之所以把一些关键点位都集中在一起定义是为了方便以后修改
  49. //
  50. //1、血条关键点及颜色(因为是半圆形血条,所以用圆心和半径来定义血条,用角度来分来确定补血百分比,其中xcenter,ycenter为圆心,r为半径
  51. xcenter=49: ycenter=46: colorred="0000FF": r=32
  52. //通过下面的公式来计算对应补血百分比所要检测的点的位置(其中的ang代表补血百分比所代表的弧度,因为sin,cos函数都是用弧度来计算的)
  53. ang=(3.1415926*fillredscale/100)
  54. xred=cint(xcenter-r*sin(ang))
  55. yred=cint(ycenter+r*cos(ang))
  56. //
  57. //2、怪物血条基准点和颜色(用怪物血条边框的黑色来判断怪是否打死)
  58. xbar=209: ybar=25: colorbar="000000"
  59. //
  60. //3、小地图范围和怪物颜色(1和2分别为左上角和右下角点)
  61. xmap1=420 :ymap1=20 :xmap2=530 :ymap2=100: coloranimy="0000CC": colorme="009900"
  62. xmapcenter=475: ymapcenter=60
  63. //
  64. //4、人物头发的黑色可以用来判断游戏是否结束
  65. xhead=47: yhead=33: colorhead="000000"
  66. //
  67. //定义基本点完毕------------------------------------------------
  68. //
  69. //****************************************************************
  70. //
  71. //挂机程序正式开始
  72. 标记 start
  73. //先将鼠标移动到窗口右下角位置以免影响取色
  74. 鼠标移到 xoffset+xwinsize/2 , yoffset+ywinsize/2
  75. //建立两个变量分别记录血瓶数量和打怪个数
  76. redbt=50: killanimy=0
  77. //记录程序运行时间
  78. timestart=now
  79. //
  80. 标记 寻找敌人
  81. //在小地图上搜索敌人并转换为大地图的坐标
  82. ////用中心向外的找色方式,以确保找到的怪距离自己最近,范围向内收缩两个像素点,为了避免怪物太靠边,找到了但点不到的情况
  83. 调用插件命令 ret=BkgndColor.FindCenterColor(hw,xmap1+2,ymap1+2,xmap2-2,ymap2-2,coloranimy)
  84. 如果表达式 (ret="-1|-1") 为真,则
  85.     //小地图没有找到怪则调用人物移动子命令,并重新寻找敌人
  86.     调用子程序 人物移动
  87. 否则
  88.     //找到了怪则拆分出坐标值
  89.     zuobiao=split(ret,"|",-1,1)
  90.     x1=zuobiao(0)
  91.     y1=zuobiao(1)
  92.     //小地图和大地图像素比例为1:5 ,根据这个比例,把小地图上怪和人的位差换算到大地图上,从而得到怪的坐标点
  93.     xanimy=xwinsize/2+7+(x1-xmapcenter)*5
  94.     //上面公式中加了一个7,是因为在调试中发现大地图上人物的头的中心并不在整个窗口中心,而要往右偏7个像素点左右
  95.     yanimy=ywinsize/2+(y1-ymapcenter)*5
  96.     调用子程序 战斗
  97. 条件结束
  98. //此处判断一下游戏是否结束,可用左上角人物头像的头发颜色来判断
  99. 调用插件命令 color1=BkgndColor.GetPixelColor(hw,xhead,yhead)
  100. 如果表达式 (color1<>clng("&H" & colorhead)) 为真,则