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

> Поиск картинки в игре на MEmu
PostByMik
сообщение 25.10.2020, 17:09
Сообщение #1


**

Neophyte
Сообщений: 47
Регистрация: 19.10.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.780
Возраст: 40



Пытаюсь понять логику работы команды findimage, пока попытки успехом не увенчались.

Знающие люди, подскажите, пожалуйста, как работает, какова логика работы данной команды:

1. Можно ли сделать скрин области в игре на эмуляторе MEmu (естественно в формате .bmp 24 бита) и далее её искать в указанной области или это так не работает?
2. если первый пункт не верный, то как надо?

А теперь сама задача, которую я пытаюсь решить.

Есть игра, в игре есть карта, на карте с определенным промежутком времени появляется караван, на который надо кликнуть и провести еще пару манипуляций мышью.

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

Код

--lua
local startX, startY, endX, endY = 0, 0, 830, 465   -- координаты поиска
local path = [["C:\Caravan.bmp"]]                   -- путь к картинке, bmp 24 бита
local arr, a = findimage (startX, startY, endX, endY, {path}, 2, 70, 1, 25)  -- поиск картинки
hint (a)     -- результат поиска, подсказка в правом нижнем углу
if arr then  -- если найдена
    log ("Изображение найдено в координатах X= " .. arr[1][1] .. " Y= " .. arr[1][2])
    kleft (arr[1][1], arr[1][2])  -- кликнули
end


Прикрепленное изображение Это скрин карты в игре с караваном на ней, пытался на нем потренироваться, не находит (
Прикрепленный файл  Caravan.bmp ( 18,36 килобайт ) Кол-во скачиваний: 192
Это скрин самого каравана, который надо найти.

Что я делаю не так, подскажите, пожалуйста.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
DarkMaster
сообщение 3.11.2020, 17:18
Сообщение #2


***********

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



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

Например:
Спойлер
Код

local fi = {}
fi.down_left = function() -- Если зеленый цвет, то кд прошел (НИЖНИЙ ЛЕВЫЙ) ДЛЯ PVP!
    -- если цвет истинный, то возвращаем координаты в таблице
    -- аналогичной по структуре финдимиджу/финдколору
    return color(56, 401) == 51541 and {{56,401}}
end

fi.down_2_left = function() -- Если зеленый цвет, то кд прошел (СНИЗУ ВТОРОЙ РЯД, ЛЕВЫЙ) ДЛЯ PVP!
     return color(109, 318) == 51541 and {{109, 318}}
end

fi.down_2_right = function() -- Если зеленый цвет, то кд прошел (СНИЗУ ВТОРОЙ РЯД, ПРАВЫЙ) ДЛЯ PVP!
     return color(161, 319) == 51541 and {{161, 319}}
end

fi.down_3_right = function() -- Если зеленый цвет, то кд прошел (СНИЗУ ТРЕТИЙ РЯД, ПРАВЫЙ) ДЛЯ PVP!
     return color(161, 234) == 51541 and {{161, 234}}
end

fi.upper = function() -- Если зеленый цвет, то кд прошел (САМЫЙ ВЕРХНИЙ) ДЛЯ PVP!
     return color(51, 139) == 51541 and {{51, 139}}
end

fi.combat_end_1 = function() -- Если зеленый цвет, то бой завершился
     return color(527, 421) == 51541 and color(364, 431) == 51541
end


-- Далее мой комбайн.
-- Обычно я его подгружаю из отдельного файла,
-- чтобы не было помойки.
-- В нем нет move или move_smoth перед кликом,
-- т.к. обычно это не нужно.
-- Если все-таки в этом есть реальная необходимость,
-- могу подправить.
-- Данный комбайн имеет функцию проверки на
-- успешность кликов и будет повторять попытки
-- пока success_func не вернет истину или
-- не выйдет допустимое время.
-- Так же обращаю ваше внимание,
-- что для кликов используется функция click.
-- Этой функции в пилоте не существует и я ее
-- задаю каждый раз в ручную для того, чтобы
-- в случае необходимости изменить тип кликов
-- не нужно было перелопачивать весь скрипт и везде
-- править left на kleft или еще какие-нибудь варианты.
local click = kleft -- теперь у нас click тоже саме, что и kleft
-- а можно сделать что-то свое.
-- в частности у вас использует move_smoth и мы можем
-- включить данные перемещения в вызов каждого клика:
click = function(x,y)
    move_smoth(x,y,5,5,5,5)
    wait(250)
    kleft(x,y,5,5,5,5)
end

-- Очень настоятельно рекомендую
-- делать проверки на успех всех кликов.
-- У вас нет проверок на успех клика,
-- возможно они вам просто не нужны,
-- тем не менее у меня они требуются.
-- создаем функцию - заглушку, которая
-- будет всегда возвращать истину:
local true_func = function()
    return true
end

-- Сообственно описание параметров комбайна.
-- Синтаксис:
--function(
--    click_x, click_y, success_func, click_timeout,
--    delay, first_delay, blink, limit,
--    offset_x, offset_y, override_x, override_y)

-- Функция нажимает в координаты click_x, click_y
-- click_x, click_y могут быть заданы сделедующими способами:
-- 1)
-- click_x - функция возвращающая массив кооринат (findimage/findcolor)
-- click_y - Комментарий при фейле поиска либо
-- НЕ указывается. Даже nil, параметр пропускается.
-- При передаче функции - она будет вызываться каждый раз
-- перед попыткой кликнуть, чтобы избежать клика в изменившийся интерфейс.
-- 2)
-- click_x - массив кооринат (findimage/findcolor)
-- click_y - НЕ указывается. Даже nil, параметр пропускается.
-- 3)
-- click_x - x координата
-- click_y - y координата

