免责声明
本视频内容纯属个人爱好,目的仅限于学习交流之用,对使用视频内的信息随之而来的风险与本人无关。本人不作任何承诺。也不为视频所提供的信息错误、残缺、延时或因依靠此类信息或文件所采取的任何行动负责。访问者可将本视频提供的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本人及相关权利人的合法权利。
相关视频链接:
https://www.bilibili.com/video/BV1qv41117Se
https://www.bilibili.com/video/BV1SA411n7Xb
https://www.bilibili.com/video/BV1oA411n7Su
源代码:
Sub 拾取金币()
//1.首选确定一个固定的坐标,以屏幕中心为固定坐标 1920*1080 原点(960,540)
//2.查找范围 714,375,1221,727(以人物为中心,上下左右2格的距离范围)
//3.计算出目标点距离中心的距离x
//(1)通过findcolor 查找金币的特征像素点 "00216B-050505",查找到此像素点坐标后,以该像素点为中心,进行上下左右扩散30的像素点的距离,
//(2)然后使用getcolornum指令,得到区域金币颜色像素点 "269DDD-101010" 的个数,假如区域像素点个数满足金币的像素点最小个数150,则认为这是金币,就得到了金币的坐标
//4.通过计算金币坐标的x和y轴分别减去原点坐标的x轴和y轴,得到了 纵向和横向的间距
//5.再计算出人物每一格移动的距离y 人物纵向移动的距离62 ,和人物横向移动的距离96
//那么移动的次数z=x/y 纵向移动次数= 纵向间距/62 横向移动的次数=横向间距/96
//横向移动次数=Round(Abs (intX - 960) / 96)
//纵向移动次数=Round(Abs(intY - 540)/62)
//再通过for循环反复执行function移动(),进行移动,移动的次数=z
//定义一个过程,可以在脚本中调用这个过程
//检测到地上有金币,才进入循环
//循环 while循环
//当循环条件成立的时候,反复执行循环体
//跳出循环的时机
//(1)地上没有金币了
//(2)超时了
Dim t=time()
While true
Dim intX,intY
FindColor 617,351,1320,755, "67DDFF-010101", 0, 1, intX, intY
//如果没有找到,intX和intY的值都会被置为-1
TracePrint intX
If Time() - t > 15 or intX = -1 Then
ShowMessage "拾取完毕,继续打怪"
TracePrint "拾取物品超时或者未检测到金币"
Exit While
End If
If intX > -1 Then
TracePrint "找到金币特征点X坐标是"& intX & " Y坐标是" &intY
//找到金币的特征像素点
Dim 颜色数量,横向移动次数,纵向移动次数
颜色数量=GetColorNum (intX - 30, intY - 30, intX + 30, intY + 30, "5CD8EE-101010", 0.9)
TracePrint "金币像素数量为"&颜色数量
If 颜色数量 > 150 Then
//发现金币了
横向移动次数=Round(Abs(intX - 968) / 96)
TracePrint "横向距离为:"&Abs(intX - 968)
TracePrint "横向移动次数为:"&横向移动次数
纵向移动次数 = Round(Abs(intY - 580) / 62)
TracePrint "纵向距离为:"&Abs(intY - 580)
TracePrint "纵向移动次数为:"&纵向移动次数
If intX > 960 And intY < 580 Then
//金币在原点右上方
For i = 1 To 横向移动次数
Call 移动(500, 600, 300)
Delay 50
Next
Delay 1000
For i = 1 To 纵向移动次数
Call 移动(450, 550, 250)
Delay 50
Next
//End If
ElseIf intX > 960 And intY = 580 then
//金币在原点右方
For i = 1 To 横向移动次数
Call 移动(500, 600, 300)
Delay 50
Next
ElseIf intX > 960 And intY > 580 then
//金币在原点右下方
For i = 1 To 横向移动次数
Call 移动(500, 600, 300)
Delay 50
Next
Delay 1000
For i = 1 To 纵向移动次数
Call 移动(450, 650, 250)
Delay 50
Next
ElseIf intX = 960 And intY > 580 then
//金币在原点下方
For i = 1 To 纵向移动次数
Call 移动(450, 650, 250)
Delay 50
Next
ElseIf intX < 960 And intY > 580 then
//金币在原点左下方
For i = 1 To 横向移动次数
Call 移动(400, 600, 300)
Delay 50
Next
Delay 1000
For i = 1 To 纵向移动次数
Call 移动(450, 650, 250)
Delay 50
Next
ElseIf intX < 960 And intY = 580 then
//金币在原点左方
For i = 1 To 横向移动次数
Call 移动(400, 600, 300)
Delay 50
Next
ElseIf intX < 960 And intY < 580 then
//金币在原点左上方
For i = 1 To 横向移动次数
Call 移动(400, 600, 300)
Delay 50
Next
Delay 1000
For i = 1 To 纵向移动次数
Call 移动(450, 550, 250)
Delay 50
Next
ElseIf intX = 960 And intY < 580 then
//金币在原点上方
For i = 1 To 纵向移动次数
Call 移动(450, 550, 250)
Delay 50
Next
End If
Else
//不是金币,找错了
TracePrint "没有找到金币"
ShowMessage "金色像素点不足150个,不是金币"
Exit While
End If
End If
Delay 1000
Wend
End Sub