Что нового

Быстрый поиск пикселей в игре (HELP ME)

winbotx

Новичок
Сообщения
29
Репутация
0
Привет всем ! Перерыл гугл и наткнулся на форум , тут был выложен способ очень быстрого поиска пикселей .
Но , я не могу настроить его под себя :scratch:
Мне нужно :
Чтобы был найден цвет 0xFFFFFF , в небольшом квадрате , в центре экрана , мышка навелась на него и кликала .
Игра в которой хочу использова : Онлайн шутер .

Код который я нашёл :
Код:
#Include <Constants.au3>
#Include <WinAPIEx.au3>
#Include <WindowsConstants.au3>

Run(@ProgramFilesDir & '\Microsoft Games\Minesweeper\MineSweeper.exe')
$hWnd = WinWait('Minesweeper', '', 3)
If Not $hWnd Then
    Exit
EndIf

; Чтобы мины успели нарисоваться!
Sleep(1000)

$Size = WinGetClientSize($hWnd)
$hDC = _WinAPI_GetDC($hWnd)
$hMemDC = _WinAPI_CreateCompatibleDC($hDC)
$hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $Size[0], $Size[1])
$hSv = _WinAPI_SelectObject($hMemDC, $hBitmap)
_WinAPI_BitBlt($hMemDC, 0, 0, $Size[0], $Size[1], $hDC, 0, 0, $SRCCOPY)
_WinAPI_SelectObject($hMemDC, $hSv)
_WinAPI_DeleteDC($hMemDC)
_WinAPI_ReleaseDC($hWnd, $hDC)

; Здесь у тебя есть готовый битмап ($hBitmap), делай с ним что хочешь!

;----------------------------------------

; Демонстрация
$hWnd = GUICreate('', $Size[0], $Size[1], 50, 50, -1, $WS_EX_TOPMOST)
GUISetState()
$hDC = _WinAPI_GetDC($hWnd)
$L = $Size[0] * $Size[1]
$tBits = DllStructCreate('dword[' & $L & ']')
_WinAPI_GetBitmapBits($hBitmap, 4 * $L, DllStructGetPtr($tBits))
$Offset = 1
For $y = 0 To $Size[1] - 1
    For $x = 0 To $Size[0] - 1
        _WinAPI_SetPixel($hDC, $x, $y, DllStructGetData($tBits, 1, $Offset))
        $Offset += 1
    Next
Next
_WinAPI_ReleaseDC($hWnd, $hDC)

;----------------------------------------

; Ищем точку с цветом 0x87BEF5 (RGB)
$ARGB = _WinAPI_IntToDWord(BitOR(0x87BEF5, 0xFF000000))
$L = $Size[0] * $Size[1]
$tBits = DllStructCreate('dword[' & $L & ']')
_WinAPI_GetBitmapBits($hBitmap, 4 * $L, DllStructGetPtr($tBits))
$Timer = TimerInit()
$Offset = -1
For $i = 1 To $L
    If DllStructGetData($tBits, 1, $i) = $ARGB Then
        $Offset = $i
        ExitLoop
    EndIf
Next
ConsoleWrite('API' & @CR)
ConsoleWrite(TimerDiff($Timer) & @CR)
If $Offset = -1 Then
    ConsoleWrite('Not Found!' & @CR)
Else
    ConsoleWrite('X = ' & Mod($Offset, $Size[0]) - 1 & @CR)
    ConsoleWrite('Y = ' & Ceiling($Offset / $Size[0]) - 1 & @CR)
EndIf

ConsoleWrite('' & @CR)
;----------------------------------------

Opt('PixelCoordMode', 2)
$Timer = TimerInit()
$Offset = False
For $y = 0 To $Size[1] - 1
    For $x = 0 To $Size[0] - 1
        If PixelGetColor($x, $y, $hWnd) = 0x87BEF5 Then
            $Offset = True
            ExitLoop 2
        EndIf
    Next
Next
ConsoleWrite('AutoIt' & @CR)
ConsoleWrite(TimerDiff($Timer) & @CR)
If Not $Offset Then
    ConsoleWrite('Not Found!' & @CR)
Else
    ConsoleWrite('X = ' & $x & @CR)
    ConsoleWrite('Y = ' & $y & @CR)
EndIf

;----------------------------------------

Do
Until GUIGetMsg() = -3
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Ты сначала команду PixelSearch осознай, опробуй и осиль.
 
Автор
W

winbotx

