Что нового

Поиск цвета

XevaloO

Чайник
Сообщения
28
Репутация
1
Почему вот эта штука не работает?
Код:
$i=0
$x=PixelSearch(10,10,1280,1024,4013112)
$z=PixelSearch(10,10,1280,1024,4013112)
do
$x=PixelSearch(10,$z[1]+1,1280,1024,4013112)
$y=PixelChecksum($x[0]-2,$x[1]-2,$x[0]+2,$x[1]+2)
Select
    Case $y=PixelChecksum(819,746,823,750)
      $i=1
  Case Else
	  $z=PixelSearch(10,$x[1]+1,1280,1024,4013112)
EndSelect
    Until $i=1
run('notepad.exe')
WinWaitActive('Безымянный - Блокнот')
send($x[0])
send($x[1])

Хм по моему разумению, она должна перебирать все точки с цветом 4013112 и если контрольная сумма пикселей в квадрате 4х4 сойдется выйти из цикла
 

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Вариант 1) потому что PixelSearch в случае ненахождения пиксела записывает в переменную @error значение 1 и не возвращает массив. А ты без проверки @error к нему обращаешься
Это если выдаёт ошибку
А если не выдаёт, то
Вариант 2) Просто нет совпадений, а потому условие выхода из цикла не выполняется - бесконечный цикл.

Кстати это квадрат 5 на 5 в примере. Сам посчитай количество точек в каждой стороне.
 
Автор
X

XevaloO

Чайник
Сообщения
28
Репутация
1
вот эта штука выполняется на раз
Код:
$x=PixelSearch(0,0,1280,1024,4013112)
$z=PixelSearch(0,0,1280,1024,4013112)
$x=PixelSearch(0,$z[1]+1,1280,1024,4013112)
$yx=PixelChecksum($x[0]-2,$x[1]-2,$x[0]+2,$x[1]+2)
;$y=PixelChecksum(819,746,823,750)
$z=PixelSearch(0,$x[1]+1,1280,1024,4013112)
$yz=PixelChecksum($z[0]-2,$z[1]-2,$z[0]+2,$z[1]+2)
$a=PixelSearch(0,$z[1]+1,1280,1024,4013112)
$ya=PixelChecksum($a[0]-2,$a[1]-2,$a[0]+2,$a[1]+2)
$b=PixelSearch(0,$a[1]+1,1280,1024,4013112)
$yb=PixelChecksum($b[0]-2,$b[1]-2,$b[0]+2,$b[1]+2)
run('notepad.exe')
WinWaitActive('Безымянный - Блокнот')
Send('X=')
send($x[0])
send(' ')
send($x[1])
send(' YX=')
send($yx)
send(' Z=');
send($z[0])
send($z[1])
send(' YZ=')
send($yz)
send(' A=')
send($a[0])
send($a[1])
send(' YA=')
send($ya)
send('{ENTER}')