-- success_func - функция проверки успеха.
-- Пока не вернет успех будут попытки кликов.
-- Так же может быть задана массивом функций.
-- Время попыток может быть ограничено параметром limit.

-- click_timeout - таймер для повторной попытки клика.
-- Не влияет на проверки успеха результата.
-- Необязательный параметр. Значение по умолчанию 2сек.

-- delay - задержка в мс перед проверкой успеха.
-- необязательный параметр. Значение по умолчанию 100мс.

-- first_delay - задержка после _первого_ клика перед началом
-- проверок на успех, повторных кликов.
-- Необязательный параметр. Значение по умлчанию равно параметру delay * 5.

-- blink - задержка в мс перед повторной проверкой на успешность.
-- исключает случаи выхватывания изображения из недогрузившегося окна.
-- для выключения проверки используется nil.
-- необязательный параметр. Значение по умолчанию nil.

-- limit - ограничение времени (сек) на поиск.
-- для одноразвого прогона использовать 0.
-- nil - бесконечный поиск.
-- необязательный параметр. Значение по умолчанию nil(бесконечно).

-- offset_x, offset_y - смещения координат клика используется,
-- если click_x задан функцией.
-- Необязательный параметр. По умолчанию nil.

-- override_x, override_y - перезапись координат клика используется,
-- если click_x задан функцией.
-- Если задан override, то offset игнорируется.
-- Необязательный параметр. По умолчанию nil.

local open_with_check = function(
    click_x, click_y, success_func, click_timeout,
    delay, first_delay, blink, limit,
    offset_x, offset_y, override_x, override_y)
    local x,y

    if  type(click_x) == "function" then -- координаты клика заданы функцией
        -- смещаем параметры на 1 позицию вправо.
        if  type(click_y) == "function" or type(click_y) == "table" then
            override_y = override_x
            override_x = offset_y
            offset_y = offset_x
            offset_x = limit
            limit = blink
            blink = first_delay
            first_delay = delay or (click_timeout or 100) * 5
            delay = click_timeout or 100
            click_timeout = success_func or 2
            success_func = type(click_y)=="function" and {click_y} or click_y
        end
        -- click_y содержит комментарий к функции
        click_timeout = click_timeout or 2
        delay = delay or 100
        first_delay = first_delay or delay
        success_func = type(success_func)=="function" and {success_func} or success_func

    elseif type(click_x) == "table" then -- координата клика задана массивом
        -- смещаем параметры на 1 позицию вправо.
        override_y = override_x
        override_x = offset_y
        offset_y = offset_x
        offset_x = limit
        limit = blink
        blink = first_delay
        first_delay = delay or (click_timeout or 100) * 5
        delay = click_timeout or 100
        click_timeout = success_func or 2
        success_func = type(click_y)=="function" and {click_y} or click_y
        y = click_x[1][2]
        x = click_x[1][1]

    else  -- координата клика задана двумя переменными
        click_timeout = click_timeout or 2
        delay = delay or 100
        first_delay = first_delay or delay * 5
        success_func = type(success_func)=="function" and {success_func} or success_func
        x = click_x
        y = click_y
    end

    --[[log(tostring(click_x), tostring(click_y), tostring(success_func), tostring(click_timeout),
    "\r\n",
    delay, first_delay, blink, limit,
    "\r\n",
    offset_x, offset_y, override_x, override_y)   ]]


    local next_click_timeout = 0
    local limit_timeout = limit and os.clock() + limit
    local first_run = true
    local success = false
    repeat
        local clock = os.clock()
        if  type(click_x) == "function" then
            local result = click_x()
            if  result then
                x = result[1][1]
                y = result[1][2]
                if  next_click_timeout < clock then
                    if  override_x then
                        x = override_x
                        y = override_y
                    elseif offset_x then
                        x = x + offset_x
                        y = y + offset_y
                    end
                    click(x,y)
                    next_click_timeout = clock + click_timeout
                end
            else
                if  type(click_y) == "string" then
                    log(click_y)
                end
            end
        else
            if  next_click_timeout < clock then
                click(x,y)
                next_click_timeout = clock + click_timeout
            end
        end

        if  first_run then
            first_run = false
            wait(first_delay)
        else
            wait(delay)
        end


        for i = 1, #success_func do
            success = success_func[i]()
            if success then
                break
            end
        end
    until success or (limit_timeout and limit_timeout < os.clock())

    --log("check: " .. tostring(success and true or false))
    return success and true or false
