Что нового

[Автоматизация] многозадачный бот для игры

SkinWarS

Новичок
Сообщения
26
Репутация
0
Версия AutoIt: Version 3.4.4

Описание:
я пытался сделать что-то , но что-то совсем не выходит, точно старался)
Вообщем есть окно с игрой, при запуске игры открывается игровое поле..много нюансов но меня интересует впринципе только 2-е точки в игре
1-я точка
Код:
>>>> Window <<<<
Title:	Embedded Web control Test
Class:	AutoIt v3 GUI
Position:	246, 7
Size:	1116, 704
Style:	0x94CA0000
ExStyle:	0x00000100
Handle:	0x0000000000370542

>>>> Control <<<<
Class:	MacromediaFlashPlayerActiveX
Instance:	1
ClassnameNN:	MacromediaFlashPlayerActiveX1
Name:	
Advanced (Class):	[CLASS:MacromediaFlashPlayerActiveX; INSTANCE:1]
ID:	1329647544
Text:	
Position:	-2, -9
Size:	1000, 690
ControlClick Coords:	932, 15
Style:	0x56000000
ExStyle:	0x00000000
Handle:	0x00000000001B0404

>>>> Mouse <<<<
Position:	1179, 39
Cursor ID:	0
Color:	0x22858F

>>>> StatusBar <<<<


Примечания:

2-я точка
Код:
>>>> Window <<<<
Title:	Embedded Web control Test
Class:	AutoIt v3 GUI
Position:	246, 7
Size:	1116, 704
Style:	0x94CA0000
ExStyle:	0x00000100
Handle:	0x0000000000370542

>>>> Control <<<<
Class:	MacromediaFlashPlayerActiveX
Instance:	1
ClassnameNN:	MacromediaFlashPlayerActiveX1
Name:	
Advanced (Class):	[CLASS:MacromediaFlashPlayerActiveX; INSTANCE:1]
ID:	1329647544
Text:	
Position:	-2, -9
Size:	1000, 690
ControlClick Coords:	39, 615
Style:	0x56000000
ExStyle:	0x00000000
Handle:	0x00000000001B0404

>>>> Mouse <<<<
Position:	286, 639
Cursor ID:	0
Color:	0xFFB300

>>>> StatusBar <<<<


обьясню механику, нужно сделать так что бы поиск пиксела производился в этих двух точках
Например...если в точке 1 цвет такой-то то выполняются действия мышкой цикличные действия мышкой (5 кликов по разным кнопкам), но и про точку 2 что бы цикл проверки пикселов не забывал т.к. в точке 1 цвет через 5 повторных действий станет другим и не доступным, поэтому нужно что бы в точку 2 цикл заглядывал допустим по цвету, тоесть если цвет в точке 2 стал серым, а в точка 1 тоже имеет другой не подходящий для цикла цвет то цикл лез всеравно в точку 2 и выполнял скажем также 5 кликов по разным координатам (там окно открывается), но если в точке 2 цвет стал желтым он лез и проверял наличие пикселов другого цвета(окно в окне).
надеюсь доступно обьяснил если нет, но спрашивайте обьясню ....


