1

Тема: AHK: действия при последовательном изменении A_Index

Данный кусок скрипта работает, но мне интересно насколько он грамотно или неграмотно написан. Задача была такая:
- бесконечный цикл, внутри которого например поиск пикселя.
- при последовательном, успешном поиске пикселя "PixelSearch" больше 2-ух раз, выходить из цикла.
Т.е. в цикле мы можем сколько угодно раз находить пиксель, главное, чтобы это было не подряд (2 и более), иначе цикл завершиться.



Counter_Steps := 0
kf := 0
kf1 := 0

Main:
Loop 
{
msgbox, count %A_index%

PixelSearch, Px, Py, 0, 0, 0, 0, 0x000000, 0, Fast RGB 
if ErrorLevel
{
	kf1 := A_index - kf ; отнимаем текущий A_index от A_index прошлой итерации
	kf := A_index ; записываем A_index на текущий момент
	msgbox, %kf1%
	if kf1 = 1 ; если был найден пиксель две итерации подряд, то включаем счетчик (не более 2 раз)
	{
	Counter_Steps_On += 1
		if Counter_Steps_On >= 2 
		{
		break Main
		}
	}
}
}
GD

2

Re: AHK: действия при последовательном изменении A_Index

Если нужна скорость используйте LockBits.

3 (изменено: Botsy, 2020-10-26 19:13:58)

Re: AHK: действия при последовательном изменении A_Index

Malcev пишет:

Если нужна скорость используйте LockBits.

Да, читал про альтернативный метод поиска, но не в этом суть. Меня интересует как можно обработать случай, когда внутри цикла выполнено условие подряд, более 2-ух раз. Не просто более 2-ух раз, а именно подряд.

GD

4

Re: AHK: действия при последовательном изменении A_Index

По-разному можно.
Например так:

loop
{
   loop 2
   {
      PixelSearch, Px, Py, 0, 0, 0, 0, 0x000000, 0, Fast RGB
      if ErrorLevel
         Continue 2
   }
   msgbox 2 подряд
}

5

Re: AHK: действия при последовательном изменении A_Index

Malcev пишет:

По-разному можно.
Например так:

Ваш пример ограничен фиксированным числом повторений цикла. В примере приведенном мной, мы имеем бесконечный цикл и отлавливаем событие именно подряд, согласно переменной A_index. Число подряд  "Counter_Steps_On" можем менять, на любую последовательность. Например, если 10 раз подряд, то выйдем из цикла и т.д.

GD

6

Re: AHK: действия при последовательном изменении A_Index

Ну так поменяйте "loop 2" на нужное вам количество.
Не понимаю в чем проблема.

7 (изменено: Botsy, 2020-10-26 20:22:44)

Re: AHK: действия при последовательном изменении A_Index

Malcev пишет:

Не понимаю в чем проблема.

Как в вашем случаем выйти из цикла, если нашли картинку 2 раза подряд ?

GD

8 (изменено: Malcev, 2020-10-01 05:52:08)

Re: AHK: действия при последовательном изменении A_Index

loop
{
   loop 2
   {
      PixelSearch, Px, Py, 0, 0, 0, 0, 0x000000, 0, Fast RGB
      if ErrorLevel
         Continue 2
   }
   break
}

или так:

loop
{
   loop
   {
      PixelSearch, Px, Py, 0, 0, 0, 0, 0x000000, 0, Fast RGB
      if ErrorLevel
         Continue 2
      if (A_Index = 2)
         break 2
   }
}

или так:

loop
{
   PixelSearch, Px, Py, 0, 0, 0, 0, 0x000000, 0, Fast RGB
   if ErrorLevel
   {
      n := 0
      Continue
   }
   n++
   if (n = 2)
      break
}

9

Re: AHK: действия при последовательном изменении A_Index

Malcev просто для уточнения. Я правильно понимаю, что приведенный ниже пример, можно исправить согласно вашим правкам и он будет работать так ?:
- бесконечный цикл, с поиском пикселей. Если он нашел второй пиксель, выведет на экран сообщение Second, и будет дальше работать. Но если он найдет второй пиксель дважды подряд, то после второго сообщения Second он завершит работу.


