Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Findimage (lua)
YuzveR
сообщение 14.2.2024, 13:22
Сообщение #1


*

Registred
Сообщений: 5
Регистрация: 14.2.2024
Группа: Пользователи
Наличность: 0
Пользователь №: 20.717
Возраст: 37



Доброго времени суток.
Вопрос по Findimage:
Имеется несколько сохранённых картинок. Например, звезда, треугольник, квадрат и т.д.
Возможно ли объединить все искомые картинки в один массив? Например:

Код
--lua
local handle = findwindow ("Безымянный")
local startX, startY, endX, endY = 0, 0, 1920, 1080
local path = [[C:\\Image]]
local arr = {"blackstar","bluestar","green","orangearr","purple","redstar"}
for i=1, #arr do
   local image, a = findimage (startX, startY, endX, endY, {path .. "\\" .. arr[i] .. ".bmp"}, 2)
end


Вообще могу прописать к каждой картинке findimage {blackstar.bmp} и т.д., но скрипт очень большой выходит )
Пытаюсь написать выполнение цикла до тех пор, пока все 6(например) картинок не будут кликнуты и не пропадут после клика.

И другой вопрос, реально ли реализовать прохождение тестирования через скрипт?
Например, Есть вопрос "2+2 = ?" и несколько вариантов ответов "1, 2, 3, 4". И он идёт первым.
Через findimage поиск картинки с вопросом и клик на ответ.
Но как реализовать, если этот вопрос будет в середине или в конце тестирования?
Скрипт же идёт сверху вниз по порядку. То есть это условие появления findimage может возникнуть в любой момент.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 14.2.2024, 18:09
Сообщение #2


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27725
Пользователь №: 11.279



Цитата
Возможно ли объединить все искомые картинки в один массив? Например:

а что с кодом не так? визуально вроде все живо.
Если порядок появления не известен - завернуть for в
while 1 do

end

Цитата
Но как реализовать, если этот вопрос будет в середине или в конце тестирования?

Перебирать все вопросы и тыкать нужный ответ.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 14.2.2024, 18:59
Сообщение #3


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27725
Пользователь №: 11.279



Цитата
Перебирать все вопросы и тыкать нужный ответ.

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


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
YuzveR
сообщение 16.2.2024, 12:37
Сообщение #4


*

Registred
Сообщений: 5
Регистрация: 14.2.2024
Группа: Пользователи
Наличность: 0
Пользователь №: 20.717
Возраст: 37



Добрый день, нужна помощь. Где-то ошибся, но не могу разобраться где:

Код

local arrr, ar = findimage (startX, startY, endX, endY, {opredeliteou}, 2)
while (arrr) do
    local brrr, br = findimage (startX, startY, endX, endY, {ou}, 2)
        while (brrr) do
            kleft (brrr[1][1], brrr[1][2])
            wait (100)
            brrr, br = findimage (startX, startY, endX, endY, {ou}, 2)
        end
    local crrr, cr = findimage (startX, startY, endX, endY, {prodoljit}, 2)
        while (crrr) do
            kleft (crrr[1][1], crrr[1][2])
            wait (100)
            crrr, cr = findimage (startX, startY, endX, endY, {prodoljit}, 2)
        end
end
local drrr, dr = findimage (startX, startY, endX, endY, {opredeliteod}, 2)
while (drrr) do
    local errr, er = findimage (startX, startY, endX, endY, {od}, 2)
        while (errr) do
            kleft (errr[1][1], errr[1][2])
            wait (100)
            errr, er = findimage (startX, startY, endX, endY, {od}, 2)
        end
    local crrr, cr = findimage (startX, startY, endX, endY, {prodoljit}, 2)
        while (crrr) do
            kleft (crrr[1][1], crrr[1][2])
            wait (100)
            crrr, cr = findimage (startX, startY, endX, endY, {prodoljit}, 2)
        end
end


Находит на экране "ОпределитеОУ" - жмёт "ОУ", затем "Продолжить".
Следом появляется "ОпределитеОД", но всё равно жмёт "ОУ", вместо "ОД".
Где я не закрыл условие?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 16.2.2024, 13:07
Сообщение #5


****

Apprentice
Сообщений: 283
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8477
Пользователь №: 19.451
Возраст: 32



Вы заходите в цикл while (arrr) do и выхода из него нет он будет вечно крутить свои условия.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 16.2.2024, 13:17
Сообщение #6


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27725
Пользователь №: 11.279



условие выхода из цикла какое должно быть? в данный момент есть условие входа - мы нашли arrr. Факт этого нахождения никогда уже не изменится - уже нашли. Т.е. вам либо нужно обновлять этот поиск (repeat может быть удобнее в таком варианте) либо делать какое-то иное условие выхода из цикла.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
YuzveR
сообщение 16.2.2024, 13:28
Сообщение #7


*

Registred
Сообщений: 5
Регистрация: 14.2.2024
Группа: Пользователи
Наличность: 0
Пользователь №: 20.717
Возраст: 37



А для lua в пилоте нет какой-нибудь команды типа end_while? )

