1

Тема: AHK: ImageSearch неверно определяет изображение

#MaxThreadsPerHotkey, 2

XButton1::
    If A_IsPaused
    {
        Pause, Off
        Return
    }
    Else
    {
        If Running
        {
            Send, 1
            Pause, On, 1
        }
        Else
        {
            Running := True
            Loop
            {
                1:
                CoordMode Pixel
                ImageSearch, X, Y, 1350, 670, 1400, 710, test0.bmp   
                if ErrorLevel = 1
                         Loop 13 
                         {
                             CoordMode Pixel
                             ImageSearch, X, Y, 1350, 670, 1400, 710, test%A_Index%.bmp   
                                     if ErrorLevel = 1 
                                                 { 
                           
                                 MouseMove 1378, 687
                                 send, {LButton down}
                                 MouseMove 1425, 660
                                 send, {LButton up}
                                 goto 1
                             }
                             if ErrorLevel = 0
                             MouseMove 1378, 687
                             send, {LButton down}
                             MouseMove 1330, 687
                             send, {LButton up}
                             MouseMove 753, 448
                             send {Click}
                             sleep 150
                             goto 1
                     }
                if ErrorLevel = 0
                send, {SC029 down}
                sleep 150
                send, {SC029 up}
                sleep 150
                send, {1 down}
                sleep 150
                send, {1 up}
                sleep 150
            }
        }
    }
Return

Написал для игрушки, задача: добывать различные предметы и распределять их, по принципу "нужно не нужно", проблема состоит в том, что  ImageSearch периодически при наличии совпадения определяет, что его нет и наоборот, когда нет совпадений начинает выполнять if ErrorLevel = 0, как его можно "починить" или где я допустил ошибку?

2

Re: AHK: ImageSearch неверно определяет изображение

#MaxThreadsPerHotkey, 2

XButton1::
    If A_IsPaused
    {
        Pause, Off
        Return
    }
    Else
    {
        If Running
        {
            Send, 1
            Pause, On, 1
        }
        Else
        
            Running := True
            Loop
            {
                2:
                CoordMode Pixel
                ImageSearch, X, Y, 1350, 670, 1400, 710, test0.bmp    
                if ErrorLevel = 1
                         Loop 13 
                         {
                             CoordMode Pixel
                             ImageSearch, X, Y, 1350, 670, 1400, 710, test%A_Index%.bmp   
                          if ErrorLevel = 0 
                             { 
                             MouseMove 1378, 687
                             send, {LButton down}
                             MouseMove 1330, 687
                             send, {LButton up}
                             MouseMove 753, 448
                             send {LButton down}
                             send {LButton up}
                             sleep 350
                             }
                          if ErrorLevel = 1
                             { 
                             MouseMove 1378, 687
                             send, {LButton down}
                             MouseMove 1425, 660
                             send, {LButton up}
                             sleep 350
                             }
                if ErrorLevel = 0
                send, {SC03B down}
                sleep 150
                send, {SC03B up}
                sleep 150
                send, {1 down}
                sleep 150
                send, {1 up}
                sleep 350
                goto 2
                }
        }
    }
Return

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

3 (изменено: creature.ws, 2011-12-25 04:36:53)

Re: AHK: ImageSearch неверно определяет изображение

Логика работы скрипта задаётся не форматированием, а верным синтаксисом.
Случайное количество пробелов затрудняет чтение.
Внутри цикла Loop не нужно использовать GOTO, метка. Не замечено условие выхода из цикла.
Этот код некорректен, приведен исключительно для ознакомления:


#MaxThreadsPerHotkey, 2

XButton1::