Я просто специально взял точку 821,748 и посчитал для нее чек сумму 5х5, то бишь оно должно найти эту точку если работает оно правильно
вот сейчас я посмотрел, пишет оно мне такую фигню, про то что в цикле:
C:\Program Files (x86)\AutoIt3\SciTE\SciTEConfig\Hz5.au3 (18) : ==> Subscript used with non-Array variable.:
$y=PixelChecksum($x[0]-2,$x[1]-2,$x[0]+2,$x[1]+2)
$y=PixelChecksum($x^ ERROR
но ведь без цикла оно РАБОТАЕТ
 

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Ну вот эта ошибка из-за варианта 1.
Перед тем, как обращаться к результатам PixelSearch надо делать проверку
if not @error then
и тогда уже использовать результаты.
И проверять после каждого сёрча.

Конкретно ваш пример я бы переиначил так:
Код:
Local $err=0, $searchcheck
$searchcheck=PixelChecksum(819,746,823,750)
$i=0
$x=PixelSearch(10,10,1280,1024,4013112)
if not @error then
$z=PixelSearch(10,10,1280,1024,4013112)
if not @error then
do
$x=PixelSearch(10,$z[1]+1,1280,1024,4013112)
if not @error then
$y=PixelChecksum($x[0]-2,$x[1]-2,$x[0]+2,$x[1]+2)
if $y==$searchcheck then
; ибо нефиг каждый раз в цикле вычислять чексумму одного и того же неизменного 
; участка. Если он меняется, тогда да - каждый раз.
      $i=1
Else
      $z=PixelSearch(10,$x[1]+1,1280,1024,4013112)
; тут проверку на @error не делаю, ибо если еррор, то будет выход из цикла и сообщение (наше ручное) об ошибке
endif
endif
    Until $i=1 or (not @error)
endif
endif
if $i==1 or not @error then
run('notepad.exe')
WinWaitActive('Безымянный - Блокнот')
send($x[0])
send($x[1])
else
;что угодно, к примеру вывод сообщения о ложном поиске, чтоб знать что случилось
endif

Если я нигде ничего не напутал.

И незачем использовать select там, где достаточно простого if. Имхо.
 
Автор
X

XevaloO

Чайник
Сообщения
28
Репутация
1
Lexx98 сказал(а):
И незачем использовать select там, где достаточно простого if. Имхо.
Почему?Есть разница в скорости обработки?
(З.Ы. оно выдает точку с совсем другой чек суммой но не первую найденную :wacko:smile:
 

Lexx98

Продвинутый
Сообщения
272
Репутация
73
А ещё, имхо лучше искать не десятичное число, а шестнадцатиричное, в PixelSearch. Потому что мне, знакомому с азами цветовой гаммы, 16-тиричное несёт больше информации визуальной.

И мне кажется, что у тебя несложная задача решается сложным путём.

И вот ещё я заметил, что ты запускаешь блокнот только чтобы в него вывести координаты... Посмотри функцию MsgBox - проще будет.
К примеру так.
Код:
MsgBox(0, "Результат", "Координаты сокровищ: "&$x[0]&" - "&$x[1])

А вот там, где не найдено:
Код:
MsgBox(0, "Результат", "Координаты: карта сокровищ оказалась поддельной...")

А чтобы было наглядно, можно когда выводишь результат, ещё сделать и
Код:
MouseMove($x[0], $x[1])

Оно мышь передвинет в найденное место - просто, быстро, наглядно.
 
Автор
X

XevaloO

Чайник
Сообщения
28
Репутация
1
а есть в аутоИТ функция пошагового выполнения с возможностью отслеживать значения переменных?
 

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Нет.
Но можно в нужном месте составить текст с тем что требует отслеживания, и использовать
Код:
ToolTip ( "text" [, x, y] )
; и после него
Sleep

Посмотри справку по этим функциям
 
Автор
X

XevaloO

Чайник
Сообщения
28
Репутация
1
Короче оно заработало :laugh:
Код:
$checkcolor=4539707
$checksum=1425282085
$i=0
$x=PixelSearch(0,0,1280,1024,$checkcolor)
$z=PixelSearch(0,0,1280,1024,$checkcolor)
$a=0
do
$x=PixelSearch(0,$a,1280,1024,$checkcolor)
ControlSend('Безымянный - Блокнот','','Edit1',$x[0])
ControlSend('Безымянный - Блокнот','','Edit1',' ')
ControlSend('Безымянный - Блокнот','','Edit1',$x[1])
ControlSend('Безымянный - Блокнот','','Edit1','{enter}')
$yx=PixelChecksum($x[0]-2,$x[1]-2,$x[0]+2,$x[1]+2)
$a=$x[0]+1
$b=$x[0]+1
Select
	Case $yx=$checksum
	  $i=1
	Case Else
	    while $x[0]<1278
	      $z=PixelSearch($b,$x[1],1280,$x[1],$checkcolor)
	      Select
			Case Not @error
				 if PixelChecksum($z[0]-2,$z[1]-2,$z[0]+2,$z[1]+2)=$checksum Then
		      $x[0]=$z[0]
		      $x[1]=$z[1]
	          $i=1
		  Else
			  $b+=1
		EndIf
			Case Else
			  $x[0]=1278
          EndSelect
		  WEnd
	  $a=$x[1]+1
EndSelect
		Until $i=1
 
Верх