魔兽世界三部曲--自动寻路、自动释放灵魂、自动复活的思路及实现(二)

本文介绍了一个魔兽世界插件的开发过程,包括自动寻路、自动释放灵魂和自动复活的功能实现。通过Python代码,利用反正切函数确定人物朝向,解决寻路中的转向问题,并处理地图障碍物和卡点中断。最后,讨论了自动释放灵魂和复活的API调用,以及将插件打包成exe的可能性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过第一节的讲解,我们实现了发现目标宠物自动施放技能,在现实场景中,老是会被部落偷袭,那怎么实现自动释放灵魂,自动寻路,自动复活呢?这就是这节要表述的内容,先发张图看看效果:

这里面最重要的就是自动寻路,做功能之前我们先理一思路:

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:

这样一款自行的插件辅助就开发得差不多,后续上面寻路的功能可以自行增加取坐标点的功能,这样不是就可以再任何的场景自定义路线了吗?

以上就是自动寻路跑尸复活的思路及实现,此文章仅供大家学习交流,探讨技术的方向及实现的成就感,严禁用于商业,否则后果自负,好了,又到了此章结束的时候了,下一章可能我来讲一下非内存一键智能宏的实现、自动钓鱼或者自动打怪的实现,再见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值