You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
3.1 KiB
Python
99 lines
3.1 KiB
Python
2 months ago
|
import logging
|
||
|
import os
|
||
|
import time
|
||
|
from threading import Thread
|
||
|
import numpy as np
|
||
|
import cv2
|
||
|
from airtest.core.cv import Template
|
||
|
import pyautogui
|
||
|
from pynput import mouse
|
||
|
|
||
|
from mouse.logitech import Logitech
|
||
|
from screen_shot import screen_shot_mss, show, save_image
|
||
|
|
||
|
logger = logging.getLogger("airtest")
|
||
|
logger.setLevel(logging.NOTSET)
|
||
|
|
||
|
ENEMY_X = 5
|
||
|
ENEMY_Y = 15
|
||
|
CHAMPION_H = 190
|
||
|
CHAMPION_W = 130
|
||
|
|
||
|
GLOBAL_POS_LIS = []
|
||
|
|
||
|
|
||
|
def is_some_color(s_array):
|
||
|
# 查找是否有30个像素是暗红色
|
||
|
|
||
|
# 检查颜色条件
|
||
|
condition = ((s_array[:, :, 2] > 50) & (s_array[:, :, 2] < 70) &
|
||
|
(s_array[:, :, 1] > 0) & (s_array[:, :, 1] < 20) &
|
||
|
(s_array[:, :, 0] > 0) & (s_array[:, :, 0] < 20))
|
||
|
|
||
|
# 计算满足条件的像素数量
|
||
|
num_matching_pixels = np.sum(condition)
|
||
|
|
||
|
# 判断是否有30个像素满足条件
|
||
|
return num_matching_pixels >= 30
|
||
|
|
||
|
|
||
|
left_button_pressed = False
|
||
|
def mouse_handle():
|
||
|
while True:
|
||
|
time.sleep(0.2)
|
||
|
if left_button_pressed:
|
||
|
now_x, now_y = pyautogui.position()
|
||
|
if GLOBAL_POS_LIS:
|
||
|
x, y = GLOBAL_POS_LIS[0]
|
||
|
|
||
|
move_x = x - now_x
|
||
|
move_y = y - now_y
|
||
|
print(move_x, move_y)
|
||
|
Logitech.mouse.move(move_x, move_y)
|
||
|
|
||
|
|
||
|
def listen():
|
||
|
def on_click(x, y, button, pressed):
|
||
|
global left_button_pressed
|
||
|
if button == mouse.Button.left:
|
||
|
left_button_pressed = pressed
|
||
|
|
||
|
listener = mouse.Listener(on_click=on_click)
|
||
|
listener.start()
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
Thread(target=mouse_handle).start()
|
||
|
Thread(target=listen).start()
|
||
|
|
||
|
base_t = Template("./base.png")
|
||
|
lower_gray = np.array([70, 70, 70])
|
||
|
upper_gray = np.array([120, 120, 120])
|
||
|
while True:
|
||
|
tmp_pos_lis = []
|
||
|
now_screen = screen_shot_mss(2200, 900, 180, 90)
|
||
|
mask = cv2.inRange(now_screen, lower_gray, upper_gray)
|
||
|
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
|
||
|
|
||
|
for contour in contours:
|
||
|
x, y, w, h = cv2.boundingRect(contour)
|
||
|
if w > 20 and h < 5:
|
||
|
s = now_screen[y - 30:y + 30, x - 30:x + 30]
|
||
|
if s.any():
|
||
|
cv2.rectangle(now_screen, (x - 30, y - 30), (x + 30, y + 30), (0, 255, 0), thickness=2)
|
||
|
pos = base_t.match_in(s)
|
||
|
if pos:
|
||
|
if is_some_color(s):
|
||
|
# cv2.rectangle(now_screen, (x, y), (x + 80, y + 150), (0, 255, 0), thickness=2)
|
||
|
# cv2.rectangle(now_screen, (x-30, y-30), (x+50, y+50), (0, 255, 0), thickness=2)
|
||
|
pos_x, pos_y = pos
|
||
|
|
||
|
# 计算pos在屏幕的 坐标
|
||
|
s_x = 180 + x - 30 + pos_x
|
||
|
s_y = 90 + y - 30 + pos_y
|
||
|
|
||
|
# 加上一些坐标得到人物的主体大概部位
|
||
|
p_x = s_x + 55
|
||
|
p_y = s_y + 115
|
||
|
tmp_pos_lis.append([p_x, p_y])
|
||
|
# show(now_screen)
|
||
|
GLOBAL_POS_LIS = tmp_pos_lis
|