def get_direcself gray = nparray55 55 55 blue = nparray234 191 4 white = nparray210 210 210 sred = nparray49 49 140 yellow = nparray145 192 220 black = nparra
获取方向
def get_direc(self): # 定义颜色阈值 gray = np.array([55, 55, 55]) blue = np.array([234, 191, 4]) white = np.array([210, 210, 210]) sred = np.array([49, 49, 140]) yellow = np.array([145, 192, 220]) black = np.array([0, 0, 0]) # 定义屏幕大小 shape = (int(self.scx * 190), int(self.scx * 190)) # 获取局部屏幕 local_screen = self.get_local(0.9333, 0.8657, shape) # 将屏幕中与蓝色差异较小的部分设置为蓝色 local_screen[np.sum(np.abs(local_screen - blue), axis=-1) <= 150] = blue # 获取黑白地图 bw_map = self.get_bw_map(gs=0) # 写入临时图片文件 cv.imwrite('imgs/tmp2.jpg', bw_map) # 初始化位置偏移量 self.loc_off = 0 # 获取当前位置 self.get_loc(bw_map, 40 - self.find * 15) # 如果当前位置为起点,则生成地图 if self.find == 0: self.write_map(bw_map) self.get_map() else: # 获取当前朝向 self.ang = 360 - self.get_now_direc(local_screen) - 90 # 初始化变量 mn_dis = 100000 loc = 0 type = -1 bl = 0 # 如果当前位置为第二个目标,则设置变量 if self.his_loc[0] == 30: bl = 1 # 遍历目标点,获取距离最近的目标点 for i, j in self.target: if self.get_dis(i, self.real_loc) < mn_dis: mn_dis = self.get_dis(i, self.real_loc) loc = i type = j # 如果未找到目标点,则使用上一个目标点 if loc == 0: loc = self.last # 计算当前朝向与目标点之间的夹角 ang = math.atan2(loc[0] - self.real_loc[0], loc[1] - self.real_loc[1]) / math.pi * 180 sub = ang - self.ang while sub < -180: sub += 360 while sub > 180: sub -= 360 # 如果当前位置不在第二个目标点,则移动鼠标指向目标点 if bl == 0: self.mouse_move(sub) self.ang = ang # 根据目标点类型设置速度 if type == 1: ps = 8 elif type == 0: ps = 6 else: ps = 6 # 按下“W”键 pyautogui.keyDown('w') time.sleep(0.5) # 记录当前时间 ltm = time.time() # 获取黑白地图 bw_map = self.get_bw_map(sbl=bl) # 获取当前位置 self.get_loc(bw_map, rg=18) sloc = self.real_loc # 计算当前距离目标点的距离 ds = self.get_dis(self.real_loc, loc) # 初始化距离列表 dls = [100000, 100000, 100000, ds] sds = ds td = 0 t = 2 # 开始循环 for i in range(1000): # 记录当前时间 ctm = time.time() # 获取黑白地图 bw_map = self.get_bw_map(sbl=(i <= 4 and bl)) # 获取当前位置 self.get_loc(bw_map, fbw=1) # 如果当前位置不在第二个目标点,则计算位置偏移量 if i <= 4 and bl: fx = 0.4 / (ctm - ltm) * (self.real_loc[0] - sloc[0]) fy = 0.4 / (ctm - ltm) * (self.real_loc[1] - sloc[1]) self.offset = (int(fx), int(fy)) # 如果当前位置在第二个目标点或者已经超过第四次循环,则计算真实位置 if i > 4 or bl == 0: self.real_loc = (self.real_loc[0] + self.his_loc[0] + self.offset[0], self.real_loc[1] + self.his_loc[1] + self.offset[1]) # 计算当前朝向与目标点之间的夹角 ang = math.atan2(loc[0] - self.real_loc[0], loc[1] - self.real_loc[1]) / math.pi * 180 sub = ang - self.ang while sub < -180: sub += 360 while sub > 180: sub -= 360 # 如果当前位置不在第二个目标点,则移动鼠标指向目标点 if i > 4 or bl == 0: self.mouse_move(sub) self.ang = ang # 在大地图中标记当前位置 self.big_map[self.real_loc[0] - 1:self.real_loc[0] + 2, self.real_loc[1] - 1:self.real_loc[1] + 2] = 49 cv.imwrite('imgs/bigmap.jpg', self.big_map) nds = self.get_dis(self.real_loc, loc) # 如果连续四次距离没有变化,则开始转向 if dls[-4] == nds: ts = ' da' if t > 0: pyautogui.keyUp('w') self.press('s', 0.35) self.press(ts[t], 0.5) pyautogui.keyDown('w') t -= 1 else: pyautogui.keyUp('w') break # 如果已到达目标点,则停止前进 if nds <= ps or self.check('f', 0.3901, 0.5093) or self.check('run', 0.9844, 0.7889, threshold=0.93) == 0: pyautogui.keyUp('w') break ds = nds dls.append(ds) # 输出日志 log.info("进入新地图或者进入战斗") # 根据目标点类型执行相应的操作 if type == 0: self.lst_tm = time.time() if type == 1: pyautogui.click() time.sleep(1) pyautogui.click() time.sleep(1) if type == 2 or type == 3: key_list = ['sasddww', 'sdsaaww', 'sssw'] key = key_list[random.randint(0, 2)] for i in range(-1, len(key)): time.sleep(0.4) self.get_screen() if self.check('f', 0.3901, 0.5093): for j in deepcopy(self.target): if j[1] == type: self.last = j[0] self.target.remove(j) break else: if i == -1: pyautogui.click() time.sleep(1.6) else: self.press(key[i], 0.25) if type == 2: self.tries += 1 if self.tries == 4: try: self.target.remove((loc, type)) except: pass elif ds <= 12: try: self.target.remove((loc, type)) except: pas
原文地址: https://www.cveoy.top/t/topic/fFBz 著作权归作者所有。请勿转载和采集!