Пожелание:
если возможно то можно сделать поиск пиксела и работу контрклика в свернутом окне...у меня не получилось(
 
Автор
S

SkinWarS

Новичок
Сообщения
26
Репутация
0
можноли искать пикселы в свернутом окне??? и если да то можно пример...?
 

qqww22

Новичок
Сообщения
115
Репутация
4
SkinWarS сказал(а):
можноли искать пикселы в свернутом окне??? и если да то можно пример...?
В Свёрнутом нет,в неактивном да.

Есть способ через DirectX читать в свёрнутом окне изображение но как это сделать я не знаю.
 
Автор
S

SkinWarS

Новичок
Сообщения
26
Репутация
0
хорошо, а поиск картинки в свернутом окне можно как-то осуществить?
 

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
SkinWarS
поиск картинки в свернутом окне
Давайте рассуждать логически. Пиксель в свёрнутом окне найти нельзя и вы с этим согласились.
Любая картинка состоит из пикселей. Можно ли найти объект при отсутствии составляющих его элементов? :scratch:
 
Автор
S

SkinWarS

Новичок
Сообщения
26
Репутация
0
вот поделюсь что сделал, но есть какие-то непонятки, напишу в справке в коде
Код:
#include <GUIConstants.au3>
#Include <GUIConstantsEx.au3>
#Include <WindowsConstants.au3>
#Include <IE.au3>
#Include <array.au3>
#include <SkinCrafter.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

_LoadSkinCrafter("SkinCrafterDll.dll");Load SkinCrafter DLL

$oIE = ObjCreate("Shell.Explorer.2")

Opt( "PixelCoordMode", 1 )
Global  $GUI1, $oIE, $IsClose = 0, $GUI1BTN1, $GUI1BTN2, $GUI1BTN3,$Form1, $iActionType = 0, $hWnd = "Embedded Web control Test" ; Здесь привязка к окну
Local $coord, $hWnd, $STATE,$coord5,$coord4,$coord3,$coord2,$coord1,$RR
$hWnd = WinGetHandle( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]" )


_GUI1()

While Not $IsClose
    Switch $iActionType
        Case 1
            ;CODE_START;

ControlClick ( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]", "", "MacromediaFlashPlayerActiveX1", "left", 1, 40, 627);мобила
Sleep(3000); задержка 1 секунда
ControlClick ( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]", "", "MacromediaFlashPlayerActiveX1", "left", 1, 229, 374) ;кадавры
Sleep(1000); задержка 1 секунда
ControlClick ( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]", "", "MacromediaFlashPlayerActiveX1", "left", 1, 384, 475) ; повар
Sleep(1000); задержка 1 секунда
ControlClick ( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]", "", "MacromediaFlashPlayerActiveX1", "left", 1, 446, 380) ; напасть
Sleep(1000); задержка 1 секунда
ControlClick ( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]", "", "MacromediaFlashPlayerActiveX1", "left", 1, 434, 498) ; новый бой
Sleep(4000); задержка 1 секунда
ControlClick ( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]", "", "MacromediaFlashPlayerActiveX1", "left", 1, 957, 100) ; удар
Sleep(4000); задержка 1 секунда
ControlClick ( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]", "", "MacromediaFlashPlayerActiveX1", "left", 1, 347, 273) ; рес
Sleep(4000); задержка 1 секунда
ControlClick ( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]", "", "MacromediaFlashPlayerActiveX1", "left", 1, 751, 132) ; ЗАКРЫТЬ
Sleep(2000)
            ;CODE_END;
		Case 2
			$coord = PixelSearch(34, 614, 34, 614, 0xFFB300, $hWnd ) ;помоему он вообще этот цвет не ищет
	If Not @error Then
ControlClick ( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]", "", "MacromediaFlashPlayerActiveX1", "left", 1, 40, 627);мобила
ControlClick ( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]", "", "MacromediaFlashPlayerActiveX1", "left", 1, 768, 254);принять
   $coord = PixelSearch(34, 614, 34, 614, 0x93AB55, $hWnd ); после нахождения этого цвета в открывшейся форме он почему то опять запускает проверку на первый цвет
    If Not @error Then

ControlClick ( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]", "", "MacromediaFlashPlayerActiveX1", "left", 1, 960, 94);удар

EndIf
EndIf
		Case 3
			 $coopd=PixelSearch (123,13,1241,717,0xFFB300,0, 1, $hWnd); в мобилке появился цвет желтый
	Sleep(1000)
if IsArray($coopd)=True Then
	Sleep(3000)
	ControlClick ( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]","", "MacromediaFlashPlayerActiveX1", "left", 1, 43, 625);мобилка
	Sleep(3000)
$coord1=PixelSearch (123,13,1241,717,0x1F222C,0, 1, $hWnd);фриг
$coord2=PixelSearch (123,13,1241,717,0x895645,0, 1, $hWnd);танк
$coord3=PixelSearch (123,13,1241,717,0x250B01,0, 1, $hWnd);арх
if IsArray($coord1)=True Or IsArray($coord2)=True Or IsArray($coord3)=True Then
	 Sleep(3000)
	 ControlClick ( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]","", "MacromediaFlashPlayerActiveX1", "left", 1, 753, 255);принять
	 Sleep(2000)
	ControlClick ( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]","", "MacromediaFlashPlayerActiveX1", "left", 1, 834, 172);закрываем мобилу
Else
	ControlClick ( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]","", "MacromediaFlashPlayerActiveX1", "left", 1, 834, 172);закрываем мобилу
EndIf
EndIf

    EndSwitch
WEnd

Func _Exit()
    Exit
EndFunc





Func _GUI1()

    Opt("GUIOnEventMode", 1)
	_InitializeSkinCrafter($Form1, "Aquiles.skf");Set skin
    $GUI1 = GUICreate("Embedded Web control Test", 1110, 675, -1, -1)
	GUICtrlCreateObj($oIE, -150, -115, 1180, 1600)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_GUI1Close")

    $GUI1BTN1 = GUICtrlCreateButton("Коллекции", 1030, 50, 80, 30)
    GUICtrlSetOnEvent($GUI1BTN1, "_GUI1BTN1")

    $GUI1BTN2 = GUICtrlCreateButton("Остановить", 1030, 90, 80, 30)
    GUICtrlSetOnEvent($GUI1BTN2, "_GUI1BTN2")

    $GUI1BTN3 = GUICtrlCreateButton("Рейд", 1030, 130, 80, 30)
    GUICtrlSetOnEvent($GUI1BTN3, "_GUI1BTN3")


    GUICtrlSetState($GUI1BTN2, $GUI_DISABLE)
    GUISetState()
    GUICtrlSetState($GUI1BTN1, $GUI_FOCUS)
	GUICtrlSetState($GUI1BTN3, $GUI_FOCUS)
	_IENavigate($oIE, "http://vk.com/app3021522_355310361")

EndFunc   ;==>_GUI1




Func _GUI1Close()
	$hWnd = 0
    $iActionType = 0
    GUIDelete($GUI1)
    $IsClose = 1
EndFunc   ;==>_GUI1Close
Func _GUI1BTN1()
    GUICtrlSetState($GUI1BTN2, $GUI_ENABLE)
    GUICtrlSetState($GUI1BTN2, $GUI_FOCUS)
    GUICtrlSetState($GUI1BTN1, $GUI_DISABLE)
    $iActionType = 1
EndFunc   ;==>_GUI1BTN1
Func _GUI1BTN2()
    $iActionType = 0
    GUICtrlSetState($GUI1BTN1, $GUI_ENABLE)
    GUICtrlSetState($GUI1BTN1, $GUI_FOCUS)
    GUICtrlSetState($GUI1BTN2, $GUI_DISABLE)
EndFunc   ;==>_GUI1BTN2
Func _GUI1BTN3()
    GUICtrlSetState($GUI1BTN2, $GUI_ENABLE)
    GUICtrlSetState($GUI1BTN2, $GUI_FOCUS)
    GUICtrlSetState($GUI1BTN1, $GUI_DISABLE)
    $iActionType = 2
EndFunc   ;==>_GUI1BTN3



помогите поправить вот этот кусок кода
Код:
Case 2
            $coord = PixelSearch(34, 614, 34, 614, 0xFFB300, $hWnd ) ;помоему он вообще этот цвет не ищет
    If Not @error Then
ControlClick ( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]", "", "MacromediaFlashPlayerActiveX1", "left", 1, 40, 627);мобила
ControlClick ( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]", "", "MacromediaFlashPlayerActiveX1", "left", 1, 768, 254);принять
   $coord = PixelSearch(34, 614, 34, 614, 0x93AB55, $hWnd ); после нахождения этого цвета в открывшейся форме он почему то опять запускает проверку на первый цвет
    If Not @error Then

ControlClick ( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]", "", "MacromediaFlashPlayerActiveX1", "left", 1, 960, 94);удар

EndIf
EndIf

нужно сделать так что бы после нахождения второго цвета он не искал первый цвет а делал удары по второму
 

dstasv

Новичок
Сообщения
45
Репутация
1
SkinWarS сказал(а):
помогите поправить вот этот кусок кода
Код:
Case 2
            $coord = PixelSearch(34, 614, 34, 614, 0xFFB300, $hWnd ) ;помоему он вообще этот цвет не ищет
    If Not @error Then
ControlClick ( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]", "", "MacromediaFlashPlayerActiveX1", "left", 1, 40, 627);мобила
ControlClick ( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]", "", "MacromediaFlashPlayerActiveX1", "left", 1, 768, 254);принять
   $coord = PixelSearch(34, 614, 34, 614, 0x93AB55, $hWnd ); после нахождения этого цвета в открывшейся форме он почему то опять запускает проверку на первый цвет
    If Not @error Then

ControlClick ( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]", "", "MacromediaFlashPlayerActiveX1", "left", 1, 960, 94);удар

EndIf
EndIf

нужно сделать так что бы после нахождения второго цвета он не искал первый цвет а делал удары по второму
А почему Вы тут используете PixelSearch, а не PixelGetColor вроде одна точка 34, 614?
Если ради shade-varation и step Вы их не указали (как ниже в тексте по основной программы где поиск в участке).
$coord = PixelSearch(34, 614, 34, 614, 0xFFB300, 0,1,$hWnd ) возможно можно и так $coord = PixelSearch(34, 614, 34, 614, 0xFFB300, ,,$hWnd )
но как Вы написали у меня тоже не работал пока не прописал все параметры.

Спасибо за текст Вашей программы, мне он помог сделать шаг в написании своей, только для другой игры.
upd:
а основная у тебя проблема скорее всего в строке Opt( "PixelCoordMode", 1 ), 1 это абсолютная координата, а ты игру в окно засунул скорее всего тебе тут 0 нужен.
 
Автор
S

SkinWarS

Новичок
Сообщения
26
Репутация
0
ну может как нибуть скооперируемся..для разных игра напишем? суть-то практически во всех играх одна...можно в личку ссылку на страницу в вк?
 

dstasv

Новичок
Сообщения
45
Репутация
1
Посмотри строку
$hWnd = WinGetHandle( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]" )
ты ее вставил в начале скрипта когда еще это самое окно не запущено у меня $hWnd =0х0000000
я переставил ее в другое место после:
_IENavigate($oIE, "http://vk.com/app3021522_355310361")
тогда $hWnd начало брать тоже значение что и в Contorl Viewer
 
Автор
S

SkinWarS

Новичок
Сообщения
26
Репутация
0
спасибо за совет..пока нету возможности опробовать, только на выходных
 

dstasv

Новичок
Сообщения
45
Репутация
1
Ну на самом деле надо еще просить помощи гуру Autoit, Потому как реальная проблема и PixelGetColor работать не хочет, точнее он работает но не так как надо. Возвращает в ответ пустое значение.
Поясняю:
Код:
#include <GUIConstants.au3>
#Include <GUIConstantsEx.au3>
#Include <WindowsConstants.au3>
#Include <IE.au3>
#Include <array.au3>
#include <SkinCrafter.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
[i]
#include <File.au3>

Dim $gCoord[2] = [0, 0]
Dim $gGameLTopCoord[2] = [88, 77]
Dim $gGameRBottomCoord[2] = [724, 618]
global $gColor = 0x000000
global $gPlaceColor1 = 0x000000
Dim $gPlaceCoord1[2] = [812, 163]
Dim $aPlaceMonetka[2] = [0, 0]
Dim $aCoord
[/i]

_LoadSkinCrafter("SkinCrafterDll.dll");Load SkinCrafter DLL

$oIE = ObjCreate("Shell.Explorer.2")

Opt( "PixelCoordMode", 1 )
Global  $GUI1, $oIE, $IsClose = 0, $GUI1BTN1, $GUI1BTN2, $GUI1BTN3,$Form1, $iActionType = 0, $hWnd = "Embedded Web control Test" ; Здесь привязка к окну
Local $coord, $hWnd, $STATE,$coord5,$coord4,$coord3,$coord2,$coord1,$RR
[i]
;$hWnd = WinGetHandle( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]" )
[/i]

_GUI1()

While Not $IsClose
    Switch $iActionType
        Case 1
 ;WinActivate ($hWnd) тоже не помогает
[i]
; --- Участок 2 в котором PixelGetColor отдает пустое значение цвета
$gColor = PixelGetColor( $gPlaceCoord1[0], $gPlaceCoord1[1])
;$gColor = PixelGetColor( $gPlaceCoord1[0], $gPlaceCoord1[1],$hWnd) в таком виде тоже пусто
_FileWriteLog(@ScriptDir & "\Example.log","$gColor-"& $gCoord)
_FileWriteLog(@ScriptDir & "\Example.log", $gPlaceCoord1[0])

If $gPlaceColor1 <> $gColor Then
   _FileWriteLog(@ScriptDir & "\Example.log",$gPlaceColor1&"<>"& $gCoord)

    ControlClick($hWnd1,"","","left",2,$gPlaceCoord1[0],$gPlaceCoord1[1])
;~    MouseClick ($gPlaceCoord1[0],$gPlaceCoord1[1],2)
   Sleep(3000)
   $aCoord = PixelSearch($gGameLTopCoord[0],$gGameLTopCoord[1],$gGameRBottomCoord[0],$gGameRBottomCoord[1],0xEFD958,10,10,$hWnd1)
   MouseClick ("left", $aCoord[0],$aCoord[1],2)
EndIf
[/i]
        Case 2
          ;CODE_BEGIN;
          ;CODE_END;
        Case 3
          ;CODE_BEGIN;
          ;CODE_END;
         EndSwitch
WEnd

Func _Exit()
    Exit
EndFunc

Func _GUI1()
    Opt("GUIOnEventMode", 1)
    _InitializeSkinCrafter($Form1, "Aquiles.skf");Set skin
    $GUI1 = GUICreate("Embedded Web control Test", 1110, 675, -1, -1)
    GUICtrlCreateObj($oIE, -150, -115, 1180, 1600)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_GUI1Close")
    $GUI1BTN1 = GUICtrlCreateButton("Коллекции", 1030, 50, 80, 30)
    GUICtrlSetOnEvent($GUI1BTN1, "_GUI1BTN1")
    $GUI1BTN2 = GUICtrlCreateButton("Остановить", 1030, 90, 80, 30)
    GUICtrlSetOnEvent($GUI1BTN2, "_GUI1BTN2")
    $GUI1BTN3 = GUICtrlCreateButton("Рейд", 1030, 130, 80, 30)
    GUICtrlSetOnEvent($GUI1BTN3, "_GUI1BTN3")
    GUICtrlSetState($GUI1BTN2, $GUI_DISABLE)
    GUISetState()
    GUICtrlSetState($GUI1BTN1, $GUI_FOCUS)
    GUICtrlSetState($GUI1BTN3, $GUI_FOCUS)
    _IENavigate($oIE, "http://vk.com/app3021522_355310361")
[i]
$hWnd = WinGetHandle( "[Class:AutoIt v3 GUI; Title:Embedded Web control Test]" )
[/i]
EndFunc   ;==>_GUI1

Func _GUI1Close()
    $hWnd = 0
    $iActionType = 0
    GUIDelete($GUI1)
    $IsClose = 1
EndFunc   ;==>_GUI1Close
Func _GUI1BTN1()
    GUICtrlSetState($GUI1BTN2, $GUI_ENABLE)
    GUICtrlSetState($GUI1BTN2, $GUI_FOCUS)
    GUICtrlSetState($GUI1BTN1, $GUI_DISABLE)
[i]
; --- Участок 1 в котором PixelGetColor отдает цвет

   $gPlaceColor1 = PixelGetColor($gPlaceCoord1[0], $gPlaceCoord1[1])
   Sleep(1000)
   MouseMove($gPlaceCoord1[0], $gPlaceCoord1[1])
   Sleep(1000)
_FileWriteLog(@ScriptDir & "\Example.log", $gPlaceColor1) ;

[/i]
    $iActionType = 1
EndFunc   ;==>_GUI1BTN1

Func _GUI1BTN2()
    $iActionType = 0
    GUICtrlSetState($GUI1BTN1, $GUI_ENABLE)
    GUICtrlSetState($GUI1BTN1, $GUI_FOCUS)
    GUICtrlSetState($GUI1BTN2, $GUI_DISABLE)
EndFunc   ;==>_GUI1BTN2
Func _GUI1BTN3()
    GUICtrlSetState($GUI1BTN2, $GUI_ENABLE)
    GUICtrlSetState($GUI1BTN2, $GUI_FOCUS)
    GUICtrlSetState($GUI1BTN1, $GUI_DISABLE)
    $iActionType = 2
EndFunc   ;==>_GUI1BTN3

Так вот в Участке 1 где описывается действие кнопки "Коллекции" - PixelGetColor Возвращает десятичное значение цвета пикселя
в самом теле программы Участок 2 совсем отказывается, пустое значение, Возможно Возвращает -1 при неправильно указанных координатах.
пример лог файла
2015-04-14 22:47:10 : $gPlaceColor1-2303005
2015-04-14 22:47:13 : $gColor-
2015-04-14 22:47:13 : $gPlaceCoord1-800
такое впечатление, что содержимое окна прячется и не доступно для PixelGetColor

Может кто-то сможет подсказать куда копать, чего курить?

Подозрение, что собака зарыта в переносе окна IE в Autoit.
Моя версия кода для IE работает практически без проблем:
Проблема 1 - вроде на первый взгляд статической картинке в цикле цвет читается иногда по разному.
Проблема 2 - MouseMove($gPlaceCoord1[0], $gPlaceCoord1[1]) ругается на использование не определенной переменной
 
Верх