If A_IsPaused
{
   Pause, Off
   Return
} Else {
   If Running
   {
      Send, 1
      Pause, On, 1
   } Else Running := True
   
Loop ; так было в оригинале, если цикл должен выполняться лишь if !Running нехватает {}
{
   CoordMode Pixel
   ImageSearch, X, Y, 1350, 670, 1400, 710, test0.bmp    
   if ErrorLevel = 1
      Loop 13 
      {
          CoordMode Pixel
          ImageSearch, X, Y, 1350, 670, 1400, 710, test%A_Index%.bmp   
          if ErrorLevel = 0 
          { 
             MouseMove 1378, 687
             send, {LButton down}
             MouseMove 1330, 687
             send, {LButton up}
             MouseMove 753, 448
             send {LButton down}
             send {LButton up}
             sleep 350
          }
          if ErrorLevel = 1
          { 
             MouseMove 1378, 687
             send, {LButton down}
             MouseMove 1425, 660
             send, {LButton up}
             sleep 350
          }
      }
   if ErrorLevel = 0
   {
      send, {SC03B down}
      sleep 150
      send, {SC03B up}
      sleep 150
      send, {1 down}
      sleep 150
      send, {1 up}
      sleep 350
   }
}
Return

Рекомендую просмотреть документацию- [ru]:[en]
например MouseClickDrag и SetkeyDelay

4 (изменено: Nikva, 2011-12-25 11:57:52)

Re: AHK: ImageSearch неверно определяет изображение

Выход из цикла не предусматривался. Без GOTO ни как не получается обойтись.
Попробовал использовать MouseClickDrag, но игрушка не захотела с ним работать.

#MaxThreadsPerHotkey, 2
 
XButton1::
 
If A_IsPaused
{
   Pause, Off
   Return
} Else 
   If Running
   {
      Send, 1
      Pause, On, 1
   } Else Running := True
 
Loop
{
   1:
   CoordMode Pixel
   ImageSearch, X, Y, 1354, 660, 1400, 710, test0.bmp    
   if ErrorLevel = 1
      Loop 21 
      {
          CoordMode Pixel
          ImageSearch, X, Y, 1354, 660, 1400, 710, test%A_Index%.bmp   
          if ErrorLevel = 0
          { 
             sleep 500
             MouseMove 1378, 687
             send, {LButton down}
             sleep 150
             MouseMove 1330, 687
             sleep 150
             send, {LButton up}
             sleep 150
             MouseMove 753, 448
             sleep 150
             send {LButton down}
             sleep 150
             send {LButton up}
             sleep 1150
             goto 1
          }
          if ErrorLevel = 1 
          { 
             sleep 500
             MouseMove 1378, 687
             sleep 150
             send, {LButton down}
             sleep 150
             MouseMove 1425, 660
             sleep 150
             send, {LButton up}
             sleep 1150
             goto 1
          }
      }
   if ErrorLevel = 0
   {
      sleep 450
      send, {SC03B down}
      sleep 150
      send, {SC03B up}
      sleep 150
      send, {1 down}
      sleep 150
      send, {1 up}
      sleep 1150
      goto 1
   }
}
Return
^Numpad0::ExitApp

Проблему нашел в качестве сравниваемых рисунков, но появилась новая,

CoordMode Pixel
ImageSearch, X, Y, 1354, 660, 1400, 710, test%A_Index%.bmp   
if ErrorLevel = 1
if ErrorLevel = 0

на этом участке кода он всегда выполняет if ErrorLevel = 1 вне зависимости ни от чего.

5

Re: AHK: ImageSearch неверно определяет изображение

Лады. ImageSearch

6 (изменено: Nikva, 2011-12-26 09:31:16)

Re: AHK: ImageSearch неверно определяет изображение

CoordMode, Pixel
          ImageSearch, X, Y, 1354, 660, 1400, 710, test%A_Index%.bmp
          if ErrorLevel = 1
          { 
             sleep 500
             MsgBox 11111111111
             goto 1
          }
          if ErrorLevel = 0 
          { 
             sleep 500
             MsgBox 2222222222
             goto 1
          }

совсем ничего не понимаю, упростил до минимума, при всех вариантах того что может в принципе происходить на экране он выдает сообщение "2222222222" менял местами

CoordMode, Pixel
          ImageSearch, X, Y, 1354, 660, 1400, 710, test%A_Index%.bmp 
          if ErrorLevel = 0
          { 
             sleep 500
             MsgBox 11111111111
             goto 1
          }
          if ErrorLevel = 1 
          { 
             sleep 500
             MsgBox 2222222222
             goto 1
          }

а результат все тот же: сообщение "2222222222"

--------------------------------------------

#MaxThreadsPerHotkey, 2
 
XButton1::
 
If A_IsPaused
{
   Pause, Off
   Return
} Else 
   If Running
   {
      Send, 1
      Pause, On, 1
   } Else Running := True
 
Loop
{
   1:
   CoordMode, Pixel, Screen
   ImageSearch,  FoundX, FoundY, 1354, 660, 1400, 710, *175 test110.bmp    
   if ErrorLevel = 1
      {
          CoordMode, Pixel, Screen
          ImageSearch,  FoundX, FoundY, 1354, 660, 1400, 710, *175 test1.bmp
          if ErrorLevel = 1
          { 
             sleep 500
             MouseMove 1378, 687
             sleep 150
             send, {LButton down}
             sleep 150
             MouseMove 1425, 660
             sleep 150
             send, {LButton up}
             sleep 1150
             goto 1
          }
          else
          { 
             sleep 500
             MouseMove 1378, 687
             send, {LButton down}
             sleep 150
             MouseMove 1330, 687
             sleep 150
             send, {LButton up}
             sleep 150
             MouseMove 753, 448
             sleep 150
             send {LButton down}
             sleep 150
             send {LButton up}
             sleep 1150
             goto 1
          }
      }
   if ErrorLevel = 0
   {
      sleep 450
      send, {SC03B down}
      sleep 150
      send, {SC03B up}
      sleep 150
      send, {1 down}
      sleep 150
      send, {1 up}
      sleep 1150

      goto 1
   }
}
Return
Numpad0::ExitApp

работает такой вариант, а с циклом и поиском нескольких изображений и в случае если нужно "выкинуть" при совпадении с любым из них эффект простой либо только if errorlevel=0{} или if errorlevel=1{}
Но что больше всего мне не понятно, почему во внешнем поиске никогда проблем не появлялось - он всегда при всех раскладах работал без нареканий(внешний тот, что ImageSearch ... test110.bmp)
Вернул:

loop 21
      {
          CoordMode, Pixel, Screen
          ImageSearch,  FoundX, FoundY, 1354, 660, 1450, 750, *75 test%A_Index%.bmp

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

7 (изменено: Стас, 2011-12-27 10:24:53)

Re: AHK: ImageSearch неверно определяет изображение

http://forum.script-coding.com/viewtopic.php?id=6354
Посмотри, может чем-то поможет.

8 (изменено: Nikva, 2011-12-28 04:29:44)

Re: AHK: ImageSearch неверно определяет изображение

^numpad1::
   CoordMode, Pixel, Screen
   ImageSearch,  FoundX, FoundY, 1352, 667, 1398, 710, *75 test110.bmp    
   if ErrorLevel = 1
   Loop 21 
    {
        CoordMode, Pixel, Screen
        ImageSearch,  FoundX, FoundY, 1352, 667, 1398, 710, *75 test%A_Index%.bmp
        if ErrorLevel = 1
          { 
            sleep 500
            MouseMove 1381, 692
            sleep 150
            send, {LButton down}
            sleep 150
            MouseMove 1470, 660
            sleep 150
            send, {LButton up}
            sleep 1150
          }
        else if ErrorLevel = 0
          { 
            sleep 500
            MouseMove 1381, 692
            send, {LButton down}
            sleep 150
            MouseMove 1330, 687
            sleep 150
            send, {LButton up}
            sleep 150
            MouseMove 753, 448
            sleep 150
            send {LButton down}
            sleep 150
            send {LButton up}
            sleep 1150
          }
    }
    if ErrorLevel = 0
    {
       sleep 450
       send, {SC03B down}
       sleep 150
       send, {SC03B up}
       sleep 150
       send, {1 down}
       sleep 150
       send, {1 up}
       sleep 1150
       goto 1
    }
Return
^Numpad0::ExitApp

Вот итог он работает с одним "но", если совпал первый рисунок, то он работает как нужно, но если он совпадет к примеру по 3тьему то сначала пройдет два действия по несовпадению первого и второго... Мне же нужно, что бы он на участке

CoordMode, Pixel, Screen
ImageSearch,  FoundX, FoundY, 1352, 667, 1398, 710, *75 test%A_Index%.bmp

сначала проверял все рисунки на наличие или отсутствие совпадений, и только после этого переходил к выполнению действий: если совпал хотя бы по одному то If errorlevel=0 если не совпал вообще то if errorlevel=1
________________________
посмотрел ту тему что предложил Стас в результате получилось это.

numpad1::
   CoordMode, Pixel, Screen
   ImageSearch,  FoundX, FoundY, 1352, 667, 1398, 710, *75 test110.bmp    
   if ErrorLevel = 1
   {
   Loop 21 
    {
        CoordMode, Pixel, Screen
        ImageSearch,  FoundX, FoundY, 1352, 667, 1398, 710, *75 test%A_Index%.bmp   
        MissPic += 1
        if ErrorLevel = 1
        {
           sleep 500
           MouseMove 1381, 692
           sleep 150
           send, {LButton down}
           sleep 150
           MouseMove 1470, 660
           sleep 150
           send, {LButton up}
           sleep 1150
        }
        if ErrorLevel = 0
        {
           arraycount+= 1
           array%arraycount% = %MissPic%
        }
    }
    {
    Loop, %arraycount%
    element := Array%A_Index%    sleep 500
    MouseMove 1381, 692
    Send, {LButton down}
    sleep 150
    MouseMove 1330, 687
    sleep 150
    send, {LButton up}
    sleep 150
    MouseMove 753, 448
    sleep 150
    send {LButton down}
    sleep 150
    send {LButton up}
    sleep 1150
    }
    array%arraycount% = 0
    MissPic = 0
    }
   if ErrorLevel = 0
   {
      sleep 450
      send, {SC03B down}
      sleep 150
      send, {SC03B up}
      sleep 150
      send, {1 down}
      sleep 150
      send, {1 up}
      sleep 1150

   }
Return
Numpad0::ExitApp

вроде как делает то, что от нее требуется, но без GOTO он начинает "циклиться" на чём то одном, т.е. встретил картинку или наоборот не нашел её и начинает выполнять бесконечно тот цикл что первый ему попался. Хотя я совсем не уверен, что написал все правильно.

9 (изменено: Nikva, 2011-12-28 06:09:43)

Re: AHK: ImageSearch неверно определяет изображение

Numpad1::
1:
Loop
{
   CoordMode, Pixel, Screen
   ImageSearch,  FoundX, FoundY, 1352, 667, 1398, 710, *75 test110.bmp    
   if ErrorLevel = 1
   {
    {
     Loop 21
     {
         CoordMode, Pixel, Screen
         ImageSearch,  FoundX, FoundY, 1352, 667, 1398, 710, *75 test%A_Index%.bmp   
         MissPic += 1
         if ErrorLevel = 1
         {
             arraycount+= 1

             array%arraycount% += %MissPic%
             Loop, %arraycount%
             element := Array%A_Index%
         }
         if ErrorLevel = 0
         {

             array%arraycount% -= %MissPic%
         }
     }
    }
    if arraycount in 21
    {
       sleep 500
       MouseMove 1381, 692
       sleep 150
       send, {LButton down}
       sleep 150
       MouseMove 1470, 660
       sleep 150
       send, {LButton up}
       sleep 1150
       arraycount := 0
       array%arraycount% := 0
       MissPic := 0
    }
    if arraycount in 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
    {
       sleep 500
       MouseMove 1381, 692
       Send, {LButton down}
       sleep 150
       MouseMove 1330, 687
       sleep 150
       send, {LButton up}
       sleep 150
       MouseMove 753, 448
       sleep 150
       send {LButton down}
       sleep 150
       send {LButton up}
       sleep 1150
       arraycount := 0
       array%arraycount% := 0
       MissPic := 0
    }
   }
   if ErrorLevel = 0
   {
      sleep 450
      send, {SC03B down}
      sleep 150
      send, {SC03B up}
      sleep 150
      send, {1 down}
      sleep 150
      send, {1 up}
      sleep 1150

      goto 1
   }
}
Return
Numpad0::ExitApp

Вот результат делает, что нужно и как от него требуется. Всем спасибо за помощь. Если найдете какие нибудь ошибки в скрипте или предложения напишите пожалуйста.:D

10 (изменено: creature.ws, 2012-01-07 23:52:04)

Re: AHK: ImageSearch неверно определяет изображение


…
   if ErrorLevel = 1
   {
     Loop 21
     {
         CoordMode, Pixel, Screen
         ImageSearch,  FoundX, FoundY, 1352, 667, 1398, 710, *75 test%A_Index%.bmp   
         MissPic += 1
         if ErrorLevel = 1
         {
             arraycount+= 1
 
             array%arraycount% += MissPic
             Loop, %arraycount%
                element := Array%A_Index%
         }
         if ErrorLevel = 0
             arraycount -= MissPic
    }
…