А вообще картинка "ОпределитеОУ" на экране пропадает. Разве не перестаёт действовать условие?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 16.2.2024, 14:36
Сообщение #8


****

Apprentice
Сообщений: 283
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8477
Пользователь №: 19.451
Возраст: 32



Если внутри цикла while проверить еще раз наличие картинки ОпределитеОУ, то вы выйдите из цикла.
Код
local arrr, ar = findimage (startX, startY, endX, endY, {opredeliteou}, 2)
while (arrr) do
    local brrr, br = findimage (startX, startY, endX, endY, {ou}, 2)
        while (brrr) do
            kleft (brrr[1][1], brrr[1][2])
            wait (100)
            brrr, br = findimage (startX, startY, endX, endY, {ou}, 2)
        end
    local crrr, cr = findimage (startX, startY, endX, endY, {prodoljit}, 2)
        while (crrr) do
            kleft (crrr[1][1], crrr[1][2])
            wait (100)
            crrr, cr = findimage (startX, startY, endX, endY, {prodoljit}, 2)
        end
    arrr, ar = findimage (startX, startY, endX, endY, {opredeliteou}, 2)
end

Либо использовать break для выхода из любого цикла, но я не знаю ваших условий.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
YuzveR
сообщение 19.2.2024, 13:26
Сообщение #9


*

Registred
Сообщений: 5
Регистрация: 14.2.2024
Группа: Пользователи
Наличность: 0
Пользователь №: 20.717
Возраст: 37



Цитата(cirus @ 8.3.2023, 20:40) *

Для примера 2 скрипта, нужно понимать разницу:
Код
--lua
if true then
    local c = 123  -- локальная переменная, существует только в этом блоке if end
end

log(c)    -- nil переменной не существует

Код
--lua
local c
if true then
    c = 123
end

log(c)



Правильно понимаю, что переменная, присвоенная до начала цикла действует на весь скрипт? А переменная присвоенная уже в цикле - действует до окончания цикла?

И какой скрипт будет корректней для такого типа, и будут ли действовать все три?
Код

local aa = findimage()
while (aa) do
тело_кода
end
local ab = findimage()
while (ab) do
тело_кода
end
local ac = findimage()
while (ac) do
тело_кода
end


или

Код

while (aa) do
local aa = findimage()
тело_кода1
end
while (aa) do
local aa = findimage()
тело_кода2
end
while (aa) do
local aa = findimage()
тело_кода3
end


или

Код

local aa = findimage()
local ab = findimage()
local ac = findimage()
while (aa) do
тело_кода
end
while (ab) do
тело_кода
end
while (ac) do
тело_кода
end
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 19.2.2024, 13:52
Сообщение #10


****

Apprentice
Сообщений: 283
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8477
Пользователь №: 19.451
Возраст: 32



Если объявить локальную переменную внутри цикла, то областью видимости будет только этот цикл.
Первый и третий будет работать. Опять же, в "теле кода" нужно какое-то условие, чтобы выйти из цикла while.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
YuzveR
сообщение 19.2.2024, 15:10
Сообщение #11


*

Registred
Сообщений: 5
Регистрация: 14.2.2024
Группа: Пользователи
Наличность: 0
Пользователь №: 20.717
Возраст: 37



Это понятно. Для варианта №2, если, например, будет:
Код

while (aa) do
local aa = findimage(X) --присвоили, нашли X
kleft (aa[1][1], aa[1][2]) --клик, картинка пропала
aa = findimage(X) -- проверка отсутствия X
end -- цикл закончился
while (aa) do
local aa = findimage(Y) --присвоили, нашли Y
kleft (aa[1][1], aa[1][2]) --клик, картинка пропала
aa = findimage(Y) -- проверка отсутствия Y
end -- цикл закончился
while (aa) do
local aa = findimage(Z) --присвоили, нашли Z
kleft (aa[1][1], aa[1][2]) --клик, картинка пропала
aa = findimage(Z) -- проверка отсутствия Z
end


Я к тому, чтобы не плодить много локалов.
У меня просто перевалило за 200 и скрипт просто написал ошибку что их более 200 )
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 19.2.2024, 15:35
Сообщение #12


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27725
Пользователь №: 11.279



Цитата
Я к тому, чтобы не плодить много локалов.
У меня просто перевалило за 200 и скрипт просто написал ошибку что их более 200 )

Там вроде 63 позволяет. Используйте массивы, либо функциями это решайте. Суть в том, что в одной области видимости не должно быть больше 63.

в вашем случае можно что-то вроде:
Код

local cycle = function(image_name)
    local aa = findimage(image_name)
    while aa do
        kleft(aa[1][1], aa[1][2])
        aa = findimage(image_name)
    end
end

for i = 1, #image_arr do
    cycle(image_arr[i])
end

Что-то типа такого. И он всех их переберет. Если универсальная функция не подходит, т.к. нужно делать индивидуальную обработку каждого случая, то придется делать массив функций. Но я так подозреваю, что проще при необходимости доп параметры в функцию передать.

Сообщение отредактировал DarkMaster - 19.2.2024, 15:35


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 27.4.2024, 14:24
Designed by Nickostyle