Aide sur loop d'identification de pixel

Poser vos questions de programmation en AutoHotkey
Nanope
Posts: 5
Joined: 03 Aug 2021, 09:33

Aide sur loop d'identification de pixel

26 Aug 2021, 14:05

Bonjour à tous,
Je cherche à automatiser une mécanique un peu pénible, qui consiste à appuyer sur une touche ou non, selon le message qui s'affiche. Ces messages sont des boites de dialogue ayant chacunes une dimension différente, donc je pensais créer une boucle qui réagit en fonction de la présence ou non du pixel de la box, et en fonction renvoi ou non le signal de la touche, mais je ne comprends pas comment faire ça.

La boucle complète est constituée de 4 messages, correspondant à 1 boucle imbriquée dans la seconde :
- Un premier message au démarrage de la séquence : Restez appuyé sur entrée (la plus grosse box)
-> Séquence de deux messages qui s'alternent de manière aléatoire, le nombre de répétitions va de 1 à 10
- Message A : Relachez entrée (2e box la plus grosse)
- Message B : Restez appuyé sur entrée (3e box la plus grosse)
- Lorsque la séquence est terminée, un dernier message apparaît : Relachez entrée (box la plus petite), la séquence recommence.

Les box de dialogue restent environ 3 à 4 secondes, et disparaissent pendant autant de temps avant. Seule la dernière boite peut apparaître alors que la boite précédente est affichée (position différente). La séquence peut mettre un peu plus de temps à se réinitialiser (jusqu'à 6-7 secondes). À noter que les 3 premières box se situent les unes sur les autres (je cible donc les pixels par "élimination" : si il n'y a pas les pixels de la 1e box, je cherche la 2nde, etc.) :
image.png
image.png (3.08 KiB) Viewed 1642 times
Il n'est nécessaire d'appuyer (ou relacher) entrée que pendant la fin de la boite de dialogue (je dirais la dernière seconde) et peut importe que la touche soit appuyée ou non quand il n'y a pas de box.
La boucle complète s'exécute entre 33 et 100 fois (70-80 en moyenne). Lorsque la boucle ne peut plus s'exécuter, un message apparaît.

Je pensais donc faire une boucle du style :
[Loop 1]
- Chercher le pixel de la box 1
- Lorsque trouvé, appuyer sur entrée pendant 3s (ou rester appuyé jusqu'à ordre contraire ?)
[Loop 2]
- Chercher le pixel de la box 2
- Si trouvé : Relacher entrée (ou ne rien faire si entrée déjà relaché ?)
- Si non trouvé : Chercher pixel de la box 3
- Appuyer sur la touche entrée (sera forcément trouvé si l'autre n'a pas été trouvé)
-> Répéter séquence jusqu'à ce que pixel de la box 4 soit trouvé
[Fin loop 2]
- Pixel box 4 trouvé : Relacher la touche entrée
- Attendre 5 secondes
- Stopper la boucle si message de fin apparaît, sinon recommencer.
[Fin loop 1]

J'ai essayé de traduire ça sur MacroCreator, mais je suis bloqué car je ne comprends pas comment mettre tout ça en place : je ne comprends pas comment gérer la touche entrée, ni comment faire la seconde boucle pour qu'elle "cherche" entre les 2 options possibles sans se bloquer. J'ai aussi essayer de créer un événement "finboucle" pour le moment où la 4e box apparaît, qui mettrais donc fin à la boucle, mais idem je ne sais pas comment faire.

Pour le moment ça donne ça :

Code: Select all

Loop, 3
{
    Loop
    {
        CoordMode, Pixel, Window
        PixelSearch, FoundX, FoundY, 1875, 32, 1886, 59, 0x2E5C73, 0, Fast RGB
        If ErrorLevel
        	Loop, 2
        		SoundBeep  <!-- Pour savoir si la boucle bug, vu qu'il est sensé trouver ces pixels à chaque début de séquence -->
    }
    Until ErrorLevel = 0
    If (ErrorLevel = 0)
    {
        Loop <!-- début de la boucle interne -->
        {
            Loop, 10 <!-- 1e partie de l'alternance entre les 2 possibilités, en principe un "if (trouve le 1er pixel)" -->
            {
                CoordMode, Pixel, Window
                PixelSearch, FoundX, FoundY, 1829, 17, 1837, 41, 0x2E5C73, 0, Fast RGB
                If ErrorLevel = 0
                	Click, %FoundX%, %FoundY%, 0
            } <!-- En principe ici un "else (trouve l'autre pixel)" (->
        }
        Until, finboucle <!-- Ce qui est sensé correspondre à la fin de la boucle interne -->
    }
}
J'espère que mon explication est compréhensible, sinon je pourrais toujours vous envoyer un gif de la séquence.

Merci par avance si vous pouvez me débloquer, sinon d'avoir pris le temps de lire jusque là ! :D
Last edited by Nanope on 28 Aug 2021, 12:50, edited 1 time in total.
User avatar
joedf
Posts: 8986
Joined: 29 Sep 2013, 17:08
Location: Canada
Contact:

Re: Aide sur loop d'identification de pixel

26 Aug 2021, 14:13

Pour appuyer sur entrée et de le maintenir enfoncé (3s) tu peux faire ce ceci

Code: Select all

Send, {Enter Down}
Sleep, 3000
Send, {Enter Up}
Pour le reste, je suis pas certain de comprendre. Je pense qu'une image aiderais bien...
Image Image Image Image Image
Windows 10 x64 Professional, Intel i5-8500, NVIDIA GTX 1060 6GB, 2x16GB Kingston FURY Beast - DDR4 3200 MHz | [About Me] | [About the AHK Foundation] | [Courses on AutoHotkey]
[ASPDM - StdLib Distribution] | [Qonsole - Quake-like console emulator] | [LibCon - Autohotkey Console Library]
Nanope
Posts: 5
Joined: 03 Aug 2021, 09:33

Re: Aide sur loop d'identification de pixel

28 Aug 2021, 12:51

Merci pour le tips, et mince en effet, l'image que j'avais mise s'était enlevée, je l'ai remise !
Est-ce que c'est plus clair avec le petit schéma ?

Return to “J'ai besoin d'aide”

Who is online

Users browsing this forum: No registered users and 6 guests