Loop 
{
PixelSearch, Px, Py, 0, 0, 0, 0, 0x000000, 0, Fast RGB 
if ErrorLevel = 0
{
msgbox, First
}

PixelSearch, Px, Py, 0, 0, 0, 0, 0x000000, 0, Fast RGB
if ErrorLevel
{
msgbox, Second
}
else 
{
msgbox, Else
}
}
GD

10

Re: AHK: действия при последовательном изменении A_Index

Да. Учитесь составлять алгоритмы.

11 (изменено: Botsy, 2020-10-26 19:14:36)

Re: AHK: действия при последовательном изменении A_Index

Malcev пишет:

Да. Учитесь составлять алгоритмы.

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

GD

12

Re: AHK: действия при последовательном изменении A_Index

Botsy пишет:

Т.е. в цикле мы можем сколько угодно раз находить пиксель, главное, чтобы это было не подряд (2 и более)

По-моему, самый лобовой способ, он же самый простой:

Loop {
   PixelSearch, Px, Py, 0, 0, 0, 0, 0x000000, 0, Fast RGB
   if (ErrorLevel = 0 && prevErrorLevel = 0)
      break
   prevErrorLevel := ErrorLevel
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13 (изменено: Botsy, 2020-10-26 19:14:47)

Re: AHK: действия при последовательном изменении A_Index

teadrinker пишет:

По-моему, самый лобовой способ, он же самый простой:

Похоже.

GD

14 (изменено: serzh82saratov, 2020-10-01 16:14:53)

Re: AHK: действия при последовательном изменении A_Index


While i < 2, (1, (i = "" && i := 0))
{
      PixelSearch, Px, Py, 0, 0, 0, 0, 0x000000, 0, Fast RGB 
      i := !ErrorLevel ? i + 1 : 0 
}

Со сбросом i при выходе.


While (1, (i = "" && i := 0)) && (i < 2 || (i := 0)) {
	PixelSearch, Px, Py, 0, 0, 0, 0, 0x000000, 0, Fast RGB 
	i := !ErrorLevel ? i + 1 : 0  
} 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15 (изменено: Botsy, 2020-10-26 19:15:00)

Re: AHK: действия при последовательном изменении A_Index

teadrinker Попробовал ваш способ, отлично работает, написал так:


Loop 
{
msgbox, Start

PixelSearch, Px, Py, 0, 0, 0, 0, 0x000000, 0, Fast RGB
if (ErrorLevel = 1 && prevErrorLevel = 1)
{
	msgbox, Мы не нашли пиксель два раза подряд, конец цикла
	break
}
if ErrorLevel = 1
{
	msgbox, Не нашли пиксель, продолжаем цикл
}
else
{
msgbox, Нашли пиксель %prevErrorLevel%
}
prevErrorLevel := ErrorLevel
}

serzh82saratov

(1, (i = "" && i := 0)) && (i < 2 || (i := 0))

хочу понимать такие записи, как вы привели. Уверен они очень сокращают код, но сейчас я смотрю на них и ничего не понимаю.
Надо почитать про операторы и всякие символы.

Спасибо всем за потраченное время, ваши примеры очень помогли. Дают понять, что мне надо начать мыслить по другому в составлении алгоритмов.

GD

16 (изменено: __Михаил__, 2020-10-08 01:05:44)

Re: AHK: действия при последовательном изменении A_Index

Botsy

Если я правильно понимаю:

While (1, (i = "" && i := 0)) && (i < 2 || (i := 0))...

Цикл 'While' должен выполнятся пока переменная/выражение является истинной 0+ (более нуля).
1 параметр в скобках выполняет эту роль (1, ...). Далее идут условия изменения переменной 'i'.
2 параметр меняет значение 'i' на пустую строку (i = "" && i := 0).
3 параметр назначает 'i' равной 0 если 'i' больше чем 2.


Вот пример для проверки:

F2::
T := (i < 4 || (i := 0))
ToolTip, T=%T%`ni=%i%
i++
Return

Для наглядности сделал предел в 4.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101