end


-- соответственно ваш код при использовании данной функции принимает следуещий вид:


repeat -- ДЛЯ PVP!
    open_with_check(fi.down_left,     true_func, 0, 0, nil, 0)
    open_with_check(fi.down_2_left,   true_func, 0, 0, nil, 0)
    open_with_check(fi.down_2_right,  true_func, 0, 0, nil, 0)
    open_with_check(fi.down_3_right,  true_func, 0, 0, nil, 0)
    open_with_check(fi.upper,         true_func, 0, 0, nil, 0)
until fi.combat_end_1() -- Если зеленый цвет, то бой завершился




В самом примитивном примере это будет выглять, как:
Код

local my_func = function(i)
    log("мы получилив функцию значение "..i..", прилепили к нему текст вывели в лог.")
end

for i = 1, 5 do
    my_func(i)
end



Сообщение отредактировал DarkMaster - 3.11.2020, 17:26


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

Сообщений в этой теме
PostByMik   Поиск картинки в игре на MEmu   25.10.2020, 17:09
cirus   Для чего? getimage или printscreen. Часто изображ...   25.10.2020, 17:37
PostByMik   Я во всем этом новичек, пытаюсь понять сам, но пре...   25.10.2020, 19:28
PostByMik   Дайте, пожалуйста, адекватный пример. Со всеми тре...   25.10.2020, 20:11
cirus   getimage неправильно работает при работе с экраном...   25.10.2020, 20:17
PostByMik   Так нашел и сохранил сразу. Спасибо огромное...   25.10.2020, 20:32
cirus   RE: Поиск картинки в игре на MEmu   25.10.2020, 20:41
PostByMik   Искренне благодарен, с этим файлом работает, но ...   25.10.2020, 20:54
cirus   Открыть искомую картинку в Paint, выбрать каранда...   25.10.2020, 21:08
PostByMik   Спасибо за ответ! Я понимаю, что Вам с высоты ...   25.10.2020, 21:14
Fors1k   Осталось понять про пиксель. Зачем его красить? И...   26.10.2020, 0:05
cirus   --lua local ffi = require("ffi"...   25.10.2020, 21:51
PostByMik   Спасибо огромное за пояснения! Код буду перев...   25.10.2020, 21:52
PostByMik   Подскажите, пожалуйста, как решить проблему. l...   26.10.2020, 19:28
DarkMaster   Я бы рекомендовал: 1) вырезать правый нижний угол ...   26.10.2020, 19:44
cirus   Можно удалить из массива лишние картинки. --lua fu...   27.10.2020, 4:00
PostByMik   Ох! Спасибо! А можно пояснить что тут к ч...   27.10.2020, 8:20
cirus   Кстати, искать картинки можно и такого вида: Левы...   27.10.2020, 11:20
dimas01   На эту же тему вопрос. Надеюсь автор темы не проти...   27.10.2020, 13:23
cirus   Создавайте отдельную. Нужен пилот версии 2.41, а...   27.10.2020, 13:29
PostByMik   Всем спасибо за помощь! В итоге, для меня лег...   27.10.2020, 17:47
PostByMik   Может кто знает как заставить данный код нажимать ...   2.11.2020, 21:30
DarkMaster   kleft (arr[1][1] + 10, arr...   2.11.2020, 21:54
cirus   kleft (arr[1][1] + math.floor...   3.11.2020, 1:37
DarkMaster   тогда уж: kleft (math.floor((arr[1...   3.11.2020, 2:21
PostByMik   Ох! Спасибо огромное! Еще хотел пару вопр...   3.11.2020, 9:09
cirus   Например какие? Не можно, а нужно. --lua log ...   3.11.2020, 11:02
PostByMik   Простите, но я не очень понял как именно это испол...   3.11.2020, 14:49
Cockney   Есть у меня комбайн под подобные задачи. Работа р...   4.11.2020, 13:44
PostByMik   Апд. Как я понял, при помощи function можно созда...   3.11.2020, 20:07
PostByMik   Апд. Проверил, работает! )   3.11.2020, 20:30
DarkMaster   Завтра утром ты не вспомнишь, что это за набор ма...   3.11.2020, 20:52
PostByMik   Да понятное дело, что твой код крутой, но я же до...   3.11.2020, 21:21
PostByMik   вот где почитать про все эти функции, ну кроме кл...   3.11.2020, 21:31
DarkMaster   это не функции. Это имена параметров функции. Ну ...   3.11.2020, 21:50
PostByMik   Да, написал выше, что не углядел сразу) Спасибо...   3.11.2020, 21:59
PostByMik   Так и не смог понять как у Вас реализован функцио...   4.11.2020, 11:21
DarkMaster   Были еще до этого комбайна - работает. Тут правда...   4.11.2020, 17:52
DarkMaster   В конкретно этом случае - никак. Это просто заглу...   4.11.2020, 20:42
cirus   А что мешает проверить изменения в области №2?   4.11.2020, 20:55
DarkMaster   Необходимость произвести 2 клика прежде чем будет...   4.11.2020, 21:32
PostByMik   Действительно, есть) Если отойти от вашего комба...   5.11.2020, 11:21
DarkMaster   что-то вроде этого. внутри тела цикла клики соотве...   5.11.2020, 18:33
PostByMik   Пытаюсь понять всё описанное в Вашем комбайне. В...   8.11.2020, 15:45
DarkMaster   В нормальном виде это каждый раз новая функция по...   8.11.2020, 20:02
PostByMik   Ни где не смог найти информацию, казалось бы, кото...   9.11.2020, 15:38
Fors1k   что означают фигурные скобки после знака "=...   9.11.2020, 16:45
PostByMik   Ох! Спасибо Огромное! Теперь стало понятно...   9.11.2020, 17:07
PostByMik   Всё в туже тему, про работу по таймеру. Написал к...   9.11.2020, 18:27
DarkMaster   Так делать не стоит - малейший лаг и проскочит. ...   9.11.2020, 20:19
DarkMaster   Да простят меня за дотошность, но в рамках луа эт...   9.11.2020, 20:35
Cockney   Доступ к элементу в связном списке в среднем зани...   9.11.2020, 21:34
PostByMik   А если у меня вместо портянка на 100+ строк, то м...   9.11.2020, 22:20
PostByMik   Суть в в следующем. У меня есть (назовем их частям...   9.11.2020, 22:31
DarkMaster   Тыщ на 100 элементов создай список и сравни с мас...   9.11.2020, 22:48
Cockney   Тыщ на 100 элементов создай список и сравни с мас...   9.11.2020, 23:10
DarkMaster   Опечатался. O(1) конечно же, а не O(N). Имхо это...   9.11.2020, 23:42
Cockney   Смотря, что делать. Может стать и существенным н...   10.11.2020, 14:48
PostByMik   Если не учитывать, что я написал, что нужно после...   10.11.2020, 13:13
PostByMik   Или раз в неделю ручками менять данные. Но хотело...   10.11.2020, 14:16
cirus   Os.date   10.11.2020, 14:27
DarkMaster   Вставка на си. Едва ли это так плохо. В том же си...   10.11.2020, 15:43
Cockney   Вставка на си. Едва ли это так плохо. Точно ? ...   10.11.2020, 17:11
DarkMaster   Беспонятия =) Сообщил для информации. Тут есть и...   10.11.2020, 17:16
Cockney   Тут есть и оборотная сторона. Пишем не на луа - д...   10.11.2020, 17:52


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

 

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