<魔域>按键精灵脚本

用了三天时间才写完,实现了通过图片识别读取坐标数值,自动寻路等简单功能。

主要的难点在于游戏中的坐标系,和电脑屏幕的坐标系存在三维旋转关系,难以换算。

  1 //全局变量:第一个数左上右下坐标
  2 Global first1x 
  3 Global first1y 
  4 Global first2x 
  5 Global first2y
  6 
  7 //全局变量:xp技点位置
  8 Global xpx 
  9 Global xpy
 10 
 11 //全局变量:读取到的数字
 12 Global x1
 13 Global x2
 14 Global x3
 15 Global x4
 16 Global y1
 17 Global y2
 18 Global y3
 19 Global y4
 20 
 21 //全局变量:读到的坐标
 22 Global nowx
 23 Global nowy
 24 
 25 //全局变量:屏幕中间点实际坐标
 26 Global actualx
 27 Global actualy
 28 
 29 
 30 //主体
 31 
 32 //初始化变量
 33 Call init()
 34 
 35 //自动按键
 36 Call startKey()
 37 
 38 //自动点击XP技
 39 If Form1.CheckBox1.Value = 1 Then 
 40     BeginThread findclick()
 41 End If
 42 
 43 //自动寻路
 44 Select Case Form1.ComboBox1.ListIndex
 45 Case 0
 46     Call go1()
 47 Case Else
 48 End Select
 49 
 50 
 51 // 子程序:按1寻路
 52 Sub go1()
 53     While 1
 54         Call headTo(592, 765)
 55         Call headTo(592, 930)
 56         Call headTo(592, 765)
 57         Call headTo(540, 765)
 58         Call headTo(540, 923)
 59         Call headTo(540, 765)
 60     Wend
 61 End Sub
 62 
 63 //子程序:初始化
 64 Sub init()
 65 
 66     first1x = 1848
 67     first1y = 21
 68     first2x = 1855
 69     first2y = 32
 70     
 71     xpx = 1784
 72     xpy = 984
 73 
 74     //获取屏幕中间点实际坐标
 75     actualx = Plugin.GetSysInfo.GetScreenResolutionX / 2
 76     actualy = Plugin.GetSysInfo.GetScreenResolutionY / 2
 77 
 78 End Sub
 79 
 80 //子程序:得到当前坐标,保存到nowx,nowy
 81 Sub get()
 82 
 83     //得出X坐标
 84     x1 = find(first1x, first1y, first2x, first2y)
 85   
 86     x2 = find(first1x + 6, first1y, first2x + 6, first2y)
 87   
 88     If x2 >= 0 Then  
 89         x3 = find(first1x + 12, first1y, first2x + 12, first2y)
 90         If x3 >= 0 Then 
 91             x4 = find(first1x + 18, first1y, first2x + 18, first2y)
 92             If x4 >= 0 Then 
 93                 nowx = x1 * 1000 + x2 * 100 + x3 * 10 + x4
 94             Else 
 95                 nowx = x1*100 + x2*10 + x3
 96             End If
 97         Else 
 98             nowx = x1*10 + x2
 99         End If
