; إحداثيات الزاوية العلوية اليسرى لإطار اللعبة (يجب تحديثها عند تحريك النافذة)
winX = 100
winY = 80
; الحصول على موقع الماوس على الشاشة
GetCursorPos mouseX, mouseY
; تحويلها إلى إحداثيات داخل اللعبة
gameX := mouseX - winX
gameY := mouseY - winYملاحظات هامة:
أثناء مرحلة التطوير، قد يكون إدخال الإحداثيات يدويًا في السكربت أمرًا شاقًا. الطريقة الأكثر فعالية هي استخدام مفتاح اختصار لالتقاط موقع الماوس الحالي وملئه تلقائيًا في حقول الإدخال الخاصة بالسكربت.
; تسجيل مفتاح F1
Hotkey, F1, GetMousePos
return
GetMousePos:
MouseGetPos, mx, my
GuiControl,, FindX, %mx%
GuiControl,, FindY, %my%
ToolTip, تم التقاط الإحداثيات: X%mx% Y%my%
SetTimer, RemoveTip, -2000
returnباستخدام هذه الطريقة، كل ما عليك فعله هو تحريك الماوس إلى الموضع المطلوب داخل اللعبة ثم الضغط على مفتاح الاختصار (F1)، وسيتم ملء الإحداثيات تلقائيًا في الحقول المخصصة.
السكربت الأصلي كان مصممًا لأربعة أزرار منفصلة، لكل منها تأخير زمني خاص به. في الألعاب الفعلية، غالبًا ما تكون هناك حاجة لإرسال زرين متتاليين (مثل زر المهارة ثم زر الدعم) قبل الانتظار.
توجيهات التعديل:
SendKeyGroup(useGroup, keyA, keyB, waitMs, minute) {
global TimerCount, TargetHwnd
if (useGroup != 1)
return
if (minute > 0 and Mod(TimerCount, minute * 60) = 0) {
; إرسال مجموعة الأزرار كل N دقيقة
ControlSend, , {%keyA%}, ahk_id %TargetHwnd%
Sleep, 100
ControlSend, , {%keyB%}, ahk_id %TargetHwnd%
}
if (minute = 0) {
; إرسال المجموعة في كل دورة
ControlSend, , {%keyA%}, ahk_id %TargetHwnd%
Sleep, 100
ControlSend, , {%keyB%}, ahk_id %TargetHwnd%
}
}SetTimer و Sleep في الحلقة الرئيسيةهذا هو أحد أكثر القرارات شيوعًا في سكربتات الألعاب بلغة AHK:
| الطريقة | المزايا | العيوب |
|---|---|---|
| يمكن إيقافه في أي وقت، لا يمنع بقية السكربت، منظم | أقل فترة بين الدورات حوالي ثانية واحدة، غير مناسب للأوامر عالية التردد |
| تحكم دقيق بالفاصل الزمني بين كل دورة | يحتاج آلية إضافية لإيقاف السكربت، قد يتسبب في تجميد البرنامج |
إذا كانت لعبتك تحتاج إلى عمليات كل ثانية أو أقل (مثل تكرار استخدام مهارة أو تجديد مؤقت)، فإن SetTimer هو الخيار الأنظف. أما إذا كنت بحاجة إلى تحكم دقيق على مستوى الميلي ثانية، فيجب استخدام حلقة Sleep و break للشروط.
ControlClick لا تدعم كل الألعاب: بعض الألعاب لا تستقبل رسائل الماوس الخلفية. في هذه الحالة، ستحتاج إلى استخدام PostMessage أو البحث عن رسائل الألعاب الأخرى.ControlSend: يجب وضع الأزرار الخاصة بين أقواس مثل {F1} و {Enter}.MouseGetPos, , , TargetHwndControlClick في إزاحة الإحداثيات. يفضل استخدام اللعبة في وضع النافذة وضبط تكبير الشاشة على 100%.التعديل من سكربت يعمل في الواجهة الأمامية إلى نظام خلفي متعدد الأزرار يعتمد على ثلاث نقاط أساسية: اختيار الأوامر الخلفية الصحيحة (ControlSend / ControlClick)، وحساب الإحداثيات داخل النافذة، وطريقة تشغيل الحلقة الرئيسية. الأمثلة المقدمة في هذا المقال يمكن تطبيقها مباشرة على لعبة Water Margin Online أو أي لعبة أخرى تحتاج إلى أتمتة. إذا كانت لعبتك تتطلب مجموعات أزرار خاصة أو نقرات في مواقع محددة، ننصحك بالبدء بإصدار خلفي بسيط، وبناء الوظائف عليه تدريجيًا.