通过第一节的讲解,我们实现了发现目标宠物自动施放技能,在现实场景中,老是会被部落偷袭,那怎么实现自动释放灵魂,自动寻路,自动复活呢?这就是这节要表述的内容,先发张图看看效果:
这里面最重要的就是自动寻路,做功能之前我们先理一思路:
1、如何获取当前坐标?
2、死亡后人物的朝向可能是随机的,如何知道死亡后自己人物的朝向?
3、如何让人物朝着终点坐标移动?
问题1其实网上有很多参考的,因为我们用的是图色,所以配合魔兽api开发插件来实现当前坐标展示,这里就不多说了,自行网上找下,贴个图:
弄清这2,3问题其实很简单,用反正切函数就可以了,但是对于方向感差的或者初学者就有点蒙,我们画个图来了解下:
假设(x,y)是人物的坐标,当人物死亡释放灵魂后,我们不按任何方向键,直接按W朝着面朝的移动一段距离,(x,y)到(x1,y1)是人物朝着前方移动的距离,以人物初始的坐标为中心,这样是不是就知道了当前人物是朝着西北方向移动的,先暂且不看角度,(x2,y2)就是我们要到达的坐标,接下来继续看:
人物朝前移动后到达了(x1,y1),通个2个坐标就知道角度与方向,现在以(x1,y1)为中心,我们用atan2反正切函数,以X轴正方向为基线,黄色线的角就当前人物朝向的角度,在X轴上方是逆时针看,得到角度在0到-180度范围,蓝色线的角就是当前人物坐标与终点坐标的角度,在X轴下方是顺时针看,得到的角度在0到180度范围。
如果当前人物想要走到(x2,y2)是不是就是要向右旋转粉色线的角度,这里可能就有人要问,我也可以向左旋转,当然是可以的,但是肯定是希望以旋转最小的角度调整好方向,基本以上我们就可以写出代码,以下是Python写的代码,语言大同小异,来看看:
import math
#初始坐标
point1=[3,3]
#朝面向方向移动后的坐标
point2=[2,1]
#终点坐标
lastpoint=[4,4]
#math.atan2(y,x)函数
#朝面向方向移动的角度
radian1 = math.atan2(point2[1] - point1[1], point2[0] - point1[0])
angle1 = math.degrees(radian1)
#朝面向方向移动后与终点坐标的角度
radian2 = math.atan2(lastpoint[1] - point2[1], lastpoint[0] - point2[0])
angle2 = math.degrees(radian2)
#面朝方向与终点坐标的角度
mdu = angle1 - angle2
# -1向左,1向右
if mdu > 0 and mdu <= 180:
fangx = -1
anglex = mdu
elif mdu >= -360 and mdu <= -180:
fangx = -1
anglex = 360 + mdu
elif mdu > -180 and mdu <= 0:
fangx = 1
anglex = abs(mdu)
elif mdu > 180 and mdu <= 360:
fangx = 1
anglex = 360 - mdu
if fangx == 1:
testfx = '向右旋转:{}度'.format(anglex)
else:
testfx = '向左旋转:{}度'.format(anglex)
print(testfx)
魔兽的地图最左上角是(0,0),运行后得到的结果:
到这里最重要的问题就解决了,我们就可以写个线程运行,那后面问题又来了,知道角度后,如何旋转这么多度?我大致测试了下,按住方向键<-或->1秒的时间转动的角度大概在170-200度之间,通过这个可大概换算一下,有点误差不会太影响,或者大家有更好的方法可以给我说下,咱们继续,在实际测试的过程中,地图上会有很多障碍物,我们不可能一条直线跑到底,那我们就可以封装跑动的方法,然后在寻路的路径上添加转角坐标点,写个循环依次执行,这样就会依次到达设定的坐标点,比如这样:
points = [(50.780, 31.983), (51.991, 33.084), (52.827, 32.613), (54.650, 32.976), (54.985, 33.832),
(59.177, 34.836),
(59.870, 33.607), (62.007, 33.604), (61.959, 32.957)]
# 查询当前位置与坐标的关系
minnum, mindist = self.getcurposition(points)
print("当前位置:", minnum, mindist)
if minnum >= len(points) - 2 and mindist < 0.08:
print("已达终点")
else:
# 最后一个坐标用来判断树的方向
for i in range(minnum, len(points) - 1):
self.editangle(points[i]) # 初始开始方向
-----这里是封装的执行程序,一般为while True-----
# 执行完毕调整对着树的方向
self.editangle(points[len(points) - 1])
# 获取当前位置与坐标点那个位置最近并获取序号
def getcurposition(self, points):
distances = []
# 排除最后一个坐标
for i in range(len(points) - 1):
cpoint1 = self.getpoint()
#这里是获取2个坐标的距离的方法,自己写个就行
_, _, distance = self.get_orientation(cpoint1, points[i])
distances.append(distance)
mindist = min(distances)
minnum = distances.index(mindist)
return minnum, mindist
# 初始化角度
def editangle(self, last_point):
cpoint1 = self.getpoint()
pyautogui.keyDown('w')
time.sleep(0.01)
pyautogui.keyUp('w')
cpoint2 = self.getpoint()
#这里是计算方向与角度的方法,跟上上面讲的自行封装
_, fangx, anglex = self.anglemain(cpoint1, cpoint2, last_point)
# 调整方向
self.changangle(fangx, anglex)
在实际过程中还会遇到卡点的问题,因为是图色,比如一些原因会造成执行过程中中断,如何续点也是一个要解决的问题,所以我会采用读取当前坐标与坐标集遍历匹配,找到那个坐标距离当前坐标最近,我们就从这个坐标重新开始,这样就解决了卡点或者中断的问题,至于如何操作按键就不用多说了,自动释放灵魂和自动复活,这个魔兽API里就有
RepopMe() 自动释放灵魂
RetrieveCorpse() 自动复活
在魔兽的插件中就能直接执行,然后再结合第一章所讲的,就完成了自动蹲点守宝宝,自动跑尸复活的功能了,然后自己生成一个exe:
这样一款自行的插件辅助就开发得差不多,后续上面寻路的功能可以自行增加取坐标点的功能,这样不是就可以再任何的场景自定义路线了吗?
以上就是自动寻路跑尸复活的思路及实现,此文章仅供大家学习交流,探讨技术的方向及实现的成就感,严禁用于商业,否则后果自负,好了,又到了此章结束的时候了,下一章可能我来讲一下非内存一键智能宏的实现、自动钓鱼或者自动打怪的实现,再见!