Что нового

Прошу консультации по организации собственных функций

Centhron

Новичок
Сообщения
1
Репутация
0
Всем привет.
Решил изучать AutoIt для автоматизации рутинных действий по работе, но для начала решил потренироваться на играх.
Для начала захотел попробовать написать простого бота для игры, который в определенных моментах просто проходит по координатам и кликает на них либо один, либо 2 раза левой кнопкой мыши, а в других случаях пробует найти участок изображения и на основании того найдено оно или нет либо выдает ошибку, либо продолжает скрипт, а в некоторых случаях использует возвращаемые координаты найденного рисунка и подставляет их для клика мышью. Решил для этого воспользоваться функцией BmpSearch, т.к. с помощью нее по примеру у меня получилось сразу передвинуть мышь в тестовом скрипте, а с помощью ImageSearch.au3 не вышло и не смог её победить. Пиксельсерч не подходит из-за неудобства использования в конкретной задаче.
Я решил сразу подойти к задаче, по моему мнению, с правильной стороны и адекватно организовывать функции используемые многократно и потом лишь вызывать их с нужными параметрами, а не плодить одинаковый код.
Вот мой код на котором я пытаюсь разобраться с пользовательскими функциями:

Код:
#include <ScreenCapture.au3>
#include <BmpSearch.au3>
#include <AutoItConstants.au3>


WinActivate("Название окна")

_MovCl (956, 977,1)
_MovCl (940, 700,2)

_Fbmp("\1.bmp")
   If @error Then MsgBox(0,"Error","Error Image not found")
   Else MouseMove($aCoords[1][2], $aCoords[1][3], 10)
   EndIf



Func _MovCl($ix=0,$iy=0,$cl=1)
   If $cl=1 Then MouseClick("left",$ix, $iy,1,5)
   If $cl=2 Then MouseClick("left",$ix, $iy,2,5)
   Sleep(2000)
EndFunc

Func _Fbmp ($bmp=0)
   _GDIPlus_Startup()

   If $bmp=0 Then @error

   $hBitmap = _ScreenCapture_Capture()
   $hImage = _GDIPlus_BitmapCreateFromHBITMAP ($hBitmap)
   $hSource = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)

   $hBmp = _GDIPlus_BitmapCreateFromFile(@ScriptDir & $bmp)
   $hFind = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp)

   $aCoords = _BmpSearch($hSource, $hFind, 1)
   Return $aCoords

EndFunc


Функция _MovCl отлично работает, вызываю её и передаю в виде параметров координаты и количество необходимых мне нажатий и функция грамотно отрабатывает. А вот обернуть функцию bmpsearch в свою функцию _Fbmp у меня не получается никак, я хотел бы в эту функцию передавать только ссылку на необходимый мне bmp файл и далее чтобы она возвращала координаты, либо ошибку, далее я бы уже с помощью условия If Then Else прописал бы, что в случае ошибки остановить скрипт, а если ошибки нет и изображение найдено, то либо продолжить скрипт, ибо условие выполнено, либо взять координаты изображения и подставить в функцию управления мышью. Но у меня постоянно выходят ошибки либо в массиве координат, либо в выражении If Else. Я до этого где-то прочитал, что внутри пользовательстких функций нельзя вызывать другие функции, может быть проблема в этом заключается, подскажите друзья как можно решить этот вопрос и можно ли подойти к решению данной задачи выбранным мной способом или возможно есть более адекватное решение, до которого я пока не смог дойти сам.
И еще один вопрос, если все же мое решение имеет место быть, есть ли способ назначить переменной значение координаты из массива, в данном примере можно ли сделать что-то подобное $x = $aCoords[1][2] , чтобы назначить переменной х значение координаты х найденного рисунка из массива?
Заранее спасибо за помощь всем кто отзовется :IL_AutoIt_1:
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
где-то прочитал, что внутри пользовательстких функций нельзя вызывать другие функции
Нет , это не так , внутри функций Вы можете вызывать любые другие функции
 

SharkyEXE

Новичок
Сообщения
134
Репутация
0
Всем здравствуйте.

Есть 10 одинаковых блоков , в которых меняются только три параметра - выделены жирным

ControlFocus ( "Настроить кнопк", "", "[CLASS:Button; INSTANCE:2]" )

# Проверяем статус галки : установлена ( 1 ) / не установлена ( 0 )
$Status1 = ControlCommand ( "Настроить кнопк", "", "Button2", "IsChecked" )

# Если 1, значит установлена
If $Status1 = 1 Then

ControlClick ( "Настроить кнопк", "", "Button2" )
Sleep ( 1000 )

# Иначе - не установлена
Else

#

EndIf

Хочется функции , типа чтобы было так

AU3ExecuteScript("Настроить кнопк","2","1")

Func AU3ExecuteScript($iScript, $iScript2, $iScript3)
ControlFocus ( '$iScript', "", "'[CLASS:Button; INSTANCE: ' & '$iScript2'& ']'" )

# Проверяем статус галки : установлена ( 1 ) / не установлена ( 0 )
$Status & '$iScript3' = ControlCommand ( $iScript, "", "'Button' & '$iScript2'", "IsChecked" )

# Если 1, значит установлена
If $Status & '$iScript3' = 1 Then

ControlClick ( '$iScript', "", "'Button' & '$iScript2'" )
Sleep ( 1000 )

# Иначе - не установлена
Else

#

EndIf
EndFunc

Но у меня не работает.

Помогите мне , пожалуйста
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
Желательно весь кусок кода, который нужно оптимизировать предоставьте.
 
Верх