Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

UoKit.com Форумы _ UO Pilot _ Findimage (lua)

Автор: YuzveR 14.2.2024, 13:22

Доброго времени суток.
Вопрос по 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 может возникнуть в любой момент.

Автор: DarkMaster 14.2.2024, 18:09

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

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

end

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

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

Автор: DarkMaster 14.2.2024, 18:59

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

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

Автор: YuzveR 16.2.2024, 12: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


Находит на экране "ОпределитеОУ" - жмёт "ОУ", затем "Продолжить".
Следом появляется "ОпределитеОД", но всё равно жмёт "ОУ", вместо "ОД".
Где я не закрыл условие?

Автор: Madeus 16.2.2024, 13:07

Вы заходите в цикл while (arrr) do и выхода из него нет он будет вечно крутить свои условия.

Автор: DarkMaster 16.2.2024, 13:17

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

Автор: YuzveR 16.2.2024, 13:28

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

А вообще картинка "ОпределитеОУ" на экране пропадает. Разве не перестаёт действовать условие?

Автор: Madeus 16.2.2024, 14:36

Если внутри цикла 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 для выхода из любого цикла, но я не знаю ваших условий.

Автор: YuzveR 19.2.2024, 13:26

Цитата(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

Автор: Madeus 19.2.2024, 13:52

Если объявить локальную переменную внутри цикла, то областью видимости будет только этот цикл.
Первый и третий будет работать. Опять же, в "теле кода" нужно какое-то условие, чтобы выйти из цикла while.

Автор: YuzveR 19.2.2024, 15:10

Это понятно. Для варианта №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 )

Автор: DarkMaster 19.2.2024, 15:35

Цитата
Я к тому, чтобы не плодить много локалов.
У меня просто перевалило за 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

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

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)