100     Else 
101         nowx = x1
102     End If
103 
104     //得出Y坐标
105     y1 = find(first1x + 29, first1y, first2x + 29, first2y)
106   
107     y2 = find(first1x + 35, first1y, first2x + 35, first2y)
108   
109     If y2 >= 0 Then  
110         y3 = find(first1x + 41, first1y, first2x + 41, first2y)
111         If y3 >= 0 Then 
112             y4 = find(first1x + 47, first1y, first2x + 47, first2y)
113             If y4 >= 0 Then 
114                 nowy = y1 * 1000 + y2 * 100 + y3 * 10 + y4
115             Else 
116                 nowy = y1*100 + y2*10 + y3
117             End If
118         Else 
119             nowy = y1*10 + y2
120         End If
121     Else 
122         nowy = y1
123     End If
124 
125 End Sub
126 
127 //函数:通过参数first1x,first1y,first2x,first2y返回检测到的数字
128 Function find(first1x, first1y, first2x, first2y)
129 
130     FindPic first1x,first1y,first2x,first2y,"Attachment:.bmp",1,intX,intY
131     If intX > 0 And intY > 0 Then 
132         find = 0
133         Exit Function
134     End If
135     FindPic first1x,first1y,first2x,first2y,"Attachment:1.bmp",1,intX,intY
136     If intX > 0 And intY > 0 Then 
137         find = 1
138         Exit Function 
139     End If
140     FindPic first1x,first1y,first2x,first2y,"Attachment:2.bmp",1,intX,intY
141     If intX > 0 And intY > 0 Then 
142         find = 2
143         Exit Function 
144     End If
145     FindPic first1x,first1y,first2x,first2y,"Attachment:3.bmp",1,intX,intY
146     If intX > 0 And intY > 0 Then 
147         find = 3
148         Exit Function 
149     End If
150     FindPic first1x,first1y,first2x,first2y,"Attachment:4.bmp",1,intX,intY
151     If intX > 0 And intY > 0 Then 
152         find = 4
153         Exit Function 
154     End If
155     FindPic first1x,first1y,first2x,first2y,"Attachment:5.bmp",1,intX,intY
156     If intX > 0 And intY > 0 Then 
157         find = 5
158         Exit Function 
159     End If
160     FindPic first1x,first1y,first2x,first2y,"Attachment:6.bmp",1,intX,intY
161     If intX > 0 And intY > 0 Then 
162         find = 6
163         Exit Function 
164     End If
165     FindPic first1x,first1y,first2x,first2y,"Attachment:7.bmp",1,intX,intY
166     If intX > 0 And intY > 0 Then 
167         find = 7
168         Exit Function 
169     End If
170     FindPic first1x,first1y,first2x,first2y,"Attachment:8.bmp",1,intX,intY
171     If intX > 0 And intY > 0 Then 
172         find = 8
173         Exit Function 
174     End If
175     FindPic first1x,first1y,first2x,first2y,"Attachment:9.bmp",1,intX,intY
176     If intX > 0 And intY > 0 Then 
177         find = 9
178         Exit Function 
179     End If
180 
181     find = -1
182 
183 End Function 
184 
185 
186 //子程序:前往目标地点
187 Sub headTo(x, y)
188     BeginThread click
189     While 1
190         Call get()
191         a = nowx - x
192         b = nowy - y
193         
194         //  判断是否已经到达
195         If (a * a + b * b) < 1000 Then 
196             Exit Sub
197         End If
198         
199         //  屏幕向量      
200         screenx = (b - a) * 1.1
201         screeny = (a + b) * 0.6
202         
203         d = 300 / (Sqr(1 + (screenx * screenx) / (screeny * screeny)))
204         c = (screenx / screeny) * d
205         
206         If c * screenx < 0 Then 
207             c = -c
208         End If
209         
210         If d * screeny > 0 Then 
211             d = -d
212         End If
213         
214         c = c + actualx
215         d = d + actualy
216         
217         //  鼠标指向      
218         MoveTo c, d   
219         Delay 2000        
220     Wend
221 
222 End Sub
223 
224 // 线程:不停点击鼠标
225 Sub click()
226     clickID = GetThreadID()
227     While 1
228         LeftClick 1
229         Delay 500
230     Wend
231 End Sub
232 
233 // 子程序:开始所有键盘点击
234 Sub startkey()
235     Select Case Form1.KeyBox1.ListIndex
236     Case 1
237         ms = Form1.MsBox1.Caption
238         BeginThread presskey(49, ms)
239     Case 2
240         ms = Form1.MsBox1.Caption
241         BeginThread presskey(50, ms)
242     Case 3
243         ms = Form1.MsBox1.Caption
244         BeginThread presskey(51, ms)
245     Case 4
246         ms = Form1.MsBox1.Caption
247         BeginThread presskey(52, ms)
248     Case 5
249         ms = Form1.MsBox1.Caption
250         BeginThread presskey(53, ms)
251     Case 6
252         ms = Form1.MsBox1.Caption
253         BeginThread presskey(54, ms)
254     Case 7
255         ms = Form1.MsBox1.Caption
256         BeginThread presskey(55, ms)
257     Case 8
258         ms = Form1.MsBox1.Caption
259         BeginThread presskey(56, ms)
260     Case 9
261         ms = Form1.MsBox1.Caption
262         BeginThread presskey(57, ms)
263     Case 10
264         ms = Form1.MsBox1.Caption
265         BeginThread presskey(112, ms)
266     Case 11
267         ms = Form1.MsBox1.Caption
268         BeginThread presskey(113, ms)
269     Case 12
270         ms = Form1.MsBox1.Caption
271         BeginThread presskey(114, ms)
272     Case 13
273         ms = Form1.MsBox1.Caption
274         BeginThread presskey(115, ms)
275     Case 14
276         ms = Form1.MsBox1.Caption
277         BeginThread presskey(116, ms)
278     Case 15
279         ms = Form1.MsBox1.Caption
280         BeginThread presskey(117, ms)
281     Case 16
282         ms = Form1.MsBox1.Caption
283         BeginThread presskey(118, ms)
284     Case 17
285         ms = Form1.MsBox1.Caption
286         BeginThread presskey(119, ms)
287     Case 18
288         ms = Form1.MsBox1.Caption
289         BeginThread presskey(120, ms)
290     Case Else
291     End Select
292     
293     Select Case Form1.KeyBox2.ListIndex
294     Case 1
295         ms = Form1.MsBox2.Caption
296         BeginThread presskey(49, ms)
297     Case 2
298         ms = Form1.MsBox2.Caption
299         BeginThread presskey(50, ms)
300     Case 3
301         ms = Form1.MsBox2.Caption
302         BeginThread presskey(51, ms)
303     Case 4
304         ms = Form1.MsBox2.Caption
305         BeginThread presskey(52, ms)
306     Case 5
307         ms = Form1.MsBox2.Caption
308         BeginThread presskey(53, ms)
309     Case 6
310         ms = Form1.MsBox2.Caption
311         BeginThread presskey(54, ms)
312     Case 7
313         ms = Form1.MsBox2.Caption
314         BeginThread presskey(55, ms)
315     Case 8
316         ms = Form1.MsBox2.Caption
317         BeginThread presskey(56, ms)
318     Case 9
319         ms = Form1.MsBox2.Caption
320         BeginThread presskey(57, ms)
321     Case 10
322         ms = Form1.MsBox2.Caption
323         BeginThread presskey(112, ms)
324     Case 11
325         ms = Form1.MsBox2.Caption
326         BeginThread presskey(113, ms)
327     Case 12
328         ms = Form1.MsBox2.Caption
329         BeginThread presskey(114, ms)
330     Case 13
331         ms = Form1.MsBox2.Caption
332         BeginThread presskey(115, ms)
333     Case 14
334         ms = Form1.MsBox2.Caption
335         BeginThread presskey(116, ms)
336     Case 15
337         ms = Form1.MsBox2.Caption
338         BeginThread presskey(117, ms)
339     Case 16
340         ms = Form1.MsBox2.Caption
341         BeginThread presskey(118, ms)
342     Case 17
343         ms = Form1.MsBox2.Caption
344         BeginThread presskey(119, ms)
345     Case 18
346         ms = Form1.MsBox2.Caption
347         BeginThread presskey(120, ms)
348     Case Else
349     End Select
350     
351     Select Case Form1.KeyBox3.ListIndex
352     Case 1
353         ms = Form1.MsBox3.Caption
354         BeginThread presskey(49, ms)
355     Case 2
356         ms = Form1.MsBox3.Caption
357         BeginThread presskey(50, ms)
358     Case 3
359         ms = Form1.MsBox3.Caption
360         BeginThread presskey(51, ms)
361     Case 4
362         ms = Form1.MsBox3.Caption
363         BeginThread presskey(52, ms)
364     Case 5
365         ms = Form1.MsBox3.Caption
366         BeginThread presskey(53, ms)
367     Case 6
368         ms = Form1.MsBox3.Caption
369         BeginThread presskey(54, ms)
370     Case 7
371         ms = Form1.MsBox3.Caption
372         BeginThread presskey(55, ms)
373     Case 8
374         ms = Form1.MsBox3.Caption
375         BeginThread presskey(56, ms)
376     Case 9
377         ms = Form1.MsBox3.Caption
378         BeginThread presskey(57, ms)
379     Case 10
380         ms = Form1.MsBox3.Caption
381         BeginThread presskey(112, ms)
382     Case 11
383         ms = Form1.MsBox3.Caption
384         BeginThread presskey(113, ms)
385     Case 12
386         ms = Form1.MsBox3.Caption
387         BeginThread presskey(114, ms)
388     Case 13
389         ms = Form1.MsBox3.Caption
390         BeginThread presskey(115, ms)
391     Case 14
392         ms = Form1.MsBox3.Caption
393         BeginThread presskey(116, ms)
394     Case 15
395         ms = Form1.MsBox3.Caption
396         BeginThread presskey(117, ms)
397     Case 16
398         ms = Form1.MsBox3.Caption
399         BeginThread presskey(118, ms)
400     Case 17
401         ms = Form1.MsBox3.Caption
402         BeginThread presskey(119, ms)
403     Case 18
404         ms = Form1.MsBox3.Caption
405         BeginThread presskey(120, ms)
406     Case Else
407     End Select
408     
409     Select Case Form1.KeyBox4.ListIndex
410     Case 1
411         ms = Form1.MsBox4.Caption
412         BeginThread presskey(49, ms)
413     Case 2
414         ms = Form1.MsBox4.Caption
415         BeginThread presskey(50, ms)
416     Case 3
417         ms = Form1.MsBox4.Caption
418         BeginThread presskey(51, ms)
419     Case 4
420         ms = Form1.MsBox4.Caption
421         BeginThread presskey(52, ms)
422     Case 5
423         ms = Form1.MsBox4.Caption
424         BeginThread presskey(53, ms)
425     Case 6
426         ms = Form1.MsBox4.Caption
427         BeginThread presskey(54, ms)
428     Case 7
429         ms = Form1.MsBox4.Caption
430         BeginThread presskey(55, ms)
431     Case 8
432         ms = Form1.MsBox4.Caption
433         BeginThread presskey(56, ms)
434     Case 9
435         ms = Form1.MsBox4.Caption
436         BeginThread presskey(57, ms)
437     Case 10
438         ms = Form1.MsBox4.Caption
439         BeginThread presskey(112, ms)
440     Case 11
441         ms = Form1.MsBox4.Caption
442         BeginThread presskey(113, ms)
443     Case 12
444         ms = Form1.MsBox4.Caption
445         BeginThread presskey(114, ms)
446     Case 13
447         ms = Form1.MsBox4.Caption
448         BeginThread presskey(115, ms)
449     Case 14
450         ms = Form1.MsBox4.Caption
451         BeginThread presskey(116, ms)
452     Case 15
453         ms = Form1.MsBox4.Caption
454         BeginThread presskey(117, ms)
455     Case 16
456         ms = Form1.MsBox4.Caption
457         BeginThread presskey(118, ms)
458     Case 17
459         ms = Form1.MsBox4.Caption
460         BeginThread presskey(119, ms)
461     Case 18
462         ms = Form1.MsBox4.Caption
463         BeginThread presskey(120, ms)
464     Case Else
465     End Select
466 End Sub
467 
468 //线程:每隔ms按num键
469 Sub presskey(num,mss)
470     While 1
471         KeyPress num, 1
472         Delay ms
473     Wend
474 End Sub
475 
476 // 查找和点击XP技能
477 Sub findclick()
478     While 1
479         IfColor xpx, xpy, "CF71A9", 2 Then
480             SaveMousePos 
481             MoveTo 1784, 984
482             LeftClick 1
483             RestoreMousePos
484         Else
485         End If
486         Delay 15000
487     Wend
488 End Sub
原文地址:https://www.cnblogs.com/yangleda/p/4237090.html