2017-10-13 10 views
1

J'ai travaillé sur un projet où j'ai besoin d'appeler pyautogui.press ('espace'), cependant, quand on l'appelle, il y a un certain retard. J'ai besoin d'essayer de garder le code assez vite car OpenCV est utilisé. Si quelqu'un sait comment je peux essayer d'arrêter le code de ralentir quand pyautogui.press ('espace') est appelé, ce serait incroyable. Vous pouvez également voir le décalage dans cette vidéo chaque fois que le dinosaure saute: https://www.youtube.com/watch?v=vceDabnT3OE.pyautogui.press() provoquant un décalage lors de l'appel

Voici le code:

import numpy as np 
import cv2 
import pyautogui 
import time 
from PIL import ImageGrab 

# Defining Template Images 
gameOver = cv2.imread('GameOver.png') 
dino = cv2.imread('Dino.png') 
smallCactus = cv2.imread('SmallCactus.png') 
bigCactus = cv2.imread('BigCactus.png') 
ptero = cv2.imread('Ptero.png') 

# Assigning Sample Image Dimensions 
h, w = dino.shape[:-1] 
sch, scw = smallCactus.shape[:-1] 
bch, bcw = bigCactus.shape[:-1] 
ph, pw = ptero.shape[:-1] 

# Time Variables 
lastTime = time.time() 
runningTime = 0 

# Key Variables 
keyDown = False 

pyautogui.keyDown('space') 

while True: 
    # Capturing Screen 
    # 'bbox' Is Rectangle Around The Game 
    screen = np.array(ImageGrab.grab(bbox=(150,125,800,300))) 

    # Time stuff 
    #print('Loop took {} seconds'.format(time.time() - lastTime)) 
    runningTime += time.time() - lastTime 
    lastTime = time.time() 

    # Checking If Game Over 
    gameOverRes = cv2.matchTemplate(screen, gameOver, cv2.TM_CCOEFF_NORMED) 
    minValG, maxValG, minLocG, maxLocG = cv2.minMaxLoc(gameOverRes) 

    if maxValG >= 0.9 and runningTime > 4: 
     print('Game Ended In ', int(round(runningTime)), ' Seconds') 
     pyautogui.press('space') 
     runningTime = 0 

    # Finding Dinosaur 
    dinoRes = cv2.matchTemplate(screen, dino, cv2.TM_CCOEFF_NORMED) 
    minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(dinoRes) 

    # Finding Small Cacti 
    smallCactusRes = cv2.matchTemplate(screen, smallCactus, cv2.TM_CCOEFF_NORMED) 
    smallCactusThreshhold = 0.725 
    smallCactusLoc = np.where(smallCactusRes >= smallCactusThreshhold) 

    # Finding Big Cacti 
    bigCactusRes = cv2.matchTemplate(screen, bigCactus, cv2.TM_CCOEFF_NORMED) 
    bigCactusThreshhold = 0.725 
    bigCactusLoc = np.where(bigCactusRes >= bigCactusThreshhold) 

    # Finding Pterodactyls 
    pteroRes = cv2.matchTemplate(screen, ptero, cv2.TM_CCOEFF_NORMED) 
    minValP, maxValP, minLocP, maxLocP = cv2.minMaxLoc(pteroRes) 

    # Drawing Box Around Dinosaur 
    cv2.rectangle(screen, maxLoc, (maxLoc[0] + w, maxLoc[1] + h), (0, 255, 0), 2) 

    # Avoiding Closest Small Cactus 
    if smallCactusLoc[0].size > 0: 
     leftmostXS = min(smallCactusLoc[1]) 
     leftmostYS = min(smallCactusLoc[0]) 

     distS = (leftmostXS - maxLoc[0]) 

     if (distS < 175 and distS > 0): 
      pyautogui.press('space') 

     cv2.rectangle(screen, (leftmostXS, leftmostYS), (leftmostXS+scw, leftmostYS+sch), (255, 160, 0), 2) 

    # Avoiding Closest Big Cactus 
    if bigCactusLoc[0].size > 0: 
     leftmostXB = min(bigCactusLoc[1]) 
     leftmostYB = min(bigCactusLoc[0]) 

     distB = (leftmostXB - maxLoc[0]) 

     if distB < 175 and distB > 0: 
      pyautogui.press('space') 

     cv2.rectangle(screen, (leftmostXB, leftmostYB), (leftmostXB+bcw, leftmostYB+bch), (255, 0, 0), 2) 


    # Avoiding Pterodactyls 
    # Check 'maxValP' Because Otherwise Dino Gets Mistaken As Pterodactyl 
    # 'keyDown' Is Needed For Down Arrow, Otherwise It Doesn't Work Properly 
    if maxValP >= 0.60: 

     distP = maxLocP[0] - maxLoc[0] 
     heightP = maxLoc[1] - maxLocP[1] 

     if distP < 190 and distP > 0: 
      if heightP > 10: 
       keyDown = True 
       pyautogui.keyDown('down') 
      else: 
       pyautogui.press('space')    

     cv2.rectangle(screen, maxLocP, (maxLocP[0] + pw, maxLocP[1] + ph), (0, 0, 255), 2) 

    # elif keyDown == True: 
     # pyautogui.keyUp('down') 
     # keyDown = False 

    # Showing Image 
    cv2.imshow('Dino Game', cv2.cvtColor(screen, cv2.COLOR_BGR2RGB)) 

    # Quit 
    if cv2.waitKey(1) & 0xFF == 27: 
     cv2.destroyAllWindows() 
     break 

Répondre

0

Je suis l'auteur de PyAutoGUI. PyAutoGUI dispose d'une fonction "fail-safe" pour vous aider dans le cas où votre script est bogué et que vous voulez l'éteindre, mais il peut déplacer la souris rendant impossible de toucher le clavier. Il y a un délai de 0,1 seconde après tous les appels PyAutoGUI, vous donnant une chance de claquer la souris dans le coin supérieur droit (PyAutoGUI relèvera FailSafeException si la souris est toujours aux coordonnées (0, 0).)

La dixième seconde Le délai permet à l'utilisateur de déplacer la souris dans le coin supérieur gauche. Cependant, vous pouvez également désactiver en réglant pyautogui.PAUSE-0:

>>> pyautogui.PAUSE = 0 

Cependant, cela signifie que si vis quelque chose et votre script provoque la souris pour cliquer constamment autour, vous pourriez avoir plus de mal à tuer votre script.