X dans le jeu = X souris (écran) - X du coin supérieur gauche de la fenêtre de jeu
Y dans le jeu = Y souris (écran) - Y du coin supérieur gauche de la fenêtre de jeuPour plus de précision, il faut utiliser le coin supérieur gauche de la zone de contenu du jeu (en déduisant la barre de titre et les bordures) comme référence, et non le coin supérieur gauche de la fenêtre entière.
; Coordonnées du coin supérieur gauche de la fenêtre de jeu (à obtenir au préalable)
winX = 100
winY = 80
; Obtention des coordonnées de la souris à l'écran
GetCursorPos mouseX, mouseY
; Conversion en coordonnées à l'intérieur de la fenêtre de jeu
gameX := mouseX - winX
gameY := mouseY - winYPoints d'attention :
Pendant la phase de développement, saisir manuellement les coordonnées est fastidieux. Une façon plus efficace est d'utiliser une touche de raccourci pour remplir directement les champs de l'interface graphique du script avec les coordonnées actuelles de la souris.
; Enregistrement de la touche de raccourci F1
Hotkey, F1, GetMousePos
return
GetMousePos:
MouseGetPos, mx, my
GuiControl,, FindX, %mx%
GuiControl,, FindY, %my%
ToolTip, Coordonnées capturées : X%mx% Y%my%
SetTimer, RemoveTip, -2000
returnAinsi, il suffit de déplacer la souris sur la position cible et d'appuyer sur F1 pour que les coordonnées soient automatiquement remplies dans les champs « Chercher X / Chercher Y ». Vous pouvez attribuer différentes touches de raccourci à différents champs de coordonnées selon vos besoins.
Le script original était conçu avec quatre touches indépendantes, chacune ayant son propre délai. Cependant, dans le jeu, il est souvent nécessaire d'envoyer deux touches consécutivement (par exemple, appuyer d'abord sur une touche de compétence, puis sur une touche auxiliaire) avant d'attendre un certain temps.
Axes de modification :
SendKeyGroup(useGroup, keyA, keyB, waitMs, minute) {
global TimerCount, TargetHwnd
if (useGroup != 1)
return
if (minute > 0 and Mod(TimerCount, minute * 60) = 0) {
; Envoi du groupe de touches toutes les N minutes
ControlSend, , {%keyA%}, ahk_id %TargetHwnd%
Sleep, 100
ControlSend, , {%keyB%}, ahk_id %TargetHwnd%
}
if (minute = 0) {
; Envoi du groupe à chaque cycle de la boucle
ControlSend, , {%keyA%}, ahk_id %TargetHwnd%
Sleep, 100
ControlSend, , {%keyB%}, ahk_id %TargetHwnd%
}
}C'est le dilemme le plus courant pour les scripts de jeu sous AHK :
| Méthode | Avantages | Inconvénients |
|---|---|---|
| Peut être arrêtée à tout moment, ne bloque pas le script, structure claire | Intervalle minimum d'environ 1 seconde, inadapté aux opérations à haute fréquence |
| Permet un contrôle précis de l'intervalle entre chaque cycle | L'arrêt du script nécessite un mécanisme supplémentaire, risque de blocage |
Si votre jeu nécessite des opérations à une fréquence d'une seconde ou moins (par exemple, utilisation répétée de compétences, application périodique de buffs), SetTimer est un choix plus propre. Si un contrôle précis à la milliseconde est nécessaire, il est préférable d'utiliser une boucle Sleep avec une condition break.
ControlClick n'est pas pris en charge par tous les jeux : certains jeux ne traitent pas les messages de souris en arrière-plan. Il faudra alors utiliser PostMessage ou chercher d'autres messages de fenêtre.ControlSend : les touches spéciales doivent être entourées d'accolades, par exemple {F1}, {Enter}.MouseGetPos, , , TargetHwndControlClick peuvent être décalées. Il est recommandé de jouer en mode fenêtré et de régler le zoom d'affichage à 100 %.Pour passer d'un script en premier plan à un système de groupes de touches en arrière-plan, les modifications essentielles portent sur : le choix des commandes en arrière-plan (ControlSend / ControlClick), le calcul des coordonnées relatives à la fenêtre, et la méthode de pilotage de la boucle principale. Les exemples de modification fournis dans cet article peuvent être directement adaptés à Shui Hu Feng Yun Online ou à d'autres scripts d'automatisation de jeux ayant des besoins similaires. Si votre jeu nécessite des combinaisons de touches ou des clics à des coordonnées spécifiques, commencez par tester une version minimale fonctionnelle en arrière-plan, puis ajoutez des fonctionnalités progressivement.