Новичок
Сообщения
29
Репутация
0
Уже осилил и сделал аим на PixelSearch , но он медленно ищит пиксели и если объекты движутся , мышка отстаёт => идут промахи , мне нужен быстрый поиск пикселей .
Помогите пожалуйста :-\
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Ну, ты ж в гугле уже всё нашел. ;D
В приведённом тобой коде ускорение достигается за счет того что делается скрин, а потом идёт поиск пикселя не путем обращения к видеопамяти, а просто в этом скрине.

Тебе нужно скачать эти библиотеки
Код:
#Include <Constants.au3>
#Include <WinAPIEx.au3>
#Include <WindowsConstants.au3>


В твоём скрипте ты получаешь скрин
Код:
$hWnd = WinWait('твой шутер', '', 3)
$Size = WinGetClientSize($hWnd)
$hDC = _WinAPI_GetDC($hWnd)
$hMemDC = _WinAPI_CreateCompatibleDC($hDC)
$hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $Size[0], $Size[1])
$hSv = _WinAPI_SelectObject($hMemDC, $hBitmap)
_WinAPI_BitBlt($hMemDC, 0, 0, $Size[0], $Size[1], $hDC, 0, 0, $SRCCOPY)
_WinAPI_SelectObject($hMemDC, $hSv)
_WinAPI_DeleteDC($hMemDC)
_WinAPI_ReleaseDC($hWnd, $hDC)
; Здесь у тебя есть готовый битмап ($hBitmap), делай с ним что хочешь!


И дальше ищешь в битмапе точку нужного тебе цвета
Код:
; Ищем точку с цветом 0xFFFFFF (RGB)
$ARGB = _WinAPI_IntToDWord(BitOR(0xFFFFFF, 0xFF000000))
$L = $Size[0] * $Size[1]
$tBits = DllStructCreate('dword[' & $L & ']')
_WinAPI_GetBitmapBits($hBitmap, 4 * $L, DllStructGetPtr($tBits))
$Offset = -1
For $i = 1 To $L
    If DllStructGetData($tBits, 1, $i) = $ARGB Then
        $Offset = $i
        ExitLoop
    EndIf
Next
If $Offset = -1 Then
    ; Точка указанного цвета не найдена
Else
    $X = Mod($Offset, $Size[0]) - 1
    $Y = Ceiling($Offset / $Size[0]) - 1
EndIf
 
Автор
W

winbotx

Новичок
Сообщения
29
Репутация
0
Ох спасибо ! Слушай , а как наводитить прицел на найденный пиксель? Всмысле понятно что MouseMove , просто куда , что здесь отвечает за положение пикселя?
Т.е например в обычном скрипте :
Код:
MouseMove( $1[0] , $1[1] )
,а тут как делать?


Добавлено:
Сообщение автоматически объединено:

С наведение справился , а как облость регулировать?
Всмысле например я хочу сделать чтобы искало пиксели вокруг мышки .
К примеру в старом скрипте я делал так :
Код:
Global $mouse = MouseGetPos()
	$1 = PixelSearch($mouse[0]-8, $mouse[1]-3, $mouse[0]+8, $mouse[1]+3, $color)

А потом наводился на $1



Добавлено:
Сообщение автоматически объединено:

Насчёт наведения тоже поспешил , не разобрался , стреляет не туда ...
Попробовал сделать так :
Код:
MouseMove($x,$y)

стреляет чёрт знает куда)
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
а как область регулировать?

Не вопрос! Вместо
Код:
$Offset = -1
For $i = 1 To $L
    If DllStructGetData($tBits, 1, $i) = $ARGB Then
        $Offset = $i
        ExitLoop
    EndIf
Next
If $Offset = -1 Then
    ; Точка указанного цвета не найдена
Else
    $X = Mod($Offset, $Size[0]) - 1
    $Y = Ceiling($Offset / $Size[0]) - 1
EndIf


Пишем
Код:
$mouse = MouseGetPos()
$X=0
$Y=0
For $i = $mouse[0]-8 To $mouse[0]+8
	For $j = $mouse[1]-3 To $mouse[1]+3
		If DllStructGetData($tBits, 1, $i) = $ARGB Then
			$X = $i
			$Y = $j
			ExitLoop
		EndIf
	Next
Next
If ($X = 0) AND ($Y = 0) Then
    ; Точка указанного цвета не найдена
EndIf



Добавлено:
Сообщение автоматически объединено:

Насчёт наведения тоже поспешил , не разобрался , стреляет не туда ...

в старом скрипте я делал так : ...
А потом наводился на $1

Ну так а в старом скрипте наводился как?
Тут ничего не поменялось, просто вместо $1[0] и $1[1] ты теперь берёшь $X и $Y.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
winbotx [?]
Уже осилил и сделал аим на PixelSearch , но он медленно ищит пиксели и если объекты движутся , мышка отстаёт => идут промахи , мне нужен быстрый поиск пикселей .
PixelSearch не двигает курсор, он просто выдает координаты пикселя. Курсор двигает функция
Код:
MouseMove()
- третим параметром которой ... скорость.
Но она только передвигает курсур, но не нажимает клавиш.
Что бы кликнуть куда то используй
Код:
MouseClick()
 
Автор
W

winbotx

Новичок
Сообщения
29
Репутация
0
Ох спасибо ! Но всё равно у меня некорректно работает .
Вообщем оно не реагирует на пиксели окна которое я указал в начале , но реагирует например если я на рабочем столе наведу на иконку с таким цветом .
+ Ещё и работает только 1 раз почему-то .(Я запускаю скрипт , пробую , закрываю , запускаю ещё раз не реагирует вообще ни на что)
Помогите пожалуйста :stars:
 
Автор
W

winbotx

Новичок
Сообщения
29
Репутация
0
Код:
#Include <Constants.au3>
#Include <WinAPIEx.au3>
#Include <WindowsConstants.au3>



HotKeySet("j", "_OFFProg")
HotKeySet("l","_Pause")

Func _Pause()
    While 1
        Sleep(1000)
    WEnd
EndFunc


Func _OFFProg()
	Exit
EndFunc



While 1
$hWnd = WinWait('Counter-Strike Source', '', 3)
$Size = WinGetClientSize($hWnd)
$hDC = _WinAPI_GetDC($hWnd)
$hMemDC = _WinAPI_CreateCompatibleDC($hDC)
$hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $Size[0], $Size[1])
$hSv = _WinAPI_SelectObject($hMemDC, $hBitmap)
_WinAPI_BitBlt($hMemDC, 0, 0, $Size[0], $Size[1], $hDC, 0, 0, $SRCCOPY)
_WinAPI_SelectObject($hMemDC, $hSv)
_WinAPI_DeleteDC($hMemDC)
_WinAPI_ReleaseDC($hWnd, $hDC)
; Здесь у тебя есть готовый битмап ($hBitmap), делай с ним что хочешь!



; Ищем точку с цветом 0xFFFFFF (RGB)
$ARGB = _WinAPI_IntToDWord(BitOR(0xFFFFFF, 0xFF000000))
$L = $Size[0] * $Size[1]
$tBits = DllStructCreate('dword[' & $L & ']')
_WinAPI_GetBitmapBits($hBitmap, 4 * $L, DllStructGetPtr($tBits))
$mouse = MouseGetPos()
$X=0
$Y=0
For $i = $mouse[0]-8 To $mouse[0]+8
    For $j = $mouse[1]-3 To $mouse[1]+3
        If DllStructGetData($tBits, 1, $i) = $ARGB Then
            $X = $i
            $Y = $j
            ExitLoop
        EndIf
    Next
Next
If ($X = 0) AND ($Y = 0) Then
    
Else
	MouseClick("left")
EndIf

WEnd


По идеи когда вокруг мышки появляется цвет FFFFFF ,скрипт должен нажимать левую кнопку мышки , и тем самым стрелять .
Но так как я описал в сообщении выше не происходит .
 
Автор
W

winbotx

Новичок
Сообщения
29
Репутация
0
Я сам помощи ищу .
Надеюсь мне помогут :-\
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Сори, протупил :-[
Вот так должно быть
Код:
For $i = $mouse[0]-8 To $mouse[0]+8
	For $j = $mouse[1]-3 To $mouse[1]+3
		$point = $i*$Size[0] + $j
		If DllStructGetData($tBits, 1, $point) = $ARGB Then
			$X = $i
			$Y = $j
			ExitLoop
		EndIf
	Next
Next


С паузой ты намутил немного...
Вот так правильно
Код:
Global $PauseFlag = False

HotKeySet("{l}","_Pause")

Func _Pause()
	$PauseFlag = Not $PauseFlag
    While $PauseFlag
        Sleep(1000)
    WEnd
EndFunc
 

running-frag

why me?
Сообщения
441
Репутация
60
Код:
$1 = ....
:rofl:

OffTopic:
Я конечно извеняюсь но разве через dll быстрее нежели чем PixelSearch()? Самому интересно. К чему такие сложности с простым поиском пикселя?

Так же скажу, чем больше тазик нагружен во время поиска - тем медленнее сам поиск искомого пикселя. Поэтому всякие там антивири, торренты лучше отключать - увеличится быстродействия данного скрипта